Data and reporting
Audit the campaign names before the reports depend on them
Nobody sets out to build reporting on a text field. It happens the other way round: a naming convention is agreed, a few campaigns are launched in a hurry, and six months later a dashboard is grouping spend by the third segment of a string that four people spell four ways. The audit is cheap and dull. The cost of skipping it lands later, as a report that is confidently wrong.
- Triggers
- Two
- Runs
- Nightly
- Stack
- 5 tools
- Durable execution
- Not required
The flow
The top track holds the rule and the live names. The bottom track wakes at night, splits each name against the rule, and separates what reporting can safely group from what a person has to rename.
The convention is agreed
Manual
Store the rule as a table
Sheets · Airtable
Pull every live campaign name
n8n · Make
Every night
n8n schedule
Model splits each name into fields
OpenAI · Anthropic
Does it match the convention?
n8n IF
Write the label reporting groups on
Google Ads API
Send the breaks to their owner
Slack · WhatsApp
Step by step
- 01
The convention is agreed
ManualWritten down before any checking is automated. Which segments, in which order, separated by what, and the closed list of allowed values for each. A convention that lives in someone's head cannot be audited against.
- 02
Store the rule as a table
Sheets · AirtableOne row per segment, with its allowed values. Keeping the rule as data rather than as a regular expression inside the workflow means a marketer can add a market next quarter without opening the automation.
- 03
Pull every live campaign name
n8n · MakeNames from every account you report on, in one list. Include paused campaigns — last quarter's spend is still in the report, so last quarter's names still have to parse.
- 04
Every night
n8n scheduleNightly, because the expensive case is a name that has been wrong for weeks. Catching it the morning after it was created is the difference between a rename and a rebuilt report.
- 05
Model splits each name into fields
OpenAI · AnthropicA plain split handles the names that already comply; the model is there for the ones that do not — it maps "HK_BF_2026" and "hongkong-blackfriday" onto the same segments. It classifies and extracts only. It never computes spend, and it never invents a value that is not on the allowed list.
- 06
Does it match the convention?
n8n IFEvery segment present, and every value on its allowed list. Partial credit is not useful here — a name that parses into four of five fields still breaks the grouping it was supposed to feed.
- 07
Write the label reporting groups on
Google Ads APIThe durable fix is not the name. Apply a label carrying the same segments, and have the dashboard group by label id. A rename then costs you nothing, because nothing downstream was reading the string.
- 08
Send the breaks to their owner
Slack · WhatsAppThe campaign, the segment that failed, and the value it should have been. A list of malformed names with no proposed correction gets read once and never worked through.
What the platform will not allow
The first two set how far the label approach scales; the third sets how fast you may read the rule table and write the audit back.
Labels are a first-class reporting dimension, not a workaround: campaigns carrying them are queried through the campaign_label resource, and "You can filter these report results by comparing the label.id field using any numeric comparison operator or the BETWEEN, IS NULL, IS NOT NULL, IN, or NOT IN operators." Grouping on a label id is therefore supported in a way that grouping on a substring of a name never is.
Google Ads API — LabelsGoogle Ads caps labels at 50 applied to a single entity, and 100,000 applied to entities per account. One label per reporting segment fits comfortably; a scheme that mints a fresh label per campaign does not, and will hit the account ceiling before anyone notices.
Google Ads API — System limitsSheets 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. An audit that writes one row at a time is what exhausts the per-user figure.
Google Sheets API — Usage limits
When this is not worth building
Three cases where the upkeep costs more than the mess.
One person launches every campaign and no report groups by name. The convention is being kept by the only mechanism that reliably keeps conventions — a single pair of hands — and an audit adds nothing to that.
Nobody has agreed the convention yet. Auditing against an undecided rule produces a nightly list of violations that everyone disputes, and the workflow becomes an argument that runs on a schedule.
The names are already broken and nobody will do the back-fill. A checker pointed at a catalogue of legacy names reports the same few hundred failures every night until people stop reading it, and a muted report is worse than an unbuilt one.