Workflow Live · ShopX Buildathon 2026
Can we scale this campaign?
The complete guide: build the check that tells you whether your next promo makes money or breaks your business.
A ShopX Workflow Live handout. Every number, every click, every formula. Nothing hidden.
- 13 Nov, mid-campaign
- 23.5% (target 30%)
- 7 Sep (checked 12 Sep)
- 500 units, landing 26 Nov
I am going to walk you through how we built this, including the decisions we got wrong first, because that is the useful part.
We build supply chain systems for DTC brands. I have done this for 17 years, enterprise first, then ecommerce. And when ShopX asked us to show a workflow, I picked the one question nobody in the marketing stack ever answers.
Not "will this campaign sell?" Every tool you own answers that.
The question is: if it works, can you actually deliver it, and will you still make money?
Here is what that looks like in practice. You plan 11.11. Creative is ready, the offer is set, ads are loaded. Three things can happen and all three are expensive.
Sell out on day three
You sell out on day three, and the rest of your ad budget buys refunds and angry DMs.
The discount beats the margin
Or the discount was deeper than your margin, so revenue goes up and profit goes down, and nobody notices until the quarter closes.
The restock lands too late
Or your supplier needs 60 days, you order in week two, and the restock lands after the campaign is over.
That last one is the worst because it feels like you did the right thing. You ordered. The money left your account. The stock just arrives too late to sell.
This is not a marketing problem. It is an operations question, and most founders have nobody to ask. That is not their fault. Nobody ever showed them how this works.
So we built the check. It runs on our own brand, Vivere Journey, pulling live from Shopify. Below is the whole thing in two tiers. Tier 1 is a spreadsheet you can build this afternoon with no tools and no code. Tier 2 is how we turned that spreadsheet into an app. Steal whichever one you need.
What it does
A seller enters numbers they already have. The tool returns one word.
Then it tells you why, which SKUs caused it, and what to change.
Founders do not want a dashboard. They want to know whether to press go.
- 1margin negativeHOLD
- 2stockout AND too late to reorderHOLD
- 3stockout OR margin below targetADJUST
- 4otherwiseGO
First match wins. Read top to bottom and stop at the first line that is true.
The five checks behind the word
Every check is arithmetic. None of them is clever. The value is in running all five against the same campaign, at the same time, before you commit money.
Will you run out during the campaign?
Stock at campaign start, divided by campaign pace, gives you a stockout date. If it lands inside the campaign, you have a problem.
Does the discount kill the margin?
Price after discount, minus landed cost, minus what it costs to ship one order. If that is under your target, the campaign makes revenue and loses money.
Is it already too late to reorder?
Campaign start minus supplier lead time minus a buffer. If that date has passed, no amount of money fixes the stock problem.
Can you afford the reorder?
Units short, rounded up to your supplier's minimum order. This number is always bigger than you expect.
Is stock arriving, but arriving late?
A PO landing after the campaign ends does not help you sell during it. But you need to see it, because the fix might be air freight.
For our 32oz bottle, in the 11.11 campaign: stock runs out on 13 November, margin at 30% off is 23.5%, the order-by date was 7 September and we checked on the 12th, and there are 500 units on a boat arriving 26 November. Nine days after the campaign ends.
Verdict: HOLD. We had no idea until we ran the check.
The five days that decided the campaign.
Tier 1: Build it in a spreadsheet, nothing hidden
You need Google Sheets or Excel. Nothing else. The whole build is about an hour the first time, and twenty minutes every campaign after that.
What you will end up with
One sheet. A small settings block at the top with your campaign details. Then one row per SKU, with your inputs on the left and the five checks calculated on the right. A verdict per SKU, and one verdict for the whole campaign at the top.
Start with your top ten sellers. Not everything. Ten rows is enough to find out whether the campaign works, and those ten are the ones that will actually hurt you.
Step 1: Get the data
Every number lives somewhere already. Here is exactly where, and what you will find when you get there.
Shopify
On hand · weekly sales · price · SKU
Supplier
Lead time · MOQ · unit cost
Freight forwarder
Freight per unit
Customs broker
Duty per unit
3PL
Fulfilment cost per order
Marketing plan
Dates · uplift · discount
One sheet
Columns A–J, one row per SKU
Plus your open purchase orders: on order quantity and the date it really lands.
From Shopify · Units on hand. In your Shopify admin, go to Products, then Inventory. That page shows your available quantity per variant. If you have more than one location, pick the one that ships your online orders, or add them together.
Faster for many SKUs: Products, then Export, then choose CSV. The column you want is called Variant Inventory Qty.
Sales per week. This is the number people get wrong most often, so slow down here.
Go to Analytics, then Reports, and find the report for sales by product variant or by SKU. Set the date range to the last 8 weeks. Read the units sold column, not the revenue column. Divide by 8.
That is your baseline weekly rate.
Two traps. If one of those 8 weeks had a promo, your baseline is inflated and every calculation after it will be too optimistic. Either skip that week and divide by 7, or note it and accept the error. And if a SKU launched 3 weeks ago, do not divide by 8. Divide by 3.
Selling price. Products, open the product, read the variant price. Or the Variant Price column in the same CSV export.
SKU code. Variant SKU in the export. You will need this to match rows across your other sources, so copy it exactly.
From your supplier · Lead time. Days from placing an order to the goods being on your shelf. Not production time. Not "ex-factory". Door to door, including the boat and customs.
It is on your last quote, your proforma invoice, or your last PO. If it is not written down anywhere, email your supplier today: "What is your current lead time, order to delivery, for [SKU]?" You will have it tomorrow.
Be honest with yourself here. If the last order took 68 days and the quote said 45, use 68.
MOQ. Minimum order quantity. Same documents. Same email if you do not have it.
Unit cost. What you pay per unit, on the invoice.
From your freight forwarder and customs broker · Landed cost. Unit cost is not what a unit costs you. Landed cost is unit cost plus freight per unit plus duty per unit.
The rough version is fine to start. Take your last shipment. Total freight bill divided by units shipped gives freight per unit. Duty rate times unit cost gives duty per unit. Add all three.
For our bottle: $7.00 unit cost, about $2.00 freight, roughly $0.50 duty. Landed cost $9.50.
If you do not know your duty rate, use 5% for now and fix it later. A rough landed cost is far better than using unit cost and pretending freight is free.
From your 3PL or your shipping account · Fulfilment cost per order. What it costs to pick, pack and ship one order. On your 3PL invoice, take total fulfilment charges for the month and divide by orders shipped. If you ship yourself, it is your average postage plus packaging.
Ours is $5.50. Yours might be $4 or $12. It matters more than you think, and I will show you why.
From your marketing plan. Campaign start and end dates: whatever is in your promo calendar. Expected uplift: how much more you expect to sell during the campaign, as a percentage. 40% uplift means 1.4 times your normal rate. Ask whoever is running the ads. Then be sceptical, because ad people are optimists. Discount: the offer. 30% off is 30.
Your open purchase orders. On order quantity, and when it arrives. Anything you have already ordered that has not landed. From your PO, your supplier confirmation, or your forwarder's tracking. Note the quantity and the expected delivery date.
Step 2: Clean it
Raw data is messy. Here are the five things that will go wrong, in the order you will hit them.
Before
After
Before
NHY-BOT-001 / nhy bot 001 / BOT001
After
NHY-BOT-001 everywhere, =UPPER(TRIM(A2))
Before
Dead variants with no sales
After
Deleted from the sheet
Before
Blank lead time
After
Placeholder, highlighted until the real number arrives
Before
Dates arriving as text, aligned left
After
Real dates, aligned right
Before
8-week average including a promo week
After
7 clean weeks, spike removed
SKU codes will not match. Shopify has "NHY-BOT-001". Your supplier invoice has "nhy bot 001". Your 3PL calls it "BOT001". Pick one format, usually Shopify's, and make everything else match it. In Sheets, =UPPER(TRIM(A2)) fixes spacing and capitals. The rest you fix by hand. It is boring. Do it once.
You will have SKUs with no sales. Variants you stopped selling, sizes that never moved. Delete them from this sheet. They will confuse every total.
You will have blank cells. A missing lead time, a missing cost. Do not leave blanks. A blank in a formula becomes zero, and zero lead time means the sheet tells you that you can restock instantly. Put a placeholder in and highlight it yellow until you get the real number.
Dates will be text. If a date came from a CSV and Sheets thinks it is a word, your date maths will fail silently. Select the column, Format, Number, Date. If it does not change, retype one date by hand and check it aligns right in the cell. Numbers and dates align right. Text aligns left.
Your weekly rate will include a promo week. Covered above. Check the 8 weeks you averaged over. If one is a spike, take it out.
Step 3: Build the sheet
Here is the exact layout. Settings at the top, one SKU per row underneath. I am using Google Sheets column letters and formulas. They work in Excel too.
| A | B | C | D | E | F | G | H | I | J | K | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 10 | SKU | Product | On hand | On order qty | On order arrival | Weekly sales | Lead time days | MOQ | Landed cost | Selling price | Weeks to start |
| 11 | NHY-BOT-001 | Vivere Sip 32oz Water Bottle | 225 | 500 | 26 Nov | 25 | 60 | 500 | 9.50 | 28.00 | 8.57 |
K to Z continue, 16 calculated columns
ROW 11 · NHY-BOT-001 · 32OZ BOTTLE
HOLD
A TO J · YOU TYPE THESE
- A
- SKU
- NHY-BOT-001
- B
- Product
- Vivere Sip 32oz Water Bottle
- C
- On hand
- 225
- D
- On order qty
- 500
- E
- On order arrival
- 26 Nov
- F
- Weekly sales
- 25
- G
- Lead time days
- 60
- H
- MOQ
- 500
- I
- Landed cost
- 9.50
- J
- Selling price
- 28.00
K TO Z · THE SHEET WORKS THESE OUT
- K
- Weeks to start
- 8.57
- L
- Stock at start
- 11
- M
- Campaign weekly demand
- 35
- N
- Stockout date
- 13 Nov
- O
- 1 · Stockout?
- YES
- P
- Net price
- 19.60
- Q
- Contribution / unit
- 4.60
- R
- Margin %
- 23.5%
- S
- 2 · Margin flag
- LOW
- T
- Order-by date
- 7 Sep
- U
- 3 · Too late?
- TOO LATE
- V
- Units short
- 25
- W
- Reorder qty
- 500
- X
- 4 · Reorder cost
- $4,750
- Y
- 5 · Late PO?
- arrives 26 Nov
- Z
- SKU VERDICT
- HOLD
At 390px the grid stops working, so the row becomes a record. Same 26 columns, read top to bottom, inputs on white and formulas on mint.
Weeks until campaign starts
=($B$2-$B$1)/7
Stock at campaign start
On hand, plus anything arriving before the start, minus what you sell between now and then. Never below zero.
=MAX(0, C11 + IF(E11<$B$2, D11, 0) - F11*K11)
Campaign weekly demand
Normal rate times uplift.
=F11*(1+$B$4/100)
Stockout date
Stock at start divided by campaign daily pace, added to the start date.
=$B$2 + L11/(M11/7)
Check 1: Stockout?
Does it land inside the campaign?
=IF(N11<=$B$3, "YES", "no")
Net price after discount
=J11*(1-$B$5/100)
Contribution per unit
Net price minus landed cost minus fulfilment.
=P11-I11-$B$8
Margin %
=IF(P11=0, 0, Q11/P11)
Check 2: Margin flag
=IF(Q11<=0, "NEGATIVE", IF(R11<$B$6/100, "LOW", "ok"))
Order-by date
Last day you could have ordered and still had it land in time.
=$B$2-G11-$B$7
Check 3: Too late to reorder?
=IF(T11<$B$1, "TOO LATE", "ok")
Units short during the campaign
Campaign daily pace times campaign days, minus what you have at start. Round up because you cannot order a fraction of a unit.
=ROUNDUP(MAX(0, (M11/7)*($B$3-$B$2+1) - L11), 0)
Reorder quantity
Round the shortfall up to the MOQ.
=IF(V11>0, CEILING(V11, H11), 0)
Check 4: Reorder cost
=W11*I11
Check 5: Late PO?
Stock on order that lands after the campaign starts.
=IF(AND(D11>0, E11>$B$2), "arrives "&TEXT(E11,"d mmm"), "")
SKU verdict
HOLD if the margin is negative, or if you stock out and cannot reorder in time. Otherwise ADJUST if anything is flagged. Otherwise GO.
=IF(OR(S11="NEGATIVE", AND(O11="YES", U11="TOO LATE")), "HOLD", IF(OR(O11="YES", S11="LOW"), "ADJUST", "GO"))
Put these in row 11 and drag down. I have written each one as the plain English question first, then the formula.
Campaign verdict (put this in D2, next to your settings). Worst SKU wins.
=IF(COUNTIF(Z11:Z100,"HOLD")>0, "HOLD", IF(COUNTIF(Z11:Z100,"ADJUST")>0, "ADJUST", "GO"))
And three summary numbers next to it. Total units short: =SUM(V11:V100). Total reorder cost: =SUM(X11:X100). SKUs flagged: =COUNTIF(Z11:Z100,"<>GO")-COUNTBLANK(Z11:Z100).
Contribution margin, 32oz bottle
Net price $19.60 · contribution $4.60 · margin 23.5%
Gross margin looks fine. Contribution margin is where the campaign lives or dies.
Step 4: Read one row by hand before you trust it
This is the step everyone skips and the one that catches every mistake. Take one SKU and work it out on paper.
Our 32oz bottle, 11.11 campaign, checked on 12 September:
225 on hand. 500 on order, arriving 26 November. 25 a week. 60 day lead time. MOQ 500. Landed cost $9.50. Price $28. Fulfilment $5.50. Campaign 11 to 17 November, 40% uplift, 30% off.
- Weeks to start
- 8.57
- Stock at start
- 225 minus 214 sold between now and then, and the PO does not count because it lands after the start. 11 units.
- Campaign pace
- 35 a week, 5 a day. Eleven units lasts about two days. Stockout 13 November. YES.
- Net price
- $19.60. Contribution $4.60. Margin 23.5%. LOW.
- Order-by date
- 11 November minus 60 minus 5. 7 September. TOO LATE.
- Units short
- 5 a day for 7 days, minus 11. 24.29 units, call it 25. Reorder rounds up to MOQ. 500 units, $4,750.
- Late PO
- 500 arriving 26 Nov.
If your sheet gives you the same numbers, it works. If it does not, one of you is wrong, and it is worth ten minutes to find out which.
Step 5: Add the AI, but only for the words
The sheet gives you the verdict and the numbers. What it does not give you is what to do about it, or the email to your supplier.
That is the only job the AI has. It reads the numbers. It never produces them.
Copy the flagged rows from your sheet, paste them into Claude or ChatGPT, and use this prompt exactly:
You are a supply chain operator reviewing a campaign plan for a Shopify store. Below is a table of calculated numbers and a verdict. Do not recalculate or change any number. Using only these numbers: (1) explain the top risks in plain language a first-time founder understands, (2) give three ways to adjust the plan, each with what it costs and what it protects, (3) recommend one, (4) list the actions for marketing, operations, finance, and the supplier, (5) draft a short message to the supplier and a short message to the internal team. Be direct. No jargon. [paste your rows here]
What comes back for our bottle is roughly: cut the discount to 15% to get margin back over 30%, accept the stockout because the order-by date has passed, and email Guangzhou asking whether the 500 units in production can move to air freight to land by the 10th instead of the 26th.
That last sentence is the one worth the whole exercise. The sheet found the late PO. The AI turned it into a phone call.
Why not let the AI do the maths too? Because you cannot audit it. If you place a $4,750 order because a screen told you to, you need to trace that number back to a formula you can check. "The model said so" is not a supply chain process.
Formulas calculate
- stock at start
- stockout date
- contribution and margin
- order-by date
- reorder quantity and cost
- the verdict
AI explains
- plain-language risks
- three ways to adjust
- one recommendation
- actions per team
- the supplier message
One-way only. The AI reads the numbers. It never produces them.
CHAPTER 06 · THE APP
You already wrote the spec. You just called it a spreadsheet.
Here is the part people get stuck on. They build the sheet, it works, and then they decide the app version is for someone else. Someone technical. Someone with a developer.
I thought that too. Then I built the first version of this in an afternoon, and half of that afternoon was me being scared of it.
The reason it works is not that the tools got magic. It is that you already did the hard part. Deciding that a stockout plus a passed order-by date means HOLD is the hard part. Deciding to subtract fulfilment cost before you call it margin is the hard part. That is judgement, and no tool has it. Typing it into a screen is the easy part, and that is the only bit you are handing over.
Your sheet is the spec. Do not describe your app. Upload your sheet.
Build one screen, not an app.
One SKU in, one verdict out. No login, no dashboard, no saving, no accounts. You are not building software, you are building the calculator you already have, with a bigger font. If your first version does more than one thing, you went too far.
Upload the sheet. Do not describe it.
Attach the file. Every column, every formula, every real number is in there already. A paragraph of description gives the tool room to invent. A file does not.
Ask for the verdict before you ask for anything pretty.
Get it returning the right word with the right numbers underneath. Do not mention colour, layout, or fonts yet. If you ask for both at once you will get something that looks finished and is wrong, which is the worst possible outcome because you will trust it.
Change one input and stare at it.
Drop the discount from 30% to 15%. Margin should rise above your target and the flag should clear. Change lead time from 60 days to 20. The order-by date should move to after today and TOO LATE should disappear. If those two behave, your logic made it across. If they do not, fix it now, before you add a single thing.
Stop when it is useful, not when it is finished.
It will never be finished. Ours still is not. The question is whether you would trust it enough to make Monday's call with it. When the answer is yes, stop and go use it.
The prompt
This is the whole first prompt. Attach your sheet, paste this, and send.
I have attached a spreadsheet that already works. Build me one screen that does what it does. Nothing else. The screen has one form with these inputs, pre-filled with the values in row 11: on hand, on order quantity, on order arrival date, weekly sales, lead time days, MOQ, landed cost, selling price. Plus campaign start, campaign end, uplift %, discount %, margin target %, order buffer days, and fulfilment cost per order. Below the form, show one word: GO, ADJUST or HOLD. Under it, list the five checks and whether each passed, and the numbers behind them. Use the exact formulas in columns K to Z of the attached file. Do not simplify them, do not improve them, do not round differently. Contribution must subtract fulfilment cost per order, not just landed cost. No login. No database. No saving. Nothing stored. It recalculates in the browser when I change an input, and that is all it does. Before you build, tell me back in plain English what the five checks are and in what order they decide the verdict. I want to see that you read the file.
The last paragraph is the important one. Do not cut it.
What will go wrong
It invents SKUs.
You get a tidy demo with three products you have never sold. Say: use only the row in my file, leave the other rows empty.
It rounds differently from your sheet.
Your 23.5% becomes 24%. Say: match the file exactly, no rounding I did not ask for.
It makes everything a card.
Your five checks turn into five identical boxes with icons. Say: this is a report, not a dashboard.
It adds a login.
Nobody asked for one. Say: remove it, this stores nothing.
None of these are you failing. They are all the tool filling in gaps you left, which means the fix is always the same: be more specific about the thing you did not say. That is the entire skill. It is not coding.
I built our first version on a Tuesday. It was ugly, it had one screen, and it got one thing right: it told us to hold a campaign we were two days from launching.
That version is still ugly. We still use it.
Tier 2: From the sheet to an app
Tier 1 gives you the answer for one campaign, this afternoon. But it is a photograph. Next week's stock is different, the sales rate has moved, and you are copying numbers again.
We turned the sheet into an app so it runs on live Shopify data, for all 52 SKUs, every time someone opens a campaign. Here is the thinking, and the four decisions that changed the answer.
First: we decided what question it answers
The first instinct is always to build a dashboard. Show inventory, show margin, show supplier status, let the founder work it out. People open those twice and never again, because a screen full of numbers still leaves you with the decision.
So we wrote down the only sentence that mattered: the founder needs to know whether to press go.
That constraint killed about eighty percent of what we would otherwise have built. No charts. No trend lines. No health score. One word at the top, the reasons underneath, then which SKUs caused it.
Three verdicts, not a score out of 100. A score tells you how you are doing. A verdict tells you what to do.
Second: we looked for what already existed
Before writing anything new, we went through the planner we already use with clients. The buying table already produced a per SKU signal: urgent, warning, healthy. It has been driving reorder decisions for a while.
So the campaign verdict was not a new engine. It was a roll up. Run the same kind of check per SKU, against a specific campaign's dates and uplift, then summarise the worst result into one word.
That reframe saved days. Before you build the new thing, go and find the 60% of it you already have.
If you have no systems at all, that 60% is the Tier 1 sheet. Every app we built later is just that sheet, running automatically, for 52 SKUs instead of 10.
Third: we drew a hard line around the AI
Formulas calculate. AI explains. The AI never touches a number.
Same rule as the sheet. Stock, margin, dates, reorder quantities are fixed formulas, boring and checkable. The AI reads the output and says what it means, and drafts the supplier message.
Fourth: we wrote the checks in plain English before any formula
The five sentences at the top of this guide. Only then did each one get a formula, and only then did we decide the order they are checked in. HOLD first, because losing money per unit or being unable to restock is not something a smarter discount fixes. Then ADJUST. Then GO. First match wins.
That ordering is a business decision disguised as logic. Argue about it with your team before you build it.
What we used
We built on Base44, which lets you describe what you want in plain language and get a working app with a database and a Shopify connection. Lovable, Bolt or Replit do the same job. If you can write the Tier 1 sheet, you can write the prompt.
The prompt that built the engine was close to a brief, not a spec. Roughly:
"When a user opens a campaign, show one verdict for the whole campaign, GO, ADJUST or HOLD, with the reasons and the SKUs behind it."
Then the five checks, each with its formula, and the verdict order. What it did not include was how to lay it out or what to call anything. The response came back with things I had not asked for, including a flag for POs arriving after the campaign start, which turned out to be the best moment in the demo.
Give the goal and what done looks like. Hand over the route. And make it safe for the tool to tell you something is blocked, because if your prompt only rewards "done", you will get "done" whether or not it is true.
The four decisions that changed the answer
Four times, the tool ran correctly and told us something useless. The fix was never in the code.
The tool said everything was urgent
Every SKU flagged urgent against one flat threshold.
Urgency measured against each SKU's own lead time plus its own buffer.
The margin check never fired
Price after discount minus landed cost. Passed at every discount.
Fulfilment added back. The bottle drops to 23.5% at 30% off.
We nearly defined 'in the campaign' wrong
Per-SKU uplift overrides treated as the SKU list: 2 SKUs out of 52.
A campaign covers everything you sell. All 52 SKUs are checked.
The late PO was being ignored correctly
Excluded from available stock. The row showed nothing.
500 arriving 26 Nov, call your forwarder about air.
One flat threshold
CAA-STK-001 stickers
NHY-BOT-001 bottle
Same bar, same alarm. Everything is urgent.
Own lead time plus own buffer
CAA-STK-001 stickers · 30 + 5 days
NHY-BOT-001 bottle · 60 + 5 days
One you can fix in a month. The other you cannot.
The first buying view came back with every SKU flagged urgent. All of them. A screen where everything is on fire is not a planning tool. We were judging every SKU against one flat threshold. But a sticker set with a 30 day lead time and a bottle with a 60 day lead time are not in the same danger at the same stock level. One you can fix in a month. The other you cannot.
Urgency has to be measured against each SKU's own lead time plus its own safety buffer. Obvious written down. Not obvious at 11pm looking at a wall of red.
Margin was calculated as price after discount minus landed cost. Standard. And it passed at every discount we tried, which meant the check was decorative. The missing piece was fulfilment. Pick, pack and ship on a single order is real money. Put it back in and the bottle goes from comfortable to 23.5% at a 30% discount, and the check starts doing its job.
This is the single most common margin error I see in DTC, and it is why founders are surprised by their P&L after a good month. Gross margin looks fine. Contribution margin is where the campaign lives or dies.
Campaigns can carry per SKU uplift overrides, so the gift box jumps 80% while everything else does 50%. The build proposed treating those overrides as the SKU list. A campaign with two overrides would have contained exactly two SKUs. That is not what an override is. A campaign covers everything you sell. Had we not caught it in review, the verdict would have run on 2 SKUs out of 52 and nobody would have noticed until it mattered. Review the definitions, not just the formulas.
We had 500 bottles in production, landing 26 November. Campaign ends 17 November. The logic correctly excluded it from available stock. Textbook. And the row showed nothing. If you are 500 short and 500 are on a boat nine days late, "you are short 500" is not the useful answer. The useful answer is "500 arriving on the 26th, call your forwarder about air."
So we split it. Exclude it from the maths, show it on the row with the PO number and the date.
Being correct and being useful are different tests. Most tools only run the first one.
Try it
The same five checks, running in this page. Nothing is saved, nothing is sent, no signup. It is prefilled with our 32oz bottle and its two neighbours on the 11.11 campaign, so it opens on HOLD. Change the discount, the uplift, or the dates and watch the word change.
SKUs flagged: 3
Total units short: 50
Total reorder cost: $9,500
Nothing is sent anywhere. It runs in your browser and is gone when you close the tab.
What we would tell someone starting today
- Build the sheet first. Ten SKUs, one campaign, one hour. Do not build an app until the sheet has told you something you did not know.
- Write the question in one sentence and refuse to build anything that does not serve it.
- Decide out loud what the AI is allowed to touch. Ours does not touch numbers.
- Put your formulas in plain English before you write them as formulas.
- Check one row by hand. Every single time we did this, we found something. Every single time.
Copy this tomorrow
- 01Open a sheet.
- 02Pull your top ten SKUs from Shopify.
- 03Open the supplier email you have been avoiding and get lead time and MOQ.
- 04Fill the ten input columns.
- 05Paste the formulas from Step 3.
- 06Then look at three dates. When you run out at campaign pace. Your order-by date. And when your existing POs actually land.
If your order-by date has already passed, you have your answer, and it is not the one you wanted.
The whole check takes less time than writing the email announcing the promo.
Plain English glossary
- Lead time
- Days from placing an order to it being on your shelf. Door to door, not factory time.
- MOQ
- Minimum order quantity. The smallest order your supplier will accept, regardless of what you need.
- Weeks of cover
- How many weeks your current stock lasts at your current sales rate.
- Unit cost
- What the supplier charges per unit. Not what it costs you.
- Landed cost
- Unit cost plus freight plus duty. What a unit really costs by the time it is in your warehouse.
- Fulfilment cost
- Pick, pack and ship for one order. On your 3PL invoice.
- Gross margin
- Price minus unit cost. Looks good. Lies to you.
- Contribution margin
- Price after discount, minus landed cost, minus fulfilment. The one that pays your overhead.
- Safety stock
- Buffer held because demand and lead times are never exactly what you planned.
- Uplift
- How much more you expect to sell in a campaign. 40% uplift means 1.4 times normal.
- Order-by date
- The last day you can order and still have it arrive before the campaign starts.
- Stockout date
- The day you hit zero, at campaign pace, not normal pace.
- Reorder point
- The stock level that should trigger a new order, based on lead time plus safety stock.
- On order / in transit
- Stock you have paid for that has not arrived. Only useful if it lands before you need it.
- Verdict
- GO, ADJUST or HOLD. One word, then the reasons.
- CEILING
- Spreadsheet function that rounds up to the nearest multiple. CEILING(24, 500) is 500. That is your MOQ rounding.
- COUNTIF
- Spreadsheet function that counts cells matching a condition. Used to find the worst SKU verdict.
- Base44 / Lovable / Bolt
- Tools that turn a plain language description into a working app with a database.
The one thing to take home
Nobody needs another dashboard.
What you need is one question asked before the campaign is approved, not after: if this works, can I deliver it, and will I still make money?
The arithmetic is not hard. Five checks, all of them numbers you already have. The reason it does not happen is that inventory lives in one place, margin in another, supplier lead times in an email, and the campaign calendar in a marketing tool that has never heard of any of them.
Put them on one sheet and the answer is obvious in about four seconds.
Our order-by date passed five days before I went looking. We have been doing this for 17 years.
Check yours.
