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.

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.

  1. 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.

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>