Created July 8, 2026. Source standard: St. Pierre Media Buying Standard.
Objective
Automate creative ideation, production, Meta distribution, activity logging, and performance monitoring.
Why it matters
Ship more hook packs with less manual work, then scale based on cost per qualified booked call.
You need to
Approve build order or revise scope - 5 min.
Status
Scope ready. Build not started.
| Order | Workstream | Reason | Output |
|---|---|---|---|
| 1 | Ledger + IDs | If activity is not captured first, automation creates invisible mess. | Every idea, render, upload, ad, budget move, and result has a durable row. |
| 2 | Dashboard | Akash wants to monitor, not inspect raw Meta tables. | Hook board, format board, pack status, spend, leads, booked calls, winners. |
| 3 | Ideation + production | Once the ledger exists, the engine can safely create work. | Hook packs with static, carousel, motion, and AI UGC briefs/assets. |
| 4 | Distribution | Publishing is the risky external write, so it comes after QA and tracking. | Paused Meta ad sets organized by hook, then controlled activation. |
| Layer | Owns | Rule | Example |
|---|---|---|---|
| Campaign | Testing lane | Monthly ABO hook-pack campaign unless the media-buying standard changes. | SP TEST | 2026-07 | ABO Hook Packs |
| Ad set | Hook | One hook, one budget, one verdict clock. | Pack 014 | Hook: Stop buying shared leads | Launch 2026-07-14 |
| Ad | Creative execution | One asset or carousel under the parent hook. | p014-h01-static-03-notes-app |
| Dashboard slice | Format | Compare format performance without splitting the hook by default. | static, carousel, motion, ai_ugc |
| Track | In scope | Not in v1 |
|---|---|---|
| Ideation | Generate hook packs from persona, angle, offer, market, proof, objections, and historical winners. | Fully autonomous brand strategy changes. |
| Production | Create briefs, manifests, render jobs, QA checks, and output assets across four format families. | Unlimited net-new template design without a template library. |
| Distribution | Create paused Meta campaigns/ad sets/ads, upload assets, attach tracking, and log IDs. | Uncontrolled active spend or new account/payment setup. |
| Ledger | Append-only operational ledger plus Activity Ledger rows for external writes. | Chat-only notes or hidden approval queues. |
| Dashboard | Monitor production throughput, deployment status, and performance by hook, format, ad, and spend. | Replacing Ads Manager as the full source of billing truth. |
| Input | How it is used | Ledger event |
|---|---|---|
| Offer | $1 start, 10+ inspections in 7 days, week-to-week, pay per qualified booked inspection. | offer_snapshot_used |
| Persona | Founder, skeptical owner, operator peer, proof narrator, systems explainer. | persona_selected |
| Angle | Rented demand, missed inspections, agency distrust, territory lockout, sales-team capacity. | angle_selected |
| Hook | The exact test identity. It becomes the ad set name and pack ID. | hook_pack_created |
| Format mix | Static, carousel, motion, AI UGC assignments for the same hook. | format_mix_selected |
| Historical results | Winners get expanded; losers inform blocked angles and new counter-hooks. | performance_used_for_ideation |
pack_id, hook_id, hook_text, persona, angle, offer_snapshot_id, and launch_intent.| State | Meaning | Allowed next move |
|---|---|---|
idea | Hook exists, no assets yet. | Generate concepts. |
briefed | Concepts and format assignments exist. | Render assets. |
rendered | Files exist locally. | QA. |
qa_passed | Ready for paused upload. | Create Meta objects. |
staged_paused | Meta ads exist but are not spending. | Activate or hold. |
active | Spend is on. | Monitor ladder. |
graduated | Winner duplicated into scale pool. | Monitor scaling. |
held | Paused for poor read or QA issue. | Archive or learn from it. |
| Step | Automation | Guardrail | Ledger event |
|---|---|---|---|
| 1 | Create or find monthly testing campaign. | Campaign starts paused unless explicitly in an active controlled test lane. | campaign_found or campaign_created |
| 2 | Create one ad set for the hook pack. | Name includes pack ID, hook, mix, launch date. Daily budget follows the standard. | adset_created |
| 3 | Upload each asset to Meta. | Store image hash or video ID against the asset row. | asset_uploaded |
| 4 | Create one ad per creative execution. | Ad name includes pack, hook, format, sequence, and idea slug. | ad_created |
| 5 | Verify campaign, ad set, ad, creative, link, status, and preview fields. | Block activation if any ad is not paused, missing tracking, or using wrong hook. | distribution_verified |
| 6 | Activate only through a controlled command. | Activation logs before/after status and budget. Budget moves follow ladder. | status_changed and budget_changed |
utm_campaign = campaign lane and month.utm_content = asset/ad slug.utm_term = format.sp_pack_id = hook pack ID.sp_hook_id = durable hook ID.sp_format = static, carousel, motion, or ai_ugc.creative_activity_ledger for every creative-system event, and continue using the existing Activity Ledger for external writes such as Meta uploads, status changes, Drive uploads, and dashboard deploys.| Field | Purpose | Example |
|---|---|---|
event_id | Unique row ID. | evt_20260708_001234 |
ts | When it happened. | 2026-07-08T14:02:11Z |
actor | Who or what did it. | codex, akash, renderer, meta_sync |
run_id | Groups one automation run. | creative-engine-20260708-01 |
pack_id | Hook-pack link. | p014 |
hook_id | Hook link. | h-stop-buying-leads |
format | Creative family. | static, carousel, motion, ai_ugc |
asset_id | Specific creative file or concept. | p014-h01-static-03 |
surface | Where the action happened. | brain, filesystem, meta_ads, drive, dashboard |
action | What happened. | asset_rendered, ad_created, winner_graduated |
before_image | Restorable before-state when relevant. | Previous budget/status/template path. |
after_image | Result state. | New Meta IDs, file hashes, status, metrics snapshot. |
reverse_how | Undo instructions. | Pause ad set, restore prior budget, archive pack. |
verified_at | Proof timestamp. | When the API read-back matched intended state. |
hook_pack_created, concept_generated, asset_rendered, qa_failed, qa_passed.asset_uploaded, campaign_created, adset_created, creative_created, ad_created, distribution_verified.status_changed, budget_changed, performance_snapshot, winner_graduated, pack_held.dashboard_refreshed, data_gap_detected, rollback_executed.| Panel | Shows | Primary question |
|---|---|---|
| Command strip | Active spend, leads, qualified actions, booked calls, CPQBC, best hook, worst leak. | What needs attention today? |
| Hook board | Each hook pack by status, age, spend, CPL, CPQBC, first qualified action, verdict clock. | Which hook is winning? |
| Format board | Static vs carousel vs motion vs AI UGC by spend, CTR, CPL, qualified rate, booked-call rate. | Which format deserves more production? |
| Ad leaderboard | Top and bottom ads, filtered by hook and format. | Which exact creative should graduate or die? |
| Production ledger | Ideas created, assets rendered, QA fails, uploads, deploys, cycle time. | Is the machine shipping enough? |
| Budget ladder | Current budget tier, promotion trigger, kill cap, next allowed move. | What can be scaled without guessing? |
| Data health | Missing Meta IDs, missing UTMs, stale metrics, unmatched Typeform/GHL conversions. | Can Akash trust the numbers? |
| Table / file | Grain | Key fields |
|---|---|---|
creative_hook_packs | One hook pack. | pack_id, hook_id, persona, angle, status, launch_date, target_cpqbc. |
creative_assets | One rendered asset or carousel. | asset_id, pack_id, format, template_id, file_path, sha256, qa_status. |
creative_distribution_objects | One Meta object mapping. | asset_id, campaign_id, adset_id, creative_id, ad_id, status. |
creative_activity_ledger | One activity event. | event_id, run_id, action, before_image, after_image, reverse_how. |
creative_performance_snapshots | One metric snapshot per object per day or pull. | object_id, level, date, spend, leads, qualified_booked_calls, cpqbc. |
manifest.csv | One production batch. | Portable backup of rendered files, copy, tracking, and Meta IDs. |
| Phase | Build | Acceptance test |
|---|---|---|
| 0. Inventory | Map current creative folders, scripts, Meta naming, landing routes, and media-buying standard. | One manifest can represent the 64 uploaded July 8 ads without hand edits. |
| 1. Ledger | Create creative ledger writer and schemas. Wrap every automation step. | A dry run writes idea, render, QA, upload-intent, and dashboard events with run ID. |
| 2. Dashboard | Create local dashboard from ledger + Meta read-back + funnel metrics. | Dashboard shows hook, format, ad, status, spend, CPL, CPQBC, and data-health gaps. |
| 3. Ideation | Generate hook packs from offer, personas, angles, winners, and blocked claims. | One command creates a frozen hook-pack brief and production manifest. |
| 4. Production | Render static, carousel, motion, and AI UGC outputs from the manifest. | At least one hook pack produces valid assets in all four format families. |
| 5. Distribution | Create paused Meta objects by hook, attach UTMs, read back status, write mappings. | One hook pack stages paused ads in Meta with no mixed-hook ad set. |
| 6. Monitoring | Refresh performance snapshots and update status recommendations. | Dashboard flags graduate/hold/kill candidates using the media-buying ladder. |
| Gate | Blocks when | Fix path |
|---|---|---|
| Hook integrity | An ad set contains multiple hooks or the asset hook does not match the ad set hook. | Move or rename asset before upload. |
| Format tagging | Format is missing or ambiguous. | Assign one of static, carousel, motion, ai_ugc. |
| Claims | Asset makes unsupported guarantees, fake proof, or fake customer claims. | Rewrite against approved proof bank. |
| Mobile readability | Text is clipped, tiny, or visually broken. | Re-render template. |
| Tracking | Missing pack, hook, format, or ad-level tracking tags. | Regenerate URL before creative creation. |
| External write ledger | Meta, Drive, deploy, or other external write lacks before/after and rollback. | Stop and write the ledger row before continuing. |
| Activation | Spend would turn on without a budget cap and rollback path. | Keep paused until activation command is explicit. |
| Command | Effect | Default state |
|---|---|---|
create_hook_pack | Generate hook pack brief and concept manifest. | idea |
render_pack | Produce static, carousel, motion, and AI UGC assets from manifest. | rendered |
qa_pack | Run file, visual, copy, policy, and tracking checks. | qa_passed or qa_failed |
stage_pack_to_meta | Create paused Meta ad set and ads by hook. | staged_paused |
activate_pack | Turn on spend with budget and rollback logged. | active |
refresh_performance | Pull Meta and funnel metrics, write snapshots, refresh dashboard. | Dashboard current. |
graduate_winners | Duplicate winning ads into the winner pool. | graduated |
| Risk | Safeguard |
|---|---|
| Automation makes a lot of assets but no learning. | Dashboard ranks by hook and format against CPQBC, not output volume. |
| Formats get mixed into unclear tests. | Ad set stays hook-owned; format is an ad-level dimension. |
| Meta delivery starves one format. | Dashboard shows spend share by format; split only when evidence justifies it. |
| AI UGC creates trust or policy risk. | Approved proof bank, claim QA, no fake customers, and manual review before activation. |
| Untracked external writes. | All external writes also call the canonical Activity Ledger with rollback instructions. |
| Dashboard numbers drift from real business outcomes. | Join Meta spend to Typeform/GHL/booked-call outcomes; show data-health gaps instead of hiding them. |