Back to the blog

Profit12 Sep 20263 min readBy KamraiDee

Is your busy shop truly profitable?

Understanding the true nature of sales vs profitability

Cash drawer with receipts

The line did not stop. The stove did not rest. The chat kept pinging. At eleven you count the drawer and it is thin. You were not lazy. You were busy. Busy is not the same as leftover baht.

A Thai shop can sell all day and still send almost nothing home. The ticket machine is loud. The cash is quiet. That gap has a name: you tracked ยอดขาย and not กำไร. Sales is the money that passed through the shop. Profit is the money that stayed.

This piece is the simple version of that gap. How a packed day changes what you should sell. How it changes the price on the board. How it changes what is left after the apps, the bags, the waste, and the van. Then how to price one product today with the free tools — no signup.

In this article

  1. Sales is not leftover baht
  2. Why a packed shop feels rich
  3. How busyness changes the product
  4. How busyness changes the price
  5. How busyness changes leftover profit
  6. Three sample calculations
  7. How to price it today
  8. Mistakes that keep the drawer empty
  9. Questions

Sales is not leftover baht

Write this on the wall if you need to:

Sales = what the customer paid. Cost = what it took to make and deliver that sale. Leftover = sales minus every real cost. Busy only measures the first line.

Three numbers get mixed in one drawer:

  • Gross profit — sell price minus the product cost. Before rent, before apps, before your own hours.
  • Net profit — what is left after the shop’s bills.
  • Cash in the drawer — what you can actually hold tonight. Stock you already paid for, platform payouts that arrive next week, and money you lent the household all sit in different rooms.

A day can look fat on the POS and still be thin in the hand. That is not a personality problem. It is a costing problem.

KamraiDee’s job is the stall version of that sentence: รู้ต้นทุนจริง เห็นกำไรจริง เก็บเงินไว้กับร้านได้มากกว่าเดิม. Know the real cost. See the real leftover. Keep more of it. Not a lecture on “accounting.” A number you can use before the next rush.

Why a packed shop feels rich — and why the feeling lies

Busy is a good feeling. People are choosing you. The wok is loud. The live chat is scrolling. Your identity as an owner is “I work hard.” Hard work deserves a true number. The feeling does not give you one.

Busy lies in five quiet ways:

  1. Volume hides a thin slice. Two hundred plates at 4 baht leftover is 800 baht. Fifty plates at 25 baht leftover is 1,250. The packed shop can lose to the calmer one.
  2. The best-seller can be the leak. What moves is not always what pays. Customers train you to keep the cheap hero on the board.
  3. Apps count GMV, not your pocket. A 100-baht ticket on GrabFood / LINE MAN / ShopeeFood is not 100 baht in the shop. Standard disclosed GP for many new merchants in 2026 sits around 30% before VAT 7% on that GP — about 32.1 baht gone from a 100-baht ticket before food, box, or bag. Promo GP of 9% or 12% is a window, not a lifestyle.
  4. Hidden lines never enter the price. Shipping on the sack, the cup and lid, gas, ice melt, testers, “แถม,” family hours, the extra ride to restock. If it is not on the card, it comes out of the drawer later.
  5. Cash timing is not profit. You pay the market in the morning. The platform pays next week. The packed day can be a loan you made to customers and apps.

None of this means “stop being busy.” It means stop using busy as proof that the price is right.

How busyness changes the product

When the shop is packed, you stop choosing products. The queue chooses them for you. You restock what ran out. You prep what “always sells.” You add a new SKU because a customer asked once. The board gets longer. The drawer does not.

1. The hero product can be a volunteer

A volunteer product works for the customer and donates your time. Pad krapow at a street price that only covers pork and rice. A 55-baht latte that forgets the cup, lid, and two minutes of the machine. A 299-baht live SKU after fees, ads, and a free gift.

If you do not cost that hero, you will keep making more of it. Busyness then becomes a factory for the wrong thing.

2. Nested things hide inside the plate

A Hawaiian pizza is not one recipe. The base is a recipe. The sauce is a recipe. The shop that costs only “ham + pineapple + cheese” underprices the dough hours and the sauce pot. Same for curry paste you cook on Sunday, syrup you batch on Monday, soap base you melt once a week.

Cost the inner recipe once. Pull it into the plate. That is the whole point of A Hawaiian is not one recipe.

3. Shipping sits on the pack, not in “misc”

A 25 kg sack at 380 baht plus a 50-baht van is a 430-baht sack. Every gram of pizza flour should carry 430, not 380. The van is not rent. Rent does not go into the dough. The flour does. So does the van that brought it. That is Shipping is food cost.

Do the pack on the free Stock unit cost tool. Pack price + shipping. Then one gram, millilitre, or stem.

4. Waste is a product you paid for and threw

Trim, burnt toast, melted ice, wilted herbs, a live-sale return, the last two scoops that do not fill a cup. Waste is not “bad luck.” It is units you bought and did not sell. A packed shop creates more waste because speed makes sloppy portions. If the recipe card assumes perfect yield, the real leftover is smaller than the card.

5. Long menus steal attention from paying SKUs

Every extra item needs stock, prep, a box size, a photo, and a decision at the pass. Complexity is a cost. A packed shop with forty items often has eight that carry the month and thirty-two that keep you standing. The product fix is not “add more.” It is know the eight.

What to do to the product list

  • Cost the best-seller first, not the new idea.
  • Split dine-in and delivery versions if the box and the GP change the math.
  • Stop restocking a SKU that only looks busy.
  • Keep the nested parts (base, sauce, syrup, paste) as their own costed recipes.

You do not need the whole catalogue today. One menu. One SKU. The product that moved the most this week is the one that can lie the hardest.

How busyness changes the price

Packed shops freeze their prices. The logic sounds kind: “People already come. Don’t scare them.” Kindness that ignores cost is a discount you did not print.

Feeling-based prices

Most Thai boards are set by one of these:

  • the shop next door
  • the price last year
  • “looks fair”
  • “add a bit on cost”
  • what the live chat will accept at 9 p.m.

None of those ask what the product costs after the van, the cup, and the app. A busy night then trains you that the old number “works,” because people still pay it. People paying it only proves demand. It does not prove leftover.

Markup is not margin

You bought something for 40 baht. You “added 50%.” You sell at 60. That is a 50% markup and a 33% margin. Same 20 baht. Different story. If you wanted to keep 50% of the selling price, the tag is 80, not 60.

KamraiDee prices from margin — profit ÷ sell — not markup. The public tool uses:

Sell = cost ÷ (1 − margin)

Cap 90%. One decimal is fine (54.5). Site default in the product is a 60% margin: an 80-baht cost wants a 200-baht sell if you mean to keep 120. Read the short version in Margin, not markup. Then run your number in Price from margin.

The delivery price is a different product

A 65-baht krapow on the table is not a 65-baht krapow in a box on a motorbike. The second one carries GP, VAT on GP, the box, the bag, the extra rice that spills, and sometimes a spoon. If you copy the dine-in price onto the app, you chose to work for the platform.

A clean way to think: price the plate from real cost and margin first. Then price the delivery version as that plate plus pack plus the cut. Do not “see how it goes.” The app will not send a letter when your margin dies.

A few baht is a decision, not a personality

Five baht on a drink that sells 80 cups a day is 400 baht a day before you touch anything else. Ten baht on a 60-baht plate that was never covering the box is the difference between a volunteer and a product. You do not need a new brand. You need a tag that matches the card.

What to do to the price

  • Rebuild one sell price from landed cost and a margin you chose on purpose.
  • Give the delivery SKU its own price if the cut and the box are real.
  • Stop using “add 50%” as if it were “keep 50%.”
  • Check leftover baht on the same SKU in Margin and profit.

How busyness changes leftover profit

Profit is what survives the day. Busyness attacks it from the sides while you watch the front.

Contribution is the only plate math that matters at speed

Contribution on one unit = sell price − extra costs of that unit (ingredients, pack, portion of GP, waste you accept on that item).

Rent is there whether you sell the plate or not. The pork is not. If contribution is 3 baht, a packed shop is a treadmill. If contribution is 22 baht, a slower shop can beat you and go home earlier.

That is why “we were slammed” is not a profit report.

Prime cost sits behind the hero

Food cost alone is not the story. Food plus the people who cooked it is closer. Thai independents often talk food cost around 28–35% of sales for a restaurant, 18–25% for drinks. Labour on top of that. Rules of thumb for prime cost (food + labour) often live near 55–65% of sales if the shop is to have room for rent, utilities, and leftover. Treat those bands as a compass, not a law. Your shop is not an average.

A packed kitchen with unpaid family hours looks cheaper than it is. Those hours are still a cost. You can choose not to pay yourself this month. You cannot pretend the hour was free when you set the price for next month.

Platform mix can erase a good kitchen

Sample shape, not a promise about your contract. Customer pays 100 on the app. GP 30% + VAT 7% on the GP ≈ 32.10 leaves 67.90 before food and pack. If the plate cost 38 and the box 6, contribution is about 24 — before gas, rent share, and the extra time at the pass. Copy the 55-baht dine-in tag onto that ticket and the leftover can drop to pocket change. Busy app tickets are still tickets. They are not automatically profitable tickets.

The drawer is a timing machine

You can be “in profit” on paper and empty on Saturday night because:

  • you restocked for Sunday
  • the platform batch-pays later
  • you paid the landlord in cash today
  • the household took 500 from the same tin

Separate the three questions: Did this SKU leave baht? Did this week leave baht? Is there cash in the tin tonight? Busy only answers “did people come.”

Three sample calculations

These are sample calculations, not your shop and not a claim about what KamraiDee users “save.” Change the inputs. Keep the method.

Sample A — packed rice shop, one hero plate

Pad krapow + egg. Dine-in 60 baht. You sell 120 plates between 10.30 and 13.30. The shop feels rich.

Line Baht
Pork, holy basil, garlic, chilli, sauce, oil 18.00
Rice (after sack + van) 4.50
Egg 4.00
Gas + a splash of utilities on this plate 2.00
Plate cost before your time 28.50
Sell 60.00
Gross leftover on the plate 31.50

31.50 looks fine — until the same plate goes on the app at 60 with a box.

Same plate on a 30% GP ticket (VAT on GP included ≈ 32.1%) Baht
Customer pays 60.00
Platform cut 19.26
Shop receives 40.74
Plate cost 28.50
Box + bag 6.00
Leftover before rent and your hours 6.24

You just worked a lunch rush for 6 baht a plate on the app version. 80 app plates is about 500 baht leftover — before the landlord. The packed shop was real. The drawer story was the 6 baht.

A delivery price built from the same cost with a 60% margin on shop-received money is a different tag. Or you raise the app price so that after 32.1% you still hold a margin you chose. Run the sell number in Price from margin once the plate cost is honest.

Sample B — café, 55-baht iced latte

Line Baht
Espresso (beans after shipping) 7.50
Milk 8.00
Ice + syrup splash 2.00
Cup, lid, straw, sleeve 4.50
Drink cost before time and rent 22.00
Sell 55.00
Gross leftover 33.00

33 baht looks like a healthy drink. Now put 90 seconds of the barista and a share of rent into the cup. The leftover shrinks. If food-and-pack cost is already 22 on a 55 sell, ingredient share is 40% — above the 18–25% band many drink shops aim at. The packed bar can still be a cheap factory. Either the tag moves, the milk pour tightens, or the “free extra shot” stops being free.

Build the cup in Cost calculator: pack + shipping, how much you use, your minutes, yield. Then set the sell from margin.

Sample C — live seller, 299-baht SKU

Line Baht
Landed unit cost (goods + inbound shipping share) 95.00
Mailer, tape, card, “แถม” sachet 18.00
Platform fees + transaction (sample 15% on 299) 44.85
Ads on this SKU (sample) 12.00
Expected return share (sample 4% of sell) 11.96
True cost stack 181.81
Sell 299.00
Leftover before your live hours 117.19

117 baht is still a business — until the live drops to 199 “to hit the goal,” the sachet becomes a full-size gift, and ads double. The packed live is a crowd. The drawer follows the stack, not the viewer count.

Cost the unit with Stock unit cost. Check leftover with Margin and profit. Set the floor before you go live, not after the second discount.

How to price it today

Do not rebuild the shop tonight. Price one thing that already moves.

Step 1 — Landed cost of what you buy

Open Stock unit cost. Pack price + shipping on that pack. See one gram, millilitre, or stem. If the supplier sometimes delivers free, shipping is 0. When they charge, type it. Nothing is saved. No signup.

Step 2 — Cost the thing you sell

Open Cost calculator. How much of each pack you use, your minutes, yield. If a base or sauce is reused, cost that inner recipe first — same idea as nested recipes. For many trays of the same thing, Many batches keeps labour still when the clock does not grow.

Step 3 — Choose a margin on purpose

Open Price from margin. Sell = cost ÷ (1 − margin). That is what you keep as a share of the tag, not what you added on top of cost. If you have been “adding 50%,” read Margin, not markup before you print the next sticker.

Step 4 — See leftover on that one sell

Open Margin and profit. Cost and sell. Margin is profit ÷ sell. Cap 90%. One decimal. This is the “is the drawer allowed to be this thin?” check.

Step 5 — Price the extra jobs separately

  • A cake across town is not “free if they bought the cake.” Use Delivery fee for kilometres, fuel, your time, and a little wear.
  • A weekend stall is not “we’ll make it up in volume.” Use Stall planner for what you make, the stall fee, and how much you actually sell through.

Step 6 — Change one tag or one SKU

Raise a few baht, drop the volunteer, pack a smaller cup, or give the app version its own price. One move. Today. Then look at the drawer on a day that used the new number.

When you want the same math on every SKU without retyping, sign up to the book. The tools stay free either way. The upgrade is for the habit of seeing leftover before the rush, not for owning more screens.

Mistakes that keep the drawer empty

Using the neighbour’s board as a cost card

They may be volunteering too. Or their rent is older. Or their mother is the unpaid prep cook. Copying a tag copies their leak if you do not copy their cost.

Treating promo GP as normal GP

9% and 12% windows exist. 30% plus VAT on GP is the number many shops return to. Price the forever rate. Treat the window as extra leftover, not as the floor.

Leaving shipping in “overhead”

Overhead does not portion itself onto a gram of flour. The sack does. Put the van on the pack. See Shipping is food cost.

Counting owner hours as zero forever

You can choose a season where you do not pay yourself. Do not build the permanent tag on that season. Minutes belong on the recipe card so the price still works when you hire a helper — or when you want a Sunday.

Discounting the live before the floor is set

The crowd will always take 199. The stack does not care about the crowd. Floor first. Banter second.

Adding SKUs to fix a thin drawer

More items make more busy. They do not automatically make more leftover. Cost the hero. Then decide.

Letting the POS be the only report

POS knows tickets. It often does not know landed grams, nested sauce, or the box on the app ticket. Busy on a POS is a traffic report.

A packed shop is allowed to keep money

You do not have to choose between “kind prices” and “a living.” You have to choose a number that tells the truth, then a tag that still leaves baht after the truth.

The identity shift is small and sharp: you are not the owner who survived another slam. You are the owner who knows which slam paid.

Start with the SKU that embarrassed the drawer this week. Pack + shipping. Recipe. Margin. Leftover. One tag.

Stock unit cost · Cost calculator · Price from margin · Margin and profit · Sign up

Questions

Is a busy shop a good shop?

Busy means demand. Good means leftover baht after real cost. You want both. Busy alone is a queue. It is not a report.

What is the difference between sales and profit?

Sales is what the customer paid. Profit is what stayed after the product, the pack, the cut, the waste, and the bills you assign to that sale. A high-sales day can still empty the tin.

Why is my drawer empty after a good day?

Usually one of these: the hero SKU was thin; the app cut was not in the tag; shipping and cups never entered the card; you restocked with today’s cash; or household and shop share one tin. Cost one SKU and you will see which story is yours.

Should I raise prices if people already come?

If the card says the tag is a volunteer, yes — a few baht, or a separate app price, or a smaller portion. Demand is the reason a small move can work. It is not a reason to keep donating.

How do I price a product so the drawer is not empty?

Landed cost of the pack → cost of the recipe including what you use and your minutes → sell from margin (sell = cost ÷ (1 − margin)) → check leftover. Free path: ingredient, recipe, pricing, profit.

What margin should I use?

KamraiDee’s tools use margin, not markup, and cap at 90%. The product default is 60% margin. Your shop may need a different number once rent, labour, and channel mix are honest. Pick it on purpose. Do not inherit “add 50%.”

Do I need to cost every item before I change anything?

No. Cost the one that sells the most, or the one you already suspect. Tiny first step. Today.

Is this tax or accounting advice?

No. This is decision math for the owner at the stall. File tax with your accountant. KamraiDee is here so you know if the plate, the cup, or the SKU left money — not so you replace a licensed filing tool.

Sample calculations only. Platform GP, VAT on GP, and fee stacks change by contract and campaign. Check your merchant app for the rate you actually pay. KamraiDee does not invent savings, plan prices, or testimonials.

BETA 1.0

Free to join. Same price for every shop type.

See pricing

Beta 1.0. Free to join.

Sign up free