Case Studies Tools & Automations Contact Download CV
← Tools & Automations
Automations & Systems

Creative Approval Ops

A compliance-gated approval workflow for healthcare ad copy: a regex for forbidden terms, an AI check for the claims a regex can't see, a guarded status path with a full audit log, and a per-client SLA. Built on Airtable's free plan.

Airtable Automations AI structured output Interface Designer Synthetic data · October 2026

All data is synthetic: the agency, the three clients, the people and the ad copy are invented. The compliance rules are simplified summaries of healthcare-advertising principles and of Meta's personal-attributes policy, written for this demo. They are not legal advice.

Live base (read-only) · PDF
Review queue: assets grouped by status, with the asset overdue with the client at the top
Review queue, searched for one asset: the creative mockup, the copy, the campaign and a computed asset name. Status moves only through buttons.
The problem

Healthcare ads fail on two kinds of risk: claims a regulator or an ad platform would reject, and the client's own brand rules.

The usual setup is a shared sheet, a status column anyone can overwrite and an approval history that lives in email threads. When a claim slips through, nobody can say who approved it, or whether anyone checked it at all.

This base keeps the rules, the checks and the history in one place. Every asset is checked twice before a person decides, moves only along allowed paths, and leaves one log row for every status change.

What I built

Five layers, one base

01 · Rules

Rules as records, linked to clients

Each compliance rule is a row: type, severity, a regex pattern or a plain-language explanation, and its source. Rules link to the clients they apply to, and rollups compile them per client into one regex and one brief for the AI. Adding a rule to a client changes both checks on every asset of that client, with no automation edited.

Claim Rules table: rule, type, pattern, severity, source and the clients each rule applies to
Claim Rules. Forbidden terms carry a pattern; claims and disclaimers carry an explanation the AI reads.
02 · Checks

Regex first, AI second

A formula runs the client's compiled regex against the copy: free, instant and auditable. The AI receives only the rules a regex can't apply (implied cure, personal health attributes, comparisons with other professions, testimonials as proof, missing disclaimers) and returns a risk from a closed list, None, Low or High, with one quoted line per violation.

It runs at randomness 0, without internet access, and writes only to its own two fields. It never moves an asset. If the step fails, the asset stays marked Unchecked.

Asset record with Term check BLOCKED and the forbidden term quoted
Term check BLOCKED on “5 kg in”. A forbidden term can't leave compliance, whatever the AI says.
Asset record with Term check Clean but AI risk High, and the AI flags quoting the phrases that break the rules
The case a regex can't see: Term check Clean, AI risk High, both phrases quoted. This asset reached the client before the AI step existed; the check found what the regex had missed, and the client deadline has already passed.
03 · Guard & log

Validation rules, rebuilt

Airtable can't refuse a save, so the base detects and corrects. A Previous status field holds the last valid state and only automations write to it. A formula compares it with Status against the allowed paths and two gates: a forbidden term can't leave compliance forward, and a High AI risk can't reach the client without a written override reason.

One automation reverts blocked moves, writing the log row first so the attempted status isn't lost; another confirms allowed ones. After either acts, the two fields match again and the trigger re-arms: no loops, one log row per change.

Draft→Compliance check→Internal review→Client review→Approved→Live

Compliance, internal review and client review can also send an asset to Changes requested, which leads back to Draft or to Superseded. Every other move is reverted.

Approval Log table: event, from and to status, actor, outcome (Allowed, Reverted, Override), comment and asset
The Approval Log: one row per status change, allowed, reverted or overridden. A blocked move keeps the attempted status and the reason it was refused.
04 · Client SLA

A deadline per client, one alert per breach

Each client has its own approval time in business days. An automation stamps the send date when an asset reaches the client, a WORKDAY formula sets the deadline, and an email goes to the owner once, when the asset becomes overdue. Overdue assets sort to the top of the queue.

05 · Automations

Six automations, native actions only

The free plan has no scripting actions and no conditional buttons, and allows about 100 automation runs a month. Every step uses native actions. A status change costs one run, plus one for each AI check, send to client and SLA breach.

List of the six automations: AI semantic review, transition guard revert and log, send date stamp, SLA breach alert, measurement backfill
The six automations. The AI review fires only when Status and Previous status both read Compliance check: a confirmed state, not a passing one. The backfill ran once, for the measurement below.
Decisions

Why it's built this way

What testing found

Two bugs, one measurement

1 · A send that never happened

Clicking Send to client on a Draft asset put it in Client review for a few seconds before the guard reverted it. That was long enough for the send-date automation to fire, and the asset showed a client deadline for a send that never happened.

Fix: every downstream trigger now requires both Status and Previous status to match. Automations react only to confirmed states.

2 · Four assets, one name

The first naming convention, client, channel, format, campaign and version, looked unique on paper. Seeding the dataset produced four identical names.

Fix: an auto-number ID inside the name, so uniqueness no longer depends on how the other fields happen to combine.

Measurement

One run of the AI check over all 30 synthetic assets, compared with the violations planted in the dataset: 15 assets with at least one violation, 15 clean.

RegexAIRegex + AI
Assets with forbidden-term violations (8)8/8—8/8
Assets with semantic-only violations (7)0/77/77/7
All non-compliant assets (15)8/15—15/15
Individual semantic violations caught (14)013/1413/14
False flags on clean assets (15)000

The regex alone caught 8 of the 15 non-compliant assets; adding the AI check caught all 15, with no false flags on clean copy. Read it as a consistency check, not a benchmark:

  • 30 assets, synthetic, labelled by the same person who wrote the rules.
  • The one miss, a missing disclaimer, had been caught on the same text in an earlier run at randomness 0. The AI step is not fully deterministic.
  • Five AI flags went beyond the labels, all on assets the regex had already blocked. Four are defensible (a guaranteed result is also an efficacy claim); one is a clear error. None changed an outcome.
Generate structured data step: prompt with the client's rules and the copy, output schema with risk and findings, randomness 0
The AI step: the client's rules and the copy in, a closed risk value and quoted findings out, internet access off.
Known limits

Built with Airtable on the free plan: linked records, rollups, regex and WORKDAY formulas, native automations, the Generate structured data action and Interface Designer. AI assistance covered the mechanical parts (schema, formulas, seed data, supporting automations); the interface, the core automations and the AI step are my own build.

Let's talk

Need approvals you can audit?

If creative sign-off lives in a shared sheet and an inbox, I can build the rules, the checks and the trail around it.

Get in touch →