Stories A promise's telling
Ads
Paid acquisition runs inside a campaign: agents generate creative, push it to Meta, Google, LinkedIn and TikTok, and every impression feeds the same analytics — no separate ads console.
The seven beats
- World
- Ads is the paid layer of a campaign; the workflow canvas is the live view.
- Cast
- People and agents: copywriter, designer, voice, paid-meta, paid-google, paid-linkedin, paid-tiktok, cmo.
- Knock
- A persona match enrols a person and triggers the campaign workflow.
- Want
- One brief, every format: creative, buying and deployment as tool steps, tracked as events.
- Way
- Connect accounts once at /settings/integrations; every ad push becomes a tool step in the workflow.
- Turn
- The z-test fires at 100 conversions per arm; the winner surfaces, you tap [Regenerate loser], the platform agent re-pushes.
- Lesson
- Path strength increases on the winning channel × variant × persona; the next campaign starts with those paths pre-loaded.
This story carries its beats but no written telling yet — text/ads.md has no “The story” section.
Connected to
Every link here was checked against the repo when the page was built. 14 names the story uses could not be found and are shown without a link.
People
- owner
- agency
- client
Agents
Each opens a chat with that agent.
- copywriter
- designer
- voice
- paid-meta
- paid-google
- paid-linkedin
- paid-tiktok
- cmo
- media-buyer
Skills
Each opens the skill's page.
- ads — ref: ads in all four ads-* agents (one.ie/ai/agents/ads-meta/agent.md:17); the skill is one.ie/ai/skills/ads
Paths
The flows this story walks — trigger → step → step.
- trigger persona match enrols a person → tool push hook creative to Meta + LinkedIn → delay +24h → tool send welcome email → condition clicked? → delay +3d → tool send retargeting ad → sell checkout
Tools
Receivers and scripts it signals.
- read_funnel
- read_variants
- read_retention
- read_digest
- connect_tool
- variantLift()
- attributionWeights()
- journeyGraphToWorkflowDiff()
Promises
What it holds; a told promise opens its own story.
- ads-loop
- ads-ui
Docs
What derives from this file.
Events
Every event is a signal; each names the path it marks or warns.
- none — POST /api/webhook/meta writes D1 campaign_spend_events itself (pages/api/webhook/meta.ts:113); Meta only · from platform webhooks and adapter receipts none — webhook/meta.ts calls no mark or warn tags: campaign
- VERIFY: an ad click lands at /go/[id], which writes its own event row with source pixel and the campaign (pages/go/[id].ts:68, :80); event:track (packages/sdk/src/receivers.ts:4031) carries the same fields; no platform conversion pixel reaching either was found · from pixel events fired by the ad platform on conversion mark — conversions strengthen channel × variant × persona paths tags: campaign, variant, persona
- none — the tags are read, not received: applyGates and gateCreative (lib/ads-gates.ts:96, :137) · from VERIFY: no writer of these tags found; the email webhook writes a D1 suppression row instead (pages/api/webhook/email.ts:341) none — a matched tag excludes the actor or the creative; ads-gates.ts writes no signal tags: suppression-reason:unsub, suppression-reason:complaint, suppression-reason:hard-bounce
Transactions
- ad spend summed from platform webhooks and adapter receipts, tagged campaign:<id>
- checkout:create → checkout:resume in the campaign workflow
Analytics
- impressions, clicks and conversions read via read_funnel filtered by campaign:<id>
- variant conversion counts via read_variants
- day-0 through day-30 cohort retention via read_retention
- plain-English digest via read_digest
- incremental ROAS against the holdout from variantLift()
- path strength at /api/export/highways?prefix=campaign:<id>