ShopX Buildathon · Saigon · 17 September 2026
Move Supply Chain

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.

Jump to the spreadsheet build

NHY-BOT-001 · 11.11 campaign · checked 12 Sep 2026

HOLD
Stockout
13 Nov, mid-campaign
Margin at 30% off
23.5% (target 30%)
Order-by date
7 Sep (checked 12 Sep)
On order
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.

GORun it as planned.
ADJUSTRun it, but change something first.
HOLDDo not run this as planned.

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.

  1. 1
    margin negative
    HOLD
  2. 2
    stockout AND too late to reorder
    HOLD
  3. 3
    stockout OR margin below target
    ADJUST
  4. 4
    otherwise
    GO

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.

1

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.

32oz bottle: Stockout 13 NovADJUST
2

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.

32oz bottle: Margin 23.5%, target 30%ADJUST
3

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.

32oz bottle: Order-by 7 Sep, TOO LATEHOLD
4

Can you afford the reorder?

Units short, rounded up to your supplier's minimum order. This number is always bigger than you expect.

32oz bottle: 500 units, $4,750
5

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.

32oz bottle: 500 arriving 26 Nov

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.

DETAIL · 1 TO 20 SEPTEMBER, MAGNIFIED58 PX = 1 DAY5DAYS LATEORDER-BY DATE7 SEP · last day to reorderTODAY12 SEP · the day you askedHOLD

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

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.

ABCDEFGHIJK
10SKUProductOn handOn order qtyOn order arrivalWeekly salesLead time daysMOQLanded costSelling priceWeeks to start
11NHY-BOT-001Vivere Sip 32oz Water Bottle22550026 Nov25605009.5028.008.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.

K

Weeks until campaign starts

32oz bottle: 8.57 weeks
L

Stock at campaign start

On hand, plus anything arriving before the start, minus what you sell between now and then. Never below zero.

32oz bottle: 11 units
M

Campaign weekly demand

Normal rate times uplift.

32oz bottle: 35 a week
N

Stockout date

Stock at start divided by campaign daily pace, added to the start date.

32oz bottle: 13 Nov
O

Check 1: Stockout?

Does it land inside the campaign?

32oz bottle: YES
P

Net price after discount

32oz bottle: $19.60
Q

Contribution per unit

Net price minus landed cost minus fulfilment.

32oz bottle: $4.60
R

Margin %

32oz bottle: 23.5%
S

Check 2: Margin flag

32oz bottle: LOW
T

Order-by date

Last day you could have ordered and still had it land in time.

32oz bottle: 7 Sep
U

Check 3: Too late to reorder?

32oz bottle: TOO LATE
V

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.

32oz bottle: 25 units
W

Reorder quantity

Round the shortfall up to the MOQ.

32oz bottle: 500 units
X

Check 4: Reorder cost

32oz bottle: $4,750
Y

Check 5: Late PO?

Stock on order that lands after the campaign starts.

32oz bottle: arrives 26 Nov
Z

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.

32oz bottle: HOLD

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.

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

Price
28.00
Less 30% discount
(8.40)
Less landed cost
(9.50)
Less fulfilment
(5.50)
Contribution
4.60

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.
Verdict: stockout, and too late to fix.HOLD

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:

The 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
numbers outno path back

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.

1

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.

2

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.

3

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.

4

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.

5

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.

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.

HOLD

SKUs flagged: 3

Total units short: 50

Total reorder cost: $9,500

Stock at start 11Stockout 13 NovMargin 23.5% LOWOrder-by 7 Sep TOO LATEShort 25 · reorder 500 ($4,750)arrives 26 NovHOLD
Stock at start 11Stockout 13 NovMargin 23.5% LOWOrder-by 17 Sep okShort 25 · reorder 500 ($4,750)ADJUST
Stock at start 1019Stockout noMargin 25.5% LOWOrder-by 7 Sep TOO LATEShort 0 · reorder 0 ($0)ADJUST

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

  1. 01Open a sheet.
  2. 02Pull your top ten SKUs from Shopify.
  3. 03Open the supplier email you have been avoiding and get lead time and MOQ.
  4. 04Fill the ten input columns.
  5. 05Paste the formulas from Step 3.
  6. 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.

Open a blank Google Sheet

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.