# Fusion PPC implementation runbook

Execution package, 13 September 2026. All provider changes below are **planned**, none executed by this task. Sources are accepted revision 2, settings read 13 September and performance through 12 September. Re-read before execution.

[Overview](index.html) · [Runbook](implementation-runbook.md) · [Checklist](provider-change-checklist.md) · [Client summary](client-summary-hu.md) · [Verification](verification.md)

```mermaid
flowchart LR
 A[Snapshot and object lookup] --> B[Successful submission and dedup proof]
 B --> C[Repair goals and concentrate ads]
 C --> D[Search 1500 + PMax 1500 + C1 3000]
 D --> E[Closed cohort review]
 E --> F[C2 replaces C1]
 F --> G[Placement test on selected campaign]
 B -. failure .-> H[Hold launch and repair]
 E -. failure .-> I[Pause test and controlled rollback]
```

## Authority, roles and change protocol

Google operator owns Google changes, Meta operator owns Meta changes, tracking engineer owns event transport, CRM owner owns qualification, web implementer owns landing work. These are execution roles, not assumed named assignees. Record the actual operator before each write. This package authorizes no extra live work, deployment, spending or client send. Use existing execution authorization in its own phase.

Every row below inherits this protocol: save a timestamped before-state export with exact resource IDs, verify dependencies, make the single bounded change, read the object back independently, record result and rollback resource/version. Readback is mandatory before the dependent row. On mismatch stop the affected chain, preserve receipts and recover from the last verified state. Never retry a create blindly after timeout: search by recorded request ID/name/parent and reconcile first. Delete no historical objects.

**Budget invariant:** one mutually exclusive allocation stage, 6000 HUF/day total. Google 3000 and Meta 3000. Paused configured budgets are retained but excluded from active allocation. During a cross-object handover, debit/pause old delivery first and mark the exact amount reserved for the target, then activate target and clear reservation. Active allocation + explicit reserved transfer = 6000 throughout. A brief delivery gap is allowed, oversubscription is not. On failure reverse to the last complete stage. Budgets are configured average daily amounts, not hard daily invoices. Never sum stage rows.

## Lookup and snapshot gates

| Gate | Exact lookup and required receipt |
| --- | --- |
| L01 | Google customer **2938223921**, Meta **act_1783210591808804**, currency HUF, timezone Europe/Budapest. Export all campaign statuses/budgets, conversion definitions, custom/campaign goals, criteria, asset associations, signals and Meta campaign/adset/ad/creative hierarchies. Confirm live IDs match this source snapshot before editing. Google goal-user lookup: campaign_conversion_goal plus conversion_goal_campaign_config and custom_conversion_goal, including every consuming campaign. Do not change a shared goal blindly if new consumers exist. Meta budget unit: inspect account currency and existing campaign raw daily_budget beside its UI 3000 HUF/day, use the same provider unit convention, read UI equivalent before activation. |
| L02 | On fusiontables.hu identify form **3154**, current GTM container ID/account/workspace/published version and GA4 property/data stream by installed tags and authorized administration. Read GA4↔Google customer linkage and action 7586129686 source event. Export tag/trigger/container/form source versions. Prior audit references tag **15**, version **23**, but these are historical hints, not proof of current identity. Trace all hero/CTA/chat successful submissions and every browser/server sender. Record exact current container, trigger and deployment IDs before repair. |
| L03 | Open the existing lead-register evidence reference from the accepted source manifest privately. Resolve spreadsheet ID and **gid0**, bound Apps Script project/deployment/trigger IDs and owner. Export affected headers, rows 26–29 and script before repair. Match missing timestamps to notifications using existing enquiry identity, not row position alone. Do not publish raw contacts. |
| L04 | Read Meta ad **120252431814340184** creative reference then fetch creative/story/asset feed, page ID and Instagram actor ID. Confirm ownership and destination. New campaign/adset/ad/creative IDs do not exist yet, store each returned ID under the NEW_* handle used here. Existing historical IDs must never be used as a new object's ID. Resolve current supported UI/API fields at execution, validate drafts while paused. |

If a lookup yields multiple plausible objects or a current state differs materially, stop that mutation and reconcile the correct object. No guessed IDs. These lookup steps are planned prerequisites, not completed access checks.

## Tracking acceptance gate

Run success and failure checks in each actual form placement using a clearly labelled test excluded from business reports. A click, focus or invalid form must not emit a successful lead. Server-accepted success must yield one immutable submission ID, one register entry, one aggregate GA4 event and one logical Meta Lead. Browser and server receipts must use the same Meta event ID. Reload, double-click and transport retry must not create a second enquiry. Consent-denied behavior must respect the configured consent policy, not bypass it to force attribution. After controlled checks, match the next real enquiry to the same path before paid Search/C1 launch. Record Ads import diagnostics and tag/event evidence, do not require a non-ad test to produce an Ads-attributed conversion. Stop on inconsistent identity or mismatched counts. The September 11 audit did **not** verify server deduplication.

## One action per row

The exact before-state below is historical until L01 confirms it. New object rows remain paused until budget and tracking gates pass.

| Action | Provider object | Before | Planned after | Prerequisite | Responsible role | Immediate readback proof | Stop / rollback / recovery |
| --- | --- | --- | --- | --- | --- | --- | --- |
| T01 | Form 3154 / GA4 / GTM: resolve L02 | Aggregate VHK_lead 9 vs 4 actual recent enquiries, root cause unknown | Inspect success callback, server acknowledgement and all three placements. Emit one aggregate VHK_lead only after accepted submission, preserve diagnostic aliases outside goals. Reuse immutable enquiry ID. Change only the proven faulty trigger/mapping | L01–L03 snapshots and reproduced defect | Tracking engineer | Failed validation, click-only, successful submit, double-click/retry and reload checks. One register ID and one logical aggregate event for success, none for failure. Save consent state and event trace without PII. Match next real enquiry before launch | Restore exact GTM published version / form source revision from L02. Halt launches and affected event retries if mismatch persists |
| T02 | Lead Sheet gid0 / bound Apps Script: L03 | Date cells for recent rows 26–29 blank after new note columns | Resolve headers by names, preserve received_at and immutable enquiry ID across added columns. Populate missing dates only from matched notification timestamps, never guessed | L03 export and exact row matches | Tracking engineer | New controlled test row maps timestamp, ID and notes to correct headers. Existing values unaffected. Compare matched timestamp with timezone and mark test excluded | Restore script deployment and narrow changed-cell export, preserve new genuine enquiries added since snapshot |
| T03 | Meta pixel 1098642584214800 / Apps Script and GTM server path: L02–L03 | UrlFetchApp.fetch permission error in Sheet logs, GTM separately indicates CAPI participation | Identify every sender and repair failing authorized transport. Use identical event_name Lead and event_id for the same browser/server submission. Do not replay historical failed rows blindly | T01, T02 and sender inventory. Owner identity only if real OAuth prompt requires it | Tracking engineer / existing Apps Script owner | One accepted server receipt plus Events Manager dedup diagnostic for next real matched enquiry. Confirm no second sender creates a second identity. Transport acceptance alone is not attribution proof | Disable only faulty sender/retry job and restore script/tag version. Preserve pending-event ledger. Never replay an event without identity/receipt reconciliation |
| G01a | Google 2938223921 / action 7586129686 | ENABLED, primary, ONE_PER_CLICK, data-driven, 90-day click / 1-day view | Keep existing successful-submit action if validated. If irreparable, create one GA4 successful-submit action with same counting/attribution and verified event mapping, record NEW_SUBMIT_ID. Leave aliases diagnostic | T01 success proof. New-action alternative only if existing path cannot be repaired | Google operator + tracking engineer | Action source, category SUBMIT_LEAD_FORM, enabled, primary, counting, lookback and import diagnostics readback. Non-ad tests need not create Ads-attributed conversions | If new action is faulty, remove it from goals and mark secondary. Restore existing metadata from snapshot, do not fabricate conversions |
| G01b | Google custom goal 6458344571 | [7586129686, 7586129920] | Set conversion_actions to [validated submitted action], excluding 7586129920 and all hero/CTA/chat aliases | G01a, T01 and goal-user inventory L01 | Google operator | Read exact customConversionGoal action list and every consuming campaign. Confirm PMax 23822598651 uses this goal. Secondary form starts in a custom goal remain biddable | Restore exact old list only as a documented temporary degraded rollback. Pause affected new tests on mismatch, never label starts as leads |
| G06-7744821253 | Google conversion action 7744821253 | primary_for_goal=true | Set primary_for_goal=false, exclude from new Search custom goal, preserve counting and attribution | L01 source snapshot | Google operator | Read secondary status and Search goal membership. Confirm no custom goal still makes the milestone biddable for the new campaign | Restore prior flag only if verified real matched imports and intentional bidding decision justify it, otherwise keep secondary |
| G06-7744821256 | Google conversion action 7744821256 | primary_for_goal=true | Set primary_for_goal=false, exclude from new Search custom goal, preserve counting and attribution | L01 source snapshot | Google operator | Read secondary status and Search goal membership. Confirm no custom goal still makes the milestone biddable for the new campaign | Restore prior flag only if verified real matched imports and intentional bidding decision justify it, otherwise keep secondary |
| T04 | Private enquiry ledger and Google offline import mapping: L03 | No consistent contacted/fit/price/quote/order ledger | Add enquiry_id, received_at, consent-appropriate gclid/source/ad ID, contacted, room fit, price acknowledged, quote sent, order, actual value. Test first real matched quote/order import while actions remain secondary | T02 and G06. No guessed IDs or values | CRM owner + tracking engineer | Reconcile one real milestone, timezone, action, click identity, upload receipt and duplicate prevention. Quote and order are separate stages of one enquiry | Stop import job on duplicates or bad timestamps. Retain source ledger. Resolve upload corrections using provider-supported correction workflow before retry |
| G03-8 | Google campaign 23822598651 / new negative criterion | Absent unless L01 finds exact duplicate | Create negative keyword PHRASE: használt biliárd | L01 term and duplicate check, S01 for new Search | Google operator | Read campaignCriterion resource name, negative=true, exact text and match type. Preserve existing three negatives | Remove only recorded newly created criterion if it blocks valid offered intent |
| G03-9 | Google campaign 23822598651 / new negative criterion | Absent unless L01 finds exact duplicate | Create negative keyword PHRASE: használt biliard | L01 term and duplicate check, S01 for new Search | Google operator | Read campaignCriterion resource name, negative=true, exact text and match type. Preserve existing three negatives | Remove only recorded newly created criterion if it blocks valid offered intent |
| G03-10 | Google campaign 23822598651 / new negative criterion | Absent unless L01 finds exact duplicate | Create negative keyword EXACT: biliárd játékszabályok | L01 term and duplicate check, S01 for new Search | Google operator | Read campaignCriterion resource name, negative=true, exact text and match type. Preserve existing three negatives | Remove only recorded newly created criterion if it blocks valid offered intent |
| G03-11 | Google campaign 23822598651 / new negative criterion | Absent unless L01 finds exact duplicate | Create negative keyword EXACT: biliard szabalyok | L01 term and duplicate check, S01 for new Search | Google operator | Read campaignCriterion resource name, negative=true, exact text and match type. Preserve existing three negatives | Remove only recorded newly created criterion if it blocks valid offered intent |
| G03-12 | Google campaign NEW_SEARCH_ID / new negative criterion | Absent unless L01 finds exact duplicate | Create negative keyword PHRASE: használt biliárd | L01 term and duplicate check, S01 for new Search | Google operator | Read campaignCriterion resource name, negative=true, exact text and match type. Preserve existing three negatives | Remove only recorded newly created criterion if it blocks valid offered intent |
| G03-13 | Google campaign NEW_SEARCH_ID / new negative criterion | Absent unless L01 finds exact duplicate | Create negative keyword PHRASE: használt biliard | L01 term and duplicate check, S01 for new Search | Google operator | Read campaignCriterion resource name, negative=true, exact text and match type. Preserve existing three negatives | Remove only recorded newly created criterion if it blocks valid offered intent |
| G03-14 | Google campaign NEW_SEARCH_ID / new negative criterion | Absent unless L01 finds exact duplicate | Create negative keyword EXACT: biliárd játékszabályok | L01 term and duplicate check, S01 for new Search | Google operator | Read campaignCriterion resource name, negative=true, exact text and match type. Preserve existing three negatives | Remove only recorded newly created criterion if it blocks valid offered intent |
| G03-15 | Google campaign NEW_SEARCH_ID / new negative criterion | Absent unless L01 finds exact duplicate | Create negative keyword EXACT: biliard szabalyok | L01 term and duplicate check, S01 for new Search | Google operator | Read campaignCriterion resource name, negative=true, exact text and match type. Preserve existing three negatives | Remove only recorded newly created criterion if it blocks valid offered intent |
| G04-create-356742283231 | Google asset group 6710749813 / HEADLINE | Old asset 356742283231 linked | Create and link replacement text asset: Nézzük meg, elfér-e Önnél | L01 exact association snapshot, text length and product fact check | Google operator | Read new asset ID/text, association field type and approval status. Wait for usable replacement before detach | Remove new association if incorrect, preserve reusable asset |
| G04-detach-356742283231 | Google asset group 6710749813 / asset 356742283231 | Existing association active | Detach only this association after replacement is eligible. Do not delete global asset | G04-create-356742283231 | Google operator | Read association list proving old unlinked and replacement eligible | Restore safe prior association only if truthful. Never restore unsupported small-space claim, retain replacement or pause affected ad group asset delivery for repair |
| G04-create-358503961379 | Google asset group 6710749813 / LONG_HEADLINE | Old asset 358503961379 linked | Create and link replacement text asset: Étkező és biliárd egy asztalban. Ismerje meg az átalakítást és a helyigényt! | L01 exact association snapshot, text length and product fact check | Google operator | Read new asset ID/text, association field type and approval status. Wait for usable replacement before detach | Remove new association if incorrect, preserve reusable asset |
| G04-detach-358503961379 | Google asset group 6710749813 / asset 358503961379 | Existing association active | Detach only this association after replacement is eligible. Do not delete global asset | G04-create-358503961379 | Google operator | Read association list proving old unlinked and replacement eligible | Restore safe prior association only if truthful. Never restore unsupported small-space claim, retain replacement or pause affected ad group asset delivery for repair |
| G05-2491387565239 | customers/2938223921/assetGroupSignals/6710749813~2491387565239 | prémium kategóriás étkezôasztal | Remove this dining-only theme | L01 exact ID/text match | Google operator | Read this target signal absent, every other pre-step theme unchanged, all eight retained dual-use themes present and audience 353331695 unchanged. Allow intermediate totals 13 through 8. Final count applies only at G05 group acceptance | Recreate exact removed theme only if later query evidence supports valuable dual-use intent. Record new resource ID |
| G05-2491387582279 | customers/2938223921/assetGroupSignals/6710749813~2491387582279 | luxus étkezôasztal | Remove this dining-only theme | L01 exact ID/text match | Google operator | Read this target signal absent, every other pre-step theme unchanged, all eight retained dual-use themes present and audience 353331695 unchanged. Allow intermediate totals 13 through 8. Final count applies only at G05 group acceptance | Recreate exact removed theme only if later query evidence supports valuable dual-use intent. Record new resource ID |
| G05-2493824310920 | customers/2938223921/assetGroupSignals/6710749813~2493824310920 | egyedi étkezôasztal | Remove this dining-only theme | L01 exact ID/text match | Google operator | Read this target signal absent, every other pre-step theme unchanged, all eight retained dual-use themes present and audience 353331695 unchanged. Allow intermediate totals 13 through 8. Final count applies only at G05 group acceptance | Recreate exact removed theme only if later query evidence supports valuable dual-use intent. Record new resource ID |
| G05-2493824311080 | customers/2938223921/assetGroupSignals/6710749813~2493824311080 | design étkezôasztal | Remove this dining-only theme | L01 exact ID/text match | Google operator | Read this target signal absent, every other pre-step theme unchanged, all eight retained dual-use themes present and audience 353331695 unchanged. Allow intermediate totals 13 through 8. Final count applies only at G05 group acceptance | Recreate exact removed theme only if later query evidence supports valuable dual-use intent. Record new resource ID |
| G05-2493824311120 | customers/2938223921/assetGroupSignals/6710749813~2493824311120 | dizájn étkezôasztal | Remove this dining-only theme | L01 exact ID/text match | Google operator | Read this target signal absent, every other pre-step theme unchanged, all eight retained dual-use themes present and audience 353331695 unchanged. Allow intermediate totals 13 through 8. Final count applies only at G05 group acceptance | Recreate exact removed theme only if later query evidence supports valuable dual-use intent. Record new resource ID |
| G05-2493824317800 | customers/2938223921/assetGroupSignals/6710749813~2493824317800 | exkluzív étkezôasztal | Remove this dining-only theme | L01 exact ID/text match | Google operator | Read this target signal absent, every other pre-step theme unchanged, all eight retained dual-use themes present and audience 353331695 unchanged. Allow intermediate totals 13 through 8. Final count applies only at G05 group acceptance | Recreate exact removed theme only if later query evidence supports valuable dual-use intent. Record new resource ID |
| M02-120252434759680184 | Meta ad 120252434759680184 / belga_biliard_carousel_3 | ACTIVE | PAUSED, retain creative and history | L01 snapshot. Pause carousel 3 first, then other challengers. Keep 120252431814340184 and 120252434759690184 | Meta operator | Read this ad PAUSED by status and effective_status, all other pre-step ad statuses unchanged, parent ad set 120252431814280184 unchanged, and both retained anchors still ACTIVE. Allow intermediate active totals 11 through 2. Final count applies only at M02 group acceptance | Restore only selected ad status from snapshot, one challenger at a time. This is concentration, not proof of failure |
| M02-120252431814260184 | Meta ad 120252431814260184 / belga_biliard_carousel_pergola_1 | ACTIVE | PAUSED, retain creative and history | L01 snapshot. Pause carousel 3 first, then other challengers. Keep 120252431814340184 and 120252434759690184 | Meta operator | Read this ad PAUSED by status and effective_status, all other pre-step ad statuses unchanged, parent ad set 120252431814280184 unchanged, and both retained anchors still ACTIVE. Allow intermediate active totals 11 through 2. Final count applies only at M02 group acceptance | Restore only selected ad status from snapshot, one challenger at a time. This is concentration, not proof of failure |
| M02-120252431814290184 | Meta ad 120252431814290184 / belga_biliard_carousel_elenk-meleg | ACTIVE | PAUSED, retain creative and history | L01 snapshot. Pause carousel 3 first, then other challengers. Keep 120252431814340184 and 120252434759690184 | Meta operator | Read this ad PAUSED by status and effective_status, all other pre-step ad statuses unchanged, parent ad set 120252431814280184 unchanged, and both retained anchors still ACTIVE. Allow intermediate active totals 11 through 2. Final count applies only at M02 group acceptance | Restore only selected ad status from snapshot, one challenger at a time. This is concentration, not proof of failure |
| M02-120252431814270184 | Meta ad 120252431814270184 / belga_biliard_carousel_fa-meleg | ACTIVE | PAUSED, retain creative and history | L01 snapshot. Pause carousel 3 first, then other challengers. Keep 120252431814340184 and 120252434759690184 | Meta operator | Read this ad PAUSED by status and effective_status, all other pre-step ad statuses unchanged, parent ad set 120252431814280184 unchanged, and both retained anchors still ACTIVE. Allow intermediate active totals 11 through 2. Final count applies only at M02 group acceptance | Restore only selected ad status from snapshot, one challenger at a time. This is concentration, not proof of failure |
| M02-120252431814320184 | Meta ad 120252431814320184 / belga_biliard_carousel_elegans | ACTIVE | PAUSED, retain creative and history | L01 snapshot. Pause carousel 3 first, then other challengers. Keep 120252431814340184 and 120252434759690184 | Meta operator | Read this ad PAUSED by status and effective_status, all other pre-step ad statuses unchanged, parent ad set 120252431814280184 unchanged, and both retained anchors still ACTIVE. Allow intermediate active totals 11 through 2. Final count applies only at M02 group acceptance | Restore only selected ad status from snapshot, one challenger at a time. This is concentration, not proof of failure |
| M02-120252434759670184 | Meta ad 120252434759670184 / belga_biliard_carousel_2 | ACTIVE | PAUSED, retain creative and history | L01 snapshot. Pause carousel 3 first, then other challengers. Keep 120252431814340184 and 120252434759690184 | Meta operator | Read this ad PAUSED by status and effective_status, all other pre-step ad statuses unchanged, parent ad set 120252431814280184 unchanged, and both retained anchors still ACTIVE. Allow intermediate active totals 11 through 2. Final count applies only at M02 group acceptance | Restore only selected ad status from snapshot, one challenger at a time. This is concentration, not proof of failure |
| M02-120252431814360184 | Meta ad 120252431814360184 / belga_biliard_carousel_turkiz-kek | ACTIVE | PAUSED, retain creative and history | L01 snapshot. Pause carousel 3 first, then other challengers. Keep 120252431814340184 and 120252434759690184 | Meta operator | Read this ad PAUSED by status and effective_status, all other pre-step ad statuses unchanged, parent ad set 120252431814280184 unchanged, and both retained anchors still ACTIVE. Allow intermediate active totals 11 through 2. Final count applies only at M02 group acceptance | Restore only selected ad status from snapshot, one challenger at a time. This is concentration, not proof of failure |
| M02-120252431814350184 | Meta ad 120252431814350184 / belga_biliard_carousel_pergola_2 | ACTIVE | PAUSED, retain creative and history | L01 snapshot. Pause carousel 3 first, then other challengers. Keep 120252431814340184 and 120252434759690184 | Meta operator | Read this ad PAUSED by status and effective_status, all other pre-step ad statuses unchanged, parent ad set 120252431814280184 unchanged, and both retained anchors still ACTIVE. Allow intermediate active totals 11 through 2. Final count applies only at M02 group acceptance | Restore only selected ad status from snapshot, one challenger at a time. This is concentration, not proof of failure |
| M02-120252435143720184 | Meta ad 120252435143720184 / belga_biliard_carousel_5 | ACTIVE | PAUSED, retain creative and history | L01 snapshot. Pause carousel 3 first, then other challengers. Keep 120252431814340184 and 120252434759690184 | Meta operator | Read this ad PAUSED by status and effective_status, all other pre-step ad statuses unchanged, parent ad set 120252431814280184 unchanged, and both retained anchors still ACTIVE. Allow intermediate active totals 11 through 2. Final count applies only at M02 group acceptance | Restore only selected ad status from snapshot, one challenger at a time. This is concentration, not proof of failure |
| M02-120252508230230184 | Meta ad 120252508230230184 / belga_biliard_carousel_6 | ACTIVE | PAUSED, retain creative and history | L01 snapshot. Pause carousel 3 first, then other challengers. Keep 120252431814340184 and 120252434759690184 | Meta operator | Read this ad PAUSED by status and effective_status, all other pre-step ad statuses unchanged, parent ad set 120252431814280184 unchanged, and both retained anchors still ACTIVE. Allow intermediate active totals 11 through 2. Final count applies only at M02 group acceptance | Restore only selected ad status from snapshot, one challenger at a time. This is concentration, not proof of failure |
| S01 | Google / NEW_SEARCH_ID + NEW_SEARCH_BUDGET_ID | Not created. Old Search 23807787756 PAUSED | Create dedicated nonshared DAILY budget 1500000000 micros and PAUSED FT_Search_DualUse_Test with Search spec below | L01, exact schema/field validation in current provider UI or API | Google operator | Record returned IDs. Read paused campaign, budget resource, 1500 HUF, nonshared, network, geo, languages, goal and bid fields | Keep paused on any error, remove only empty draft if appropriate. Never activate old Search |
| S02 | Google NEW_SEARCH_ID / NEW_ADGROUP_ID | No ad group | Create enabled DualUse ad group inside paused campaign | S01 | Google operator | Read exact parent ID, name and status | Pause new ad group, leave campaign paused |
| S03-38 | Google NEW_ADGROUP_ID / new keyword | Absent | EXACT: biliárd étkezőasztal | S02, duplicate check | Google operator | Read criterion ID, parent, text, match and eligibility. No broad match | Pause/remove only this new criterion |
| S03-39 | Google NEW_ADGROUP_ID / new keyword | Absent | PHRASE: biliárd étkezőasztal | S02, duplicate check | Google operator | Read criterion ID, parent, text, match and eligibility. No broad match | Pause/remove only this new criterion |
| S03-40 | Google NEW_ADGROUP_ID / new keyword | Absent | EXACT: étkező biliárdasztal | S02, duplicate check | Google operator | Read criterion ID, parent, text, match and eligibility. No broad match | Pause/remove only this new criterion |
| S03-41 | Google NEW_ADGROUP_ID / new keyword | Absent | PHRASE: étkező biliárdasztal | S02, duplicate check | Google operator | Read criterion ID, parent, text, match and eligibility. No broad match | Pause/remove only this new criterion |
| S03-42 | Google NEW_ADGROUP_ID / new keyword | Absent | EXACT: biliárdasztal étkezőasztal | S02, duplicate check | Google operator | Read criterion ID, parent, text, match and eligibility. No broad match | Pause/remove only this new criterion |
| S03-43 | Google NEW_ADGROUP_ID / new keyword | Absent | PHRASE: biliárdasztal étkezőasztal | S02, duplicate check | Google operator | Read criterion ID, parent, text, match and eligibility. No broad match | Pause/remove only this new criterion |
| S03-44 | Google NEW_ADGROUP_ID / new keyword | Absent | EXACT: átalakítható biliárdasztal | S02, duplicate check | Google operator | Read criterion ID, parent, text, match and eligibility. No broad match | Pause/remove only this new criterion |
| S03-45 | Google NEW_ADGROUP_ID / new keyword | Absent | PHRASE: átalakítható biliárdasztal | S02, duplicate check | Google operator | Read criterion ID, parent, text, match and eligibility. No broad match | Pause/remove only this new criterion |
| S03-46 | Google NEW_ADGROUP_ID / new keyword | Absent | EXACT: biliárdasztal fedőlappal | S02, duplicate check | Google operator | Read criterion ID, parent, text, match and eligibility. No broad match | Pause/remove only this new criterion |
| S03-47 | Google NEW_ADGROUP_ID / new keyword | Absent | PHRASE: biliárdasztal fedőlappal | S02, duplicate check | Google operator | Read criterion ID, parent, text, match and eligibility. No broad match | Pause/remove only this new criterion |
| S04 | Google NEW_ADGROUP_ID / NEW_RSA_ID | Absent | Create one enabled RSA with exact corrected copy below, unpinned, final URL current product page | S02, copy validation and full destination/3D planner link QA | Google operator | Read all four headlines/two descriptions, final URL, policy status. Campaign remains paused | Pause RSA and repair only rejected/mismatched fields, preserve corrected copy |
| S05 | Google NEW_SEARCH_ID / tracking settings | Unset on new campaign | Set final URL suffix from Search spec and use verified account auto-tagging. Retain gclid through redirects/form capture under consent | S01, T01 and L01 account tracking snapshot | Google operator + tracking engineer | Use provider URL test and consent-aware browser navigation to verify one query string, stable IDs, no unresolved macros after real eligible click | Restore suffix snapshot, fix parsing before activation. Never send personal data in URL |
| B01 | Google campaignBudget 15557925992 | 3000000000 micros = 3000 HUF/day | 1500000000 micros = 1500 HUF/day | T01, G01b, S01–S05, negatives, Search eligibility and launch gate | Google operator | Read 1500 HUF and exactly one owner PMax 23822598651, record transfer reservation 1500 | If Search activation fails, restore 3000000000 micros after confirming Search paused |
| B02 | Google NEW_SEARCH_ID | PAUSED, 1500 HUF budget reserved by B01 | ENABLED | B01 readback, all tracking gates, only one enabled Search test | Google operator | Read enabled/eligible and reconcile PMax 1500 + Search 1500 = 3000. Old Search still paused | Pause Search first, then return 1500 to PMax, confirm final 3000 Google allocation |
| M01-create | Meta act_1783210591808804 / NEW_C1_CAMPAIGN_ID | Not created | Create PAUSED C1 OUTCOME_LEADS campaign at 3000 HUF/day campaign budget, no extra ad-set budget | T01–T03. Resolve provider HUF budget unit in L01, no blind micros reuse | Meta operator | Record ID and read objective, paused status, account/currency and UI 3000 HUF/day. Reserve budget by transition protocol only at activation | Keep paused, old campaign allocation remains until transfer |
| M03-adset | Meta NEW_C1_CAMPAIGN_ID / NEW_C1_ADSET_ID | Not created | Create paused website OFFSITE_CONVERSIONS ad set using pixel 1098642584214800, LEAD and C1 settings below | M01-create and successful-submit/dedup proof | Meta operator | Read objective/location/pixel/LEAD, audience controls, placements and supported attribution. Inspect policy/eligibility. Do not retry old rejected promoted_object edit | Keep new ad set paused. Resolve exact incompatibility, never silently use form-start or revive archived ad set |
| M03-benchmark | Meta NEW_C1_ADSET_ID / NEW_C1_BENCHMARK_AD_ID | Not created | Create paused benchmark from ad 120252431814340184 creative snapshot, preserve story/assets with stable URL tags below | M03-adset, L04 page/Instagram/creative IDs, destination and media QA | Meta operator + creative producer | Record new ad/creative IDs, read full copy, story, media, CTA LEARN_MORE, URL/tags, preview every eligible placement and policy approval | Keep paused or restore previous approved creative. No missing media placeholders may go live |
| M03-challenger | Meta NEW_C1_ADSET_ID / NEW_C1_CHALLENGER_AD_ID | Not created | Create paused C1-01 using accepted copy and C1-CR01 brief, produce approved media before launch with stable URL tags below | M03-adset, L04 page/Instagram/creative IDs, destination and media QA | Meta operator + creative producer | Record new ad/creative IDs, read full copy, story, media, CTA LEARN_MORE, URL/tags, preview every eligible placement and policy approval | Keep paused or restore previous approved creative. No missing media placeholders may go live |
| B03 | Meta old campaign 120247127071870184 | ACTIVE at 3000 HUF/day | PAUSED, retaining configured budget/history | New C1 campaign/adset/two ads eligible, T01–T03, transfer snapshot | Meta operator | Read effective paused status of old hierarchy. Reserve the 3000 allocation for C1, no overlap | If C1 activation fails, keep C1 paused then restore old campaign only with degraded signal warning and operator decision |
| B04 | Meta NEW_C1_CAMPAIGN_ID hierarchy | PAUSED with 3000 reserved | Enable two approved ads and one LEAD ad set under paused campaign, then enable campaign last | B03 readback, M03 rows | Meta operator | Read one active Meta campaign, campaign 3000 HUF/day, no additive adset budget, LEAD event and exactly two active ads | Pause C1 campaign first, then restore old campaign if technical baseline is usable. Do not run both |
| S06 | Google NEW_SEARCH_ID bidding strategy | Maximize Clicks, 350 HUF CPC cap | Later switch to Maximize Conversions with no target CPA only after operational review | Reliable successful-submit signal, observed lead volume and delivery stability, recorded review. No universal conversion-count threshold | Google operator | Read strategy and absent target CPA, compare spend/query/lead behavior over stable review window | Restore previous Maximize Clicks/cap if delivery materially deteriorates, hold budget constant |
| M04-create | Meta NEW_C2_CAMPAIGN_ID hierarchy | Not created | Build PAUSED C2 by repeating M01-create/M03-adset/benchmark/challenger rows with C2 settings and C2-01. Record separate campaign/adset/ad/creative IDs | C1 mature review, same validated event and attribution, produced C2 media | Meta operator + creative producer | Same complete draft readbacks as C1, with Pool/Cue sports suggestions and C2 copy | Keep draft paused if any gate fails, C1 retains allocation |
| B05 | Meta NEW_C1_CAMPAIGN_ID | ACTIVE, 3000 | PAUSED, retain configured budget and inventory | C2 draft ready and C1 closed-cohort decision recorded | Meta operator | Read C1 effective paused status, reserve same 3000 for C2 | Keep C2 paused and reactivate C1 if transfer cannot finish and C1 remains technically valid |
| B06 | Meta NEW_C2_CAMPAIGN_ID hierarchy | PAUSED, 3000 reserved | Enable approved hierarchy then campaign last at 3000 | B05, M04-create | Meta operator | Read C1 inactive + C2 active, only one 3000 Meta allocation | Pause C2 first and restore C1 with prior settings. No combined 6000 Meta allocation |
| M05 | Meta selected C1 or C2 ad set / resolved winner ID | Instagram and Threads baseline | Add Facebook Feed and Reels where website-LEAD eligibility supports them. Keep original placements, exclude Audience Network | Stable message-test winner, 4:5 and 9:16 assets ready, exact original placement snapshot | Meta operator | Read eligible placements and previews, unchanged audience/event/copy/budget. No Facebook delivery previously is not proof of no demand | Remove only added Facebook placements on defect or mature deterioration, restore exact saved eligibility |
| M06-build | WordPress product variant / resolve L02 | Only current /billiardasztal/ is approved destination | Prepare private C1 /billiardasztal/otthon/ variant with selected persona, actual transformation, 490 × 395 cm clearance or 438 × 342 cm with 122 cm cues, custom quote, finish choices, order/delivery/access and optional room dimensions | Accepted C1 landing draft, verified product facts, source backup. Separate website execution, no site writes in this package | Web implementer | Later verify desktop/mobile form success, consent, UTMs, links, no false price/availability promise and successful event/register match before publishing or routing traffic | Restore prior page revision and source assets, retain live existing page |
| M06-route | Google NEW_RSA_ID and C1 new ads final destination | https://fusiontables.hu/billiardasztal/ | Only after verified C1 variant: route relevant C1/Search ads to /billiardasztal/otthon/. C2 stays current until its own /billiardasztal/vendeglatas/ variant passes same build/QA gate | M06-build published and live form/tracking readback, exact URL snapshot | Google/Meta operator + web implementer | One ad URL edit per saved ad ID, final URL and tags readback, all mobile paths and provider eligibility. New revisions paused until approved where needed | Restore each prior URL individually immediately on form/tracking/layout defect. Keep current destination until proof exists |

## Final group acceptance

After all six G05 removals, independently read exactly eight retained dual-use themes, none of the six removed targets, and unchanged audience 353331695. Before this group check, intermediate totals 13, 12, 11, 10 and 9 are expected and are not mismatches.

After all ten M02 pauses, independently read exactly two active ads: 120252431814340184 and 120252434759690184. Carousel 3 (120252434759680184) is first. Intermediate active totals 11 through 3 are expected and are not mismatches. Run these group checks before beginning the next dependent phase.

## Search launch specification (G02 + corrected G05)

- Campaign `FT_Search_DualUse_Test`, one `DualUse` ad group, one RSA. Old Search **23807787756 remains PAUSED**.
- Dedicated nonshared daily budget 1500 HUF = **1500000000 micros**. Maximize Clicks (historical API label TARGET_SPEND), **350 HUF max CPC = 350000000 micros**, standard delivery. Read current provider representation instead of relying on renamed UI labels.
- Google Search on, Search partners off, Display off. Hungary presence targeting, not presence-or-interest. Resolve Hungary geo criterion and Hungarian/English language constants by exact canonical name/country in provider lookup and record IDs before creation. Hungarian ads, both campaign languages. All devices, adult demographic categories and Unknown included. All-day schedule in Europe/Budapest. No new audience restrictions or device/age exclusions. Inspect inherited account-level exclusions and log them, do not silently remove them.
- Campaign-specific custom goal: only validated submitted-enquiry action under G01b. Do not inherit engagement, offline quote/order or phone goals into the test. Read effective campaign goal configuration, not just account defaults.
- Exactly ten positive keywords: each term below in EXACT and PHRASE. No broad match. Existing three PMax exact negatives stay: `használt biliárd asztal`, `használt biliárd asztal eladó`, `biliárd szabályok`. The four new exclusions in G03 apply separately to PMax and new Search. No blanket negative `ár` or account-wide accessories exclusion.

| Term | Match forms |
| --- | --- |
| biliárd étkezőasztal | EXACT + PHRASE |
| étkező biliárdasztal | EXACT + PHRASE |
| biliárdasztal étkezőasztal | EXACT + PHRASE |
| átalakítható biliárdasztal | EXACT + PHRASE |
| biliárdasztal fedőlappal | EXACT + PHRASE |

### Exact RSA copy

User correction is authoritative over accepted source G05. Verbatim, zero punctuation or character-limit changes. No pinning and no extra generated headline.

| Field | Exact text | Characters / limit |
| --- | --- | --- |
| Headline 1 | Étkező és biliárd egyben | 24 / 30 |
| Headline 2 | 2 Funkció, 1 Asztal | 19 / 30 |
| Headline 3 | Prémium felületek és anyagok | 28 / 30 |
| Headline 4 | Egyedi színkombinációk | 22 / 30 |
| Description 1 | Étkezőasztal és biliárd egyben. Nézze meg a 3D tervezőnket! | 59 / 90 |
| Description 2 | Budai bemutatótermi vagy online egyeztetés. Kérjen személyre szabott ajánlatot! | 79 / 90 |

Final URL: **https://fusiontables.hu/billiardasztal/** until the C1 variant has passed M06. Before activation verify that the promised 3D planner is actually reachable and functional from this destination. If not, hold this RSA, repair the route and preserve the user's wording. Do not silently substitute the earlier copy.

Planned final URL suffix (without a leading `?`):

```text
utm_source=google&utm_medium=cpc&utm_campaign=FT_Search_DualUse_Test&utm_id={campaignid}&utm_content={creative}&utm_term={keyword}&adgroup_id={adgroupid}&matchtype={matchtype}&device={device}
```

Use verified auto-tagging alongside these parameters. If auto-tagging is off, snapshot the account setting, enable only in the separate execution phase after compatibility checks, read it back and restore its prior value if redirects break. Never overwrite an existing account tracking template without inspecting its purpose. This row's object is Google customer 2938223921 tracking setting, owned by the Google operator, dependent on L01/T01. Preserve query parameters through the landing/form, store IDs without personal data in URLs. Test macro expansion with provider URL testing and the next eligible real click.

## Meta C1 and C2 construction details

Both are new OUTCOME_LEADS website campaigns, one ad set each, campaign budget only, 3000 HUF/day, lowest-cost/max-volume bidding without invented cost caps. Use pixel **1098642584214800**, standard **LEAD**, OFFSITE_CONVERSIONS, billing IMPRESSIONS. Resolve current supported configuration while paused. Match current supported attribution of 7-day click, 1-day view and 1-day engaged-video view if eligible. If any option is unavailable, record the accepted attribution and compare like-for-like windows later. Never substitute form-start optimization to bypass eligibility.

HU, minimum age 25, 65+ included, all genders, no language restriction, Hungarian creative. Advantage+ audience suggestions, not guaranteed exclusive interest targeting. C1: Interior design **6002920953955** OR Modern furniture **6003253467911**. C2: Pool (cue sports) **6003070550582** OR Cue sports **6003293937628**. If unavailable at creation, omit interests and retain HU 25+ broad with the persona creative, recording the deviation. No luxury/travel/shopping stack. Custom audiences were empty, no assumed exclusion audience or raw-lead upload.

Baseline placements: Instagram stream, story, reels, explore_home and Threads threads_stream, mobile and desktop where eligible. Read the supported LEAD configuration. If a placement is rejected, omit only that unsupported placement and record the revised baseline before testing. Facebook Feed/Reels belongs to M05 later. Audience Network stays excluded.

One benchmark plus one challenger, at most two active ads. Recreate carousel 1 benchmark from exact accepted creative, preserve story when supported, and record any unavoidable rendering change. C1-01 first, C2-01 only after sequential transfer. Production assets do not yet exist for new videos. The accepted briefs below are required input to the creative producer, not proof of completed media.

Meta URL tags:

```text
utm_source={{site_source_name}}&utm_medium=paidsocial&utm_campaign={{campaign.name}}&utm_content={{ad.id}}&utm_term={{adset.id}}
```

Current destination for both: `https://fusiontables.hu/billiardasztal/`. C1 future `/billiardasztal/otthon/`, C2 future `/billiardasztal/vendeglatas/`. Neither future path is assumed live. C2 is indoor home hosting, not a hotel ROI claim.

### C1 launch copy and production brief

| Field | Value |
| --- | --- |
| id | C1-01 |
| angle | Transformation |
| primaryText | Vacsora után jöhet a biliárd. Ugyanazon az asztalon. A Fusion Tables belga étkező- és biliárdasztala a mindennapi otthon része, fedőlapjai alatt valódi játékfelülettel. Nézze meg az átalakítást, majd egyeztessünk a helyigényről és az Önhöz illő kivitelről. |
| headline | Étkezőből biliárdasztal |
| description | Egy asztal, kétféle közös idő. |
| cta | További információ |
| ctaType | LEARN_MORE |
| creativeId | C1-CR01 |

```json
{
  "id": "C1-CR01",
  "copyId": "C1-01",
  "format": "Video 9:16, 15 seconds, separate 4:5 feed crop",
  "brief": "Locked camera, real indoor dining room, approved Black Mat frame with Walnut Select finish. 0–2s show split dining/pool view, label „Étkező + biliárd”. 2–6s remove covers safely, place them on the actual storage stand. 6–10s show Easy Lift operation without speed claim. 10–13s two adults play with clear cue space. 13–15s full table, label „Nézze meg a helyigényt”. CTA „További információ”. Capture actual mechanism, no invented animation.",
  "assetReference": "Current Fusion product/finish references in landing-browser.json. Reuse exact indoor product assets after checking shown finish. C1-CR01/C2-CR01 can use a new authentic transformation shoot. Existing examples: img-20240619-121427.webp and img-20240619-123833.webp show the same dining/pool setup, but are pergola imagery and must not be mislabeled as the proposed indoor shoot.",
  "productionRule": "Finished concept, not generated media. Real product and approved color combinations. Keep Hungarian labels inside safe margins, high contrast and legible on mobile. Caption spoken content. No fabricated testimonial, price, delivery deadline or weatherproof promise."
}
```

### C2 launch copy and production brief

| Field | Value |
| --- | --- |
| id | C2-01 |
| angle | Host evening |
| primaryText | A vacsora véget ért. Az este még nem. A Fusion Tables étkezőasztal fedőlapjai alatt 7 lábas pool játékfelület várja a következő közös programot. Nézze meg működés közben, és egyeztessünk arról, hogyan illeszkedne az otthoni vendégtérbe. |
| headline | Maradjon együtt a társaság |
| description | Étkezés után biliárd ugyanott. |
| cta | További információ |
| ctaType | LEARN_MORE |
| creativeId | C2-CR01 |

```json
{
  "id": "C2-CR01",
  "copyId": "C2-01",
  "format": "Video 9:16, 15 seconds, separate 4:5 crop",
  "brief": "Real indoor evening with four adult friends, Black Mat/Walnut Select table and burgundy cloth only if approved combination is photographed. 0–2s covered/uncovered split, „Vacsora után biliárd”. 2–6s guests clear plates, covers move to safe storage. 6–11s one shot and natural conversation. 11–15s wider room, cue clearance visible, „Maradjon együtt a társaság”. CTA „Nézze meg a részleteket”. No alcohol emphasis.",
  "assetReference": "Current Fusion product/finish references in landing-browser.json. Reuse exact indoor product assets after checking shown finish. C1-CR01/C2-CR01 can use a new authentic transformation shoot. Existing examples: img-20240619-121427.webp and img-20240619-123833.webp show the same dining/pool setup, but are pergola imagery and must not be mislabeled as the proposed indoor shoot.",
  "productionRule": "Finished concept, not generated media. Real product and approved color combinations. Keep Hungarian labels inside safe margins, high contrast and legible on mobile. Caption spoken content. No fabricated testimonial, price, delivery deadline or weatherproof promise."
}
```

Full ten-copy/ten-brief inventory per persona and complete landing drafts: [accepted campaign copy](../fusion-ppc-decisions-20260913/campaign-copy.md), [structured packages](../fusion-ppc-decisions-20260913/campaigns.json). Rotate only one challenger after a stable review, do not activate the whole inventory.

## Mutually exclusive budget stages

| Stage | Earliest window, shifts with gates | PMax | Search | Old Meta | C1 | C2 | Total |
| --- | --- | --- | --- | --- | --- | --- | --- |
| Repair and preserve baseline | 2026-09-14 to 2026-09-20 | 3000 | 0 | 3000 | 0 | 0 | 6000 |
| C1 + controlled Search | 2026-09-21 to 2026-10-18 | 1500 | 1500 | 0 | 3000 | 0 | 6000 |
| C1 mature read, no new test | 2026-10-19 to 2026-10-25 | 1500 | 1500 | 0 | 3000 | 0 | 6000 |
| C2 sequential test | 2026-10-26 to 2026-11-22 | 1500 | 1500 | 0 | 0 | 3000 | 6000 |
| C2 mature read | 2026-11-23 to 2026-11-29 | 1500 | 1500 | 0 | 0 | 3000 | 6000 |
| Placement test on selected winner (C2 shown) | 2026-11-30 to 2026-12-13 | 1500 | 1500 | 0 | 0 | 3000 | 6000 |
| Rollback alternative, not additive | 2026-09-21 to 2026-12-13 | 3000 | 0 | 3000 | 0 | 0 | 6000 |

These are planning slots, not scheduled activations. The placement row shows C2 only illustratively, use C1 instead if selected, with the same 3000 transferred. Google and Meta launch gates may clear separately: while only one platform transitions, its allocation remains 3000 and the other stays at its preceding 3000 stage. Paused historic Google budgets 6651052786 (1450), 6661051640 (50), 6804583137 (200) and 15551313540 (2000) remain dormant, not additional funds.

## Reviews, keep / stop and rollback

- **Immediate technical stop:** broken form/destination, wrong goal/event, duplicate submission identity, unexpected budget overlap or incorrect object. Pause affected new campaign first, preserve receipts, repair or revert the exact failed row. A broken baseline is not a safe automatic rollback. Reserve unspent allocation during repair, do not force delivery just to fill a budget.
- **Seven complete days:** inspect Search terms and relevance, negative coverage, eligible delivery, destination and event/register reconciliation. If Search has no relevant delivery, inspect auction eligibility, bids and volume. Phrase forms are already included, so do not add them twice. Review query fit within these ten keywords before any separate proposal to broaden. Weekly contact outcomes remain submitted / contacted / fit / price / quote / order, not one merged conversion total.
- **Fourteen complete days + seven-day maturation:** first Meta portfolio read. Carousel 3 historical 7672 HUF with zero leads is below the planning cap. Pausing it is opportunity-cost concentration. Carousel 1's latest zero on 604 HUF is not grounds to call it a loser. Keep carousel 1 (14 historical attributed Leads on 91841 HUF) and carousel 4 (5 on 40427 HUF) as descriptive anchors, not causal proof.
- **Meta zero-lead challenger cap:** 20404 HUF, explicitly 2 × provisional recent CPL 10202, a planning heuristic, not statistical failure. Track spend per challenger, including later partial days. At cap pause that challenger's further exposure, preserve the benchmark within the same campaign allocation, then reread the closed cohort at least seven days after its last eligible exposure before stop/resume. If the whole test must pause, use the transfer/reservation protocol. Do not restart with a new ID merely to reset accumulated test spend.
- **Twenty-eight stable days + seven days:** compare closed exposure cohorts, not the latest rolling totals. Campaign may keep delivering during a mature read, but later exposures are excluded from that review. Meta prior Aug 16–29 comparison: 41914 / 7 = **5987.71 HUF per platform-attributed Lead**. Recent Aug 30–Sep 12: 40808 / 4 = **10202 HUF**, provisional. Retain if mature CPL is no worse and actual suitable-enquiry evidence supports it. Better quality but higher CPL needs an explicit tradeoff note. Sparse/incomparable results are inconclusive, retain one cell and do not announce an interest winner.
- **Search cap:** 28 × 1500 = **42000 HUF** planning exposure. If actual spend reaches 42000 with no submitted enquiries, pause further Search spending pending a seven-day closed-cohort read. At mature 42000 and zero submitted enquiries stop Search and restore its 1500 to validated PMax. If enquiries exist, compare quality and CPL against concurrent routes, retain if no worse. Do not treat Google form-start CPA as lead CPL. Re-read later attribution if platform diagnostics indicate longer lag, seven days is not a guarantee of final attribution.
- **G04 copy and M06 landing:** after 28 stable days, compare fit objections and suitable volume among contacted enquiries. Never restore unsupported small-space claims. On mobile/form/tracking defect restore the previously verified URL immediately.
- **G05 themes:** low causal confidence, themes cannot force PMax into Search. Restore one removed theme only with relevant dual-use query evidence. Preserve age/device/geographic controls unless a later mature qualified sample supports change.
- **M05 placements:** 14 complete days plus seven-day read, keep only if mature efficiency/quality not worse and no crop defect. Remove added eligibility on material deterioration, keep event/audience/copy/budget unchanged.
- **Offline:** keep quote/order secondary until the first real matched imports and deduplication are verified. A later promotion is a separate explicit operator decision with before/after/readback, never an automatic checkbox. Stop bad imports, do not invent qualification or purchase values.

No automated performance winner is implied. Four recent actual submitted enquiries, four Meta attributed pixel Leads and nine GA4 aggregate events are separate measurements. Google records zero recent submitted-action attribution and 21.976531 form starts. These cannot be summed as people. Prior register period is seven valid submissions plus four unresolved ancillary rows. Qualified totals are unavailable.
