Campaign Intake Automation
AI-drafted campaign briefs with built-in conflict detectionAn n8n workflow that turns a new campaign task into a structured brief, flags conflicting sources instead of guessing, and waits for a person to approve before any downstream work is created.
- My role
- Designed and built the n8n orchestrator and its sub-workflows, the Claude brief drafting, both Slack approval gates, and the Asana handoffs.
- Built with
- n8n, Slack, Claude API, Asana, Google Docs
- Status
- Client work
- 2 approval gatesthe brief, then the docs, before any task is created
- 1 real conflictcaught on a live task in testing and held for review
- End to endfull test-mode runs passed, through handoffs
Before
The problem
Every new campaign started with someone reading the task, its comments, and related Slack threads, then writing the brief by hand. Sources often disagreed, and nothing flagged which one should win.
How a request moves through it
One sample task, followed from the moment it arrives to the moment the next team can start.
Intake
A new campaign request enters the workflow
A task lands in the campaign request project with what a media buyer needs to start: client, platform, package, priority, campaign type, and due date.
› Trigger today is a manual webhook. A scheduled trigger is not live yet.
- Intake: A new campaign request enters the workflow. A task lands in the campaign request project with what a media buyer needs to start: client, platform, package, priority, campaign type, and due date. Trigger today is a manual webhook. A scheduled trigger is not live yet.
- Structure: The brief is built from the task. Instead of rebuilding the brief by hand, the workflow reads the task fields and comment history and sorts them into a structured brief. Where two sources disagree, it flags the conflict instead of choosing one. Before this, someone read the fields and comments and wrote the brief by hand.
- Approval: People decide where judgment is needed. The brief is posted to Slack for approval with the conflict called out. The workflow waits for the configured approver before anything is created. Reactions are polled and attributed to the approver.
- Routing: One approved brief becomes separate requests. Once approved, landing-page copy and a creative brief are drafted as docs. A second approval then releases the downstream landing page and creative requests. Landing-page defaults are platform-aware unless the brief says otherwise.
- Handoff: The next team can start immediately. Each request arrives with the client, platform, priority, and requirements already filled in, so the team does not start by chasing missing details. Runs so far used test-mode destinations. Real-channel posting is not live yet.
Intake
A new campaign request enters the workflow
A task lands in the campaign request project with what a media buyer needs to start: client, platform, package, priority, campaign type, and due date.
› Trigger today is a manual webhook. A scheduled trigger is not live yet.
Structure
The brief is built from the task
Instead of rebuilding the brief by hand, the workflow reads the task fields and comment history and sorts them into a structured brief. Where two sources disagree, it flags the conflict instead of choosing one.
› Before this, someone read the fields and comments and wrote the brief by hand.
Approval
People decide where judgment is needed
The brief is posted to Slack for approval with the conflict called out. The workflow waits for the configured approver before anything is created.
› Reactions are polled and attributed to the approver.
Routing
One approved brief becomes separate requests
Once approved, landing-page copy and a creative brief are drafted as docs. A second approval then releases the downstream landing page and creative requests.
› Landing-page defaults are platform-aware unless the brief says otherwise.
Handoff
The next team can start immediately
Each request arrives with the client, platform, priority, and requirements already filled in, so the team does not start by chasing missing details.
› Runs so far used test-mode destinations. Real-channel posting is not live yet.
SIM: the client, task, comments, and values shown are invented sample data. The steps mirror the real workflow, which has passed full test-mode runs.
Proof
The real build
After
What changed
Hardest bug
After the workflow moved a task into its Asana section, its own response still reported the pre-move section. Everything downstream of that response looked healthy while the task's real state said otherwise.
Known next steps
Stack
For technical readers
Technical detail
The problem, in detail
Building a new campaign meant someone manually reading through a task's fields, its comment history, and any related Slack threads, then hand-writing a structured brief before creative or landing-page work could even start.
Build notes
A separate n8n workflow from Digest, the scheduled ads-reporting pipeline covered elsewhere on this site. Different trigger shape and a different blast radius, so a bug in one can't take down the other. Today it starts from a manual webhook.
Pipeline breakdown
Run log
SIM: invented task and figures, not a real client run. Both approval gates, downstream task creation, and handoffs have passed full test-mode runs. The reject-and-revise path, real-channel posting, and the scheduled trigger are not yet live.