Data and reporting
Make the product fields consistent before blaming the AI tool
An assistant reading your catalogue will answer confidently whether or not the fields agree with each other. Nothing in the model tells you which answer came off a clean row. The work is upstream: one vocabulary per field, one row per SKU, and a nightly pass that says out loud which rows are still short.
- Triggers
- Two
- Runs
- On write, plus nightly
- Stack
- 4 tools
- Durable execution
- Not required
The flow
Two triggers and one decision. The top track cleans rows as they arrive; the bottom track sweeps the whole table at night and separates what is usable from what still needs a person.
New product rows land
Sheets · Airtable
Model labels the free text
OpenAI · Anthropic
Write one row per SKU
Sheets · Airtable
Every night
n8n schedule
List the rows still short
n8n · Make
Every required field filled?
n8n IF
Flag the row usable
Sheets · Airtable
Send the gaps to an owner
Slack · WhatsApp
Step by step
- 01
New product rows land
Sheets · AirtableA supplier file, an export, or someone typing. The point of entry does not matter; every row goes through the same door from here on.
- 02
Model labels the free text
OpenAI · AnthropicThe model picks a category from your fixed list and pulls attributes out of the description. It classifies and extracts only — it never computes a figure. Prices, weights and stock counts are copied across verbatim or left blank.
- 03
Write one row per SKU
Sheets · AirtableSame field names, same units, same date format, every time. One SKU appearing twice under two spellings is the defect this step exists to stop.
- 04
Every night
n8n scheduleA full pass over the table, on a schedule. Cleaning only on write leaves the rows that were already wrong untouched.
- 05
List the rows still short
n8n · MakeRead the table in pages rather than one request per row — Sheets meters per minute and Airtable per second, and a row-by-row loop exhausts either.
- 06
Every required field filled?
n8n IFChecked against the short list of fields you decided are mandatory — not against everything the table can hold.
- 07
Flag the row usable
Sheets · AirtableOne column marking which rows an AI tool is allowed to read. Answers then come from rows you have already cleared, not from the whole table.
- 08
Send the gaps to an owner
Slack · WhatsAppThe named person, the exact rows, the exact fields. A list nobody owns is a report, and reports do not get filled in.
What the platform will not allow
Two of these set what the model can be asked to guarantee; the third sets how fast you may read the table.
Structured outputs guarantee only that the reply matches your JSON Schema — the model "will always generate responses that adhere to your supplied JSON Schema". Shape is enforced; whether the value is the right one is not.
OpenAI — Structured OutputsEvery field must be marked required and objects must set additionalProperties: false, so a field the model cannot determine still comes back — you need an explicit "unknown" value rather than a missing key.
OpenAI — Structured OutputsNumerical constraints (minimum, maximum, multipleOf) and string length constraints (minLength, maxLength) are not supported in the schema, so a price range has to be checked after the call. Regex pattern validation is supported, so a SKU format can be declared in the schema itself.
Anthropic — Structured outputsSheets allows 300 read and 300 write requests per minute per project, and 60 per minute per user per project; the quotas refill every minute and there is no daily cap on top of them.
Google Sheets API — Usage limits
When this is not worth building
Three cases where the upkeep costs more than the inconsistency.
The catalogue is small enough that one person still recognises every SKU by name. They will spot a bad row faster than a nightly sweep will, and the sweep becomes another thing nobody watches.
Nobody has agreed what the fields mean. Automation applied to an undecided vocabulary produces consistent rows that are consistently wrong, which is harder to see than obvious mess.
No one owns the gaps. The nightly list only works if it lands on someone whose job includes filling it in; otherwise you have automated the production of a list.