Why Did Sales Drop in Indore? A D2C Team Asks, It Does Not File a Ticket

The Monday review opens with a number nobody can explain. Net sales in Indore are down from last week. Not by a rounding error — by enough to change the month.
Then the room splits into three versions of the same week. The marketplace report says orders held up. The website dashboard says traffic was fine and revenue dipped a little. The store sheet, which arrived as a spreadsheet attachment on Sunday night, says footfall was normal. Each report is internally consistent. Together they answer nothing, because each one counts a different thing, on a different clock, in a different file.
So the question — why did sales drop in Indore? — becomes a ticket. Someone has to pull the marketplace export, the website orders and the store data into one sheet, agree on what "sales" means, and rebuild the week by hand. By the time that lands, it is Thursday, and the week it describes is already history.
Three channels, three definitions of a sale
The disagreement is not carelessness. It is built into how each channel reports.
Gross is not net. A marketplace report leads with gross orders. The website counts revenue at checkout. Neither has yet subtracted the returns that will arrive over the next ten days, the cancellations, or the orders that never get delivered. A week can look healthy in gross and still shrink in net.
The city is not the city. The website records the shipping address. The marketplace export often carries the customer's registered city. The store sheet records the store's city, not the customer's. "Indore" in three files can mean three overlapping but different sets of orders.
The week is not the week. Marketplace settlements run days behind orders. Store data arrives when someone sends it. Returns get booked when the parcel reaches the warehouse, not when the customer sends it back. Put the three files side by side and you are comparing three different weeks wearing the same label.
One workspace, one meaning for the words
That shared meaning is the unglamorous half of the work, and it is where AgentSQL gets its retail vocabulary. On a customer's own data, Trida Labs builds the domain knowledge into the agentic core: net sales means gross minus cancellations, returns and undelivered orders; the city is the shipping city; a return rate is returns divided by delivered orders for the same period; sell-through is units sold divided by units received. The definitions live with the data, so every question afterwards uses the same ones — not whichever definition the person building that week's sheet happened to use.
With that in place, the three sources connect once into TridaPad — the workspace holds 50+ source types, so the orders database, the marketplace exports and the store system sit side by side — and the Monday question stops being a ticket. It becomes a sentence someone types.
The question, asked properly
Here is the question the founder actually asks, in the review, in plain words:
"Why did net sales drop in Indore last week compared to the week before? Split it by channel, and show me which SKUs drove the drop after returns."
AgentSQL routes that to its query-writer skill, checks the schema of the connected sources, and writes the query against the shared orders view — one row per order line, every channel already mapped to the same fields. The core of it reads:
-- Net sales by channel: Indore, this week vs last week
-- orders_all = website + marketplace + store orders, one row per order line
WITH weekly AS (
SELECT channel,
DATE_TRUNC('week', order_date)::date AS week_start,
SUM(gross_amount_inr - return_amount_inr) AS net_inr
FROM orders_all
WHERE ship_city = 'Indore'
AND order_status NOT IN ('cancelled', 'undelivered')
GROUP BY channel, DATE_TRUNC('week', order_date)
)
SELECT channel,
SUM(net_inr) FILTER (WHERE week_start = DATE '2026-10-26') AS last_week_inr,
SUM(net_inr) FILTER (WHERE week_start = DATE '2026-11-02') AS this_week_inr,
ROUND(100.0 * (SUM(net_inr) FILTER (WHERE week_start = DATE '2026-11-02')
- SUM(net_inr) FILTER (WHERE week_start = DATE '2026-10-26'))
/ NULLIF(SUM(net_inr) FILTER (WHERE week_start = DATE '2026-10-26'), 0), 1)
AS change_pct
FROM weekly
GROUP BY channel
ORDER BY change_pct;The numbers that come back in this worked example are sample numbers, but the shape of the answer is the point. Indore net is down 18 percent week on week. The website is nearly flat. Stores are down a little. Marketplaces account for almost all of the drop — and when the same question is asked one level down, by SKU, two causes separate cleanly. The brand's best-selling kurta set was out of stock on the marketplaces from Thursday to Saturday: no stock, no orders, no mystery. And one footwear line's return rate jumped in the same week, which quietly ate the sales it appeared to make — visible only because returns are netted in the same view, not in a separate report that arrives a fortnight later.
Two different problems, two different owners, one query each. On Thursday-afternoon spreadsheet time, they would have merged into a single unexplained dip and a general instruction to "push marketing".

What stays behind after the answer
A one-off answer helps once. The useful part is what the question leaves in the workspace. The query is saved, the split becomes a dashboard the whole team opens — net sales by city and channel, return rate by SKU, sell-through by category — and it refreshes from the same connected sources instead of from the next round of exports. AgentSQL also autodiscovers insights across the data — top and bottom performers, outliers, anomalies — and its alert monitor can watch the two numbers that caused this week's surprise: a hero SKU going out of stock on any channel, and a return rate crossing the line the team sets. Next time, the message arrives when the stock runs out, not in the Monday review after it.
That is also what the category manager's job becomes. She is no longer the person who assembles the week. She is the person who checks the one thing the data cannot know by itself — whether the stock-out was a warehouse miss or a listing that was paused — and acts on it while the answer is still warm.
What this does not do
Three limits deserve plain words. If the city field in a source is wrong — a marketplace export that maps half of Madhya Pradesh to one hub city — no query layer can see it; the mapping has to be fixed once, in the open, where the team can argue with it. Returns always lag: this week's net number will move a little as late returns land, and a team that forgets that will chase noise. And AgentSQL writes the SQL, but the definitions are the team's decision — if "net" is defined loosely, the answers will be consistently, confidently loose. The tool enforces the meaning you give it. Choosing the meaning is still your meeting to have.
Ask the question on Monday
If your weekly review runs on three exports and a Thursday answer, the pilot is small: connect the channels you already sell on, agree the definitions once, and let the team ask the Indore question — for whichever city is yours — in plain language. Try AgentSQL on your own data, or write to us at data@tridalabs.com.