A single outbound message — say QUES00095 — moves through six stages, each owned by a different system. The audit trail is reconstructed from the status field at each handoff.
Generated, awaiting human approval. Default state on row insert.
Reviewer clicked approve. Send pipeline picks it up within the next poll cycle.
Outbound succeeded. send_at timestamp populated. Terminal.
Reviewer rejected. Reason captured in notes field. Terminal.
Send pipeline error (Gmail bounce, WhatsApp opt-out, HubSpot rate limit). Manual retry only.
Guardrail intercept (suppression, recent contact, missing field). Logged for audit; no send attempted.
The status field lives only in Airtable. There is no event sourcing or audit log table. If a reviewer manually edits the field, or if a script writes the wrong value, the system has no way to detect the drift. See Risks · R-03.
QUES codes are assigned on queue insert. They are the only stable identifier that spans n8n logs, Airtable rows and outbound send records.