E-commerce — profit, ads, inventory for a DTC brand

15 minutes. Three CSVs. You play the ops lead at a 7-person oat-milk brand and answer the four questions that actually matter.

Updated 2026-04-17

Industry: E-commerce Difficulty: Beginner Time: 15 min Plan: Free works

The scenario

You’re the ops lead at Harvest Co., a 7-person DTC brand selling oat milk, cold brew, matcha, and a handful of other consumables. You sell on Shopify (most of your revenue) and Amazon (growing). You run ads on Google, Meta, and TikTok.

Nobody on the team is an analyst. You used to do the numbers in a spreadsheet, but the joins — orders × refunds × ad spend × inventory — got painful around week 3. Your cofounder keeps asking “are we profitable this week?” and you keep saying “let me get back to you.”

Today you’re going to answer four questions with Tablize:

  1. Which SKUs are actually profitable after all costs?
  2. Is our ad spend working once you join it to real orders?
  3. Which SKUs are about to stock out — and which are overstocked?
  4. Can the team self-serve a weekly view of this without asking you?

By the end of 15 minutes you’ll have a Report, a Dashboard, and a Watch — all running on their own.

Download the sample data

Three CSVs. Save them anywhere — you’ll drag them into Tablize in a moment.

7,131 rows · 90 days
orders.csv
Every order line for the last 90 days. Includes platform (Shopify / Amazon), SKU, qty, unit price, revenue, COGS, shipping cost, platform fee, and whether it was refunded.
540 rows · 90 days
ad-spend.csv
Daily ad spend by platform and campaign. Google, Meta, TikTok — 6 campaigns total. Includes impressions, clicks, and attributed orders.
12 rows · today
inventory.csv
Current on-hand stock per SKU, incoming units, safety threshold, and 14-day average daily sales. One row per SKU.

Open Tablize (console.tablize.com — sign up for a free workspace if you haven’t). You’ll land in an empty Chat.

Drag all three CSVs onto the chat window. The Agent confirms each one as it imports:

  • orders.csvdata.orders (7,131 rows)
  • ad-spend.csvdata.ad_spend (540 rows)
  • inventory.csvdata.inventory (12 rows)

You’re ready.

01

Which SKUs are actually profitable?

Revenue minus COGS, shipping, platform fees, refunds — per SKU, last 30 days.

This is the question you can’t answer in a spreadsheet because the join (orders × refunds × products) is awkward. The Agent writes the SQL in one shot.

Prompt · paste into chat
For each SKU, show me net profit for the last 30 days. Net profit = revenue − cogs − shipping − platform fee, and exclude refunded orders. Sort by profit descending. Show SKU, product name, units sold, revenue, total costs, net profit, and margin %.

What you’ll see (numbers approximate — generated data has some randomness even with a fixed seed):

harvest co · profit by sku
step 1 · expected answer
Tablize
sql.query · orders joined with aggregate, 30-day window 312 ms
Net profit for the last 30 days totals about $48,200 across 12 SKUs. Margins are healthiest on the Oat Milk line (30–35% net) and weakest on accessories (Ceramic Bowl and Bamboo Whisk — the low volume doesn't cover the fulfillment fee). Three SKUs — Oat Milk 1L, Cold Brew 12oz, Matcha 50g — are currently pulling in a refund spike, dragging their net margin below what you'd expect.
SKUProductUnitsRevenueNet profitMargin
SKU-1048Oat Milk 500ml1,052$3,620$1,28035.4%
SKU-1047Oat Milk 1L759$4,420$1,31029.6%
SKU-4006Almond Butter 500g210$3,360$98029.2%
SKU-0912Cold Brew 12oz388$1,720$41023.8%
SKU-3102Bamboo Whisk88$1,230$18014.6%
SKU-3101Ceramic Matcha Bowl54$1,290$1108.5%
· Step 1 — profit by SKU, with margin flags

Keep it: click + Save as Report. Name it “SKU profit — weekly” and set a weekly schedule (Monday 09:00 is fine). You’ve got your first recurring asset.

Try a follow-up (optional):

Prompt · follow-up
Why is Cold Brew 12oz's refund rate so high this week compared to last month?

The Agent pulls the refund-rate time series, spots that the last 7 days are running ~3x the 90-day baseline, and flags that it’s concentrated in SKU-0912 + SKU-1047 + SKU-2238. Those three SKUs shipped together — likely a bad fulfillment batch.

(This is a real signal in the sample data — the generator injected a simulated bad batch on the last 7 days.)

02

Is ad spend actually working?

Blended ROAS across Google, Meta, TikTok — joined to real orders, not platform-claimed conversions.

Every ad platform claims great ROAS. When you add them up they total more than your revenue. This question forces the join against your real orders.

Prompt
For the last 30 days: total ad spend by platform and campaign, join against real orders from the same period, and compute "true ROAS" = revenue / spend. Flag campaigns with ROAS below 2.

The Agent notices that ad-spend.csv records attributed_orders at the platform level, and that real revenue lives in orders.csv. It writes two queries — one to aggregate spend per (platform, campaign) and another to pull actual revenue — and produces:

harvest co · ad roas
step 2 · expected answer
Tablize
sql.query · aggregate spend, join revenue, compute ratio 412 ms
Across all three platforms you spent $37,800 and pulled in $61,200 of attributed revenue — a blended 1.62x true ROAS, which is well below what the platforms each claim individually. Two campaigns are dragging the blended number down.
Google · Brand
3.8x
Meta · Retargeting
3.0x
TikTok · UGC
2.1x
Google · Shopping
1.5x
Google · Non-brand
1.1x
Meta · Prospecting
0.9x
Kill or rework: Google Non-brand Search (1.1x) and Meta Prospecting (0.9x) are both below a 2.0 breakeven threshold. Meta Prospecting is actually losing money at the margin.
· Step 2 — true ROAS by campaign, red flags below 2x

Keep it: click + Watch weekly ROAS. The Agent creates a Watch that runs every Monday at 09:00 and pings you on email if any campaign’s ROAS drops below 2.0. No more “why is our ad spend up?” surprise meetings.

03

Which SKUs are about to stock out?

A forward-looking view: days of cover given current velocity.
Prompt
Using inventory.csv, compute days-of-cover for each SKU (on_hand + incoming_units) / avg_daily_sales. Flag any SKU with less than 7 days of cover as critical, 7–14 as warning. Show me the full table sorted by days-of-cover ascending.
harvest co · stockout risk
step 3 · expected answer
Tablize
sql.query · days-of-cover calculation 148 ms
Three SKUs are critical — under 7 days of cover. Your Oat Milk 500ml is the most urgent — the 500ml has been your best-selling SKU of the last 2 weeks, and you only have ~3 days of cover left.
SKUProductOn handDaily salesDays coverStatus
SKU-1048Oat Milk 500ml10535.13.0critical
SKU-3102Bamboo Whisk142.85.0critical
SKU-4005Hemp Protein 1kg182.18.6warning
SKU-0913Cold Brew 32oz1,2408.4147.6overstocked
The flip side: Cold Brew 32oz has ~5 months of cover at current velocity. Worth considering a promo or a bundle to move it faster.
· Step 3 — days-of-cover, with stockout + overstock flags

Keep it: click + Watch inventory. The Agent asks how often to check — pick “every 6 hours” since inventory moves fast. It’ll ping you the moment any SKU drops below 7 days of cover.

04

Can the team self-serve this?

Build one Dashboard that stitches all three views together. Your cofounder opens it, not Tablize.

The three questions above are Reports / Watches. They email the team. But for a live “how are we doing right now” view, you want a Dashboard the team can open on their own.

Prompt
Build me a Dashboard called "Harvest Co. ops" with three panels: (1) SKU profit for last 30 days (table from the earlier analysis), (2) true ROAS by campaign (the bar chart we just built), (3) days-of-cover by SKU (from inventory). Use the monochrome theme. Make it publicly shareable.

The Agent generates the Dashboard in about 10 seconds. You’ll see it slide into the right panel:

Dashboard · harvest co · ops
Harvest Co. ops — live
Public link · updates every 5 min · embed in Notion with oEmbed
30-day profit
$48,200
Blended ROAS
1.62x
Stockouts at risk
3 SKUs
· Step 4 — one Dashboard, three KPIs, shareable link

Copy the public link. Paste it in your team’s Notion, Slack, or email signature. It’ll update every 5 minutes without you lifting a finger.

What you built in 15 minutes

  • 1 Report — SKU profit, running weekly.
  • 2 Watches — ROAS alert, inventory stockout alert.
  • 1 Dashboard — live view, publicly shareable.

The Dashboard replaces your cofounder’s “are we profitable?” ping. The Watches replace your “did anything break overnight?” check. The Report replaces your Monday-morning pivot-table build.

All four keep running on their own. Next week you’ll open Tablize, and your Monday is done before your first coffee.

Next steps in this industry

  • Connect your real Shopify — see Integrations → Shopify. Same questions work with live data.
  • Add Stripe — for cash flow, refund reason breakdown, disputes. One more OAuth connection, no code.
  • Hook up Amazon SP — multi-channel view for sellers who are actually split across platforms.
  • Read the E-commerce industry page — deeper scenarios: cross-border currency handling, margin-at-risk alerts, subscriber LTV modeling.

Nearby tutorials

  • Advertising — if media buying is your main lens, not merchandising.
  • SaaS — if you’re running a B2B product with subscriptions.
  • Logistics — if you’re the one actually shipping the boxes.