05 · Lifecycle

From trigger to send

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.

01
Trigger · n8n cron fires
scheduleTrigger node activates. Workflow context: list_id, playbook_id, source_workflow.
n8n · scheduleTrigger
02
Pull · POST /pipeline/list
ClawBot fetches contacts from HubSpot list. Applies suppression list filter (DNC, recent contact window).
FastAPI · HubSpot API
03
Enrich · context lookup
If enrich=true, ClawBot pulls deal history, last touchpoint, owner. Bot Settings (Sales_Assistant) supplies the system prompt.
Airtable · Bot Settings
04
Generate · LLM draft
Prompt + context → draft message. 48+ guardrails evaluated. Failures escalate to human, never auto-discard.
LLM · Guardrails
05
Queue · write task_queue_sales
Row inserted with status=draft, channel, recipient, draft body, playbook_id, source_workflow. QUES code assigned.
Airtable · task_queue_sales
06
Approval · human review
Owner (Jess or Danny) reviews in Airtable interface. On approve: status flips, downstream send triggered. On reject: row archived with reason.
Airtable Interface · human
07
Send · outbound
Gmail / WhatsApp / HubSpot Sequences fires. Final status = sent. Send timestamp captured. No automated reply tracking yet.
Gmail · WhatsApp · HubSpot
Status field

Six terminal states

draft

Generated, awaiting human approval. Default state on row insert.

approved

Reviewer clicked approve. Send pipeline picks it up within the next poll cycle.

sent

Outbound succeeded. send_at timestamp populated. Terminal.

rejected

Reviewer rejected. Reason captured in notes field. Terminal.

failed

Send pipeline error (Gmail bounce, WhatsApp opt-out, HubSpot rate limit). Manual retry only.

skipped

Guardrail intercept (suppression, recent contact, missing field). Logged for audit; no send attempted.

SSOT desync risk

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.

QUES00095

A real example

QUES codes are assigned on queue insert. They are the only stable identifier that spans n8n logs, Airtable rows and outbound send records.

QUES00095 · TQ-01 Growth/VIP Rebooking ───────────────────────────────────────── 01 2026-05-24 09:00:03 n8n cron fires (every 24h) 02 2026-05-24 09:00:04 POST /pipeline/orders (view_id=viwAAA) 03 2026-05-24 09:00:07 6 orders pulled · 4 passed suppression 04 2026-05-24 09:00:12 4 drafts generated · Account Manager bot 05 2026-05-24 09:00:13 4 rows inserted into task_queue_sales QUES00092, 93, 94, 95 assigned 06 2026-05-24 14:22:18 Jess approves QUES00095 07 2026-05-24 14:22:45 Send pipeline picks up · Gmail send OK 08 2026-05-24 14:22:46 status = sent · terminal