Fusion Tables, internal only
What the six-deck pack contains, the five live measurement defects behind it, the ordered fix plan, and what still cannot be sourced. This deck also carries the self-QA and acceptance results for the whole pack.
This run
Why this deck exists
| ID | Severity | Defect |
|---|---|---|
| F-21 | Critical | A cached page has served one visitor's UTM and Google click ID inside live form action URLs to the next visitor since a clean HIT was graded on 2026-07-30. Never fixed. |
| F-02 | Critical | The armed "Submit lead form" Google Ads conversion action fires on a URL that returns HTTP 404. A separate "Purchase" action sits on a URL that returns 200 and has not fired yet. |
| F-04 | Critical | The CRM source column is null for every enquiry row, so no submitted enquiry can be joined back to the ad that produced it. |
| F-03 | Critical | Google Ads conversion_value carries the conversion count under unit "huf", producing a ROAS of 0.0005 with no real revenue behind it. |
| Windows | High | The five data sources behind the internal reporting pipeline cover three different date ranges, so a single report can mix incompatible windows under one "current" label. |
Fix plan, step 1 of 5
1
Symptom. A clean cache HIT on the billiard-table landing page serves one visitor's UTM parameters and gclid inside the three rendered CF7 form action URLs to the next visitor who hits the same cache entry.
2
Root cause. The production cache layer, owner not yet identified, caches query-derived personalization fields as part of the static HTML instead of stripping them before the page is cached.
3
Fix. Exclude query-derived click IDs and UTM values from cached HTML. Generate attribution fields per request after the cache layer. Never cache a personalized form action.
4
Who. Site or cache owner, currently unassigned.
Proof it is fixed
An automated clean HIT/MISS matrix using two distinct synthetic visitor IDs shows neither visitor receives the other's values, the page stays at HTTP 200, and every CF7 form action contains only current-request values. No live form submit required.
Fix plan, step 2 of 5
1
Symptom. The Google Ads "Submit lead form" conversion action is a page-load trigger on a URL that returns 404. A separate "Purchase" action sits on a URL that returns 200 and is armed but silent.
2
Root cause. Form start stayed Primary and counted Every in Google Ads while the real submission-confirmation URL was never wired to a working conversion action, so both spend and bidding optimize on a page load, not a submission.
3
Fix. Generate one lead_id on server-accepted CF7 success, map it to one canonical GTM and GA4 event, then make the deduplicated submitted-lead action Primary, count once, and move form start and the dead Purchase action to Secondary or retire them.
4
Who. Site or GTM owner for the event, Google Ads account owner for the conversion action change. Both currently unassigned.
Proof it is fixed
Google Ads change preview shows the exact action IDs, Primary or Secondary status, count and value settings. GTM Preview and GA4 DebugView show exactly one start event and one submission event per test action, with matching IDs.
Fix plan, step 3 of 5
1
Symptom. crm.source_column is null on every enquiry row in the form register. No submitted enquiry can be traced back to Google or Meta spend.
2
Root cause. The form register headers never included source, campaign, click-ID or landing-page fields, so a submission lands with no attribution even where a click ID was technically available upstream.
3
Fix. Add lead_id, source, medium, campaign, content, term, landing URL and every click ID to the Sheet, populated from the fields the EDIT-02 payload already captures at submission time.
4
Who. Sales or CRM owner for the sheet schema, coordinated with the site owner who ships EDIT-02. Both currently unassigned.
Proof it is fixed
Schema readback confirms the new columns exist. An aggregate completeness report shows fill rate by field. The ten historical rows remain intact, and one synthetic test row flows through the new columns with no personal data.
Fix plan, step 4 of 5
1
Symptom. The Google Ads conversion_value field carries the raw conversion count tagged with unit "huf", producing a ROAS of 0.0005 that reads as a real return-on-spend figure.
2
Root cause. No verified revenue figure exists anywhere in the stack. The CRM schema has quote and payment fields, but no filled Fusion outcome value, so the count was left in the value field as a placeholder.
3
Fix. Remove the forint-labelled value from the conversion action now. Report spend, clicks and enquiries only, never a computed ROAS, until offline enhanced conversions import a real quote or purchase value from the CRM.
4
Who. Ads account owner for the immediate removal. Sales or CRM owner for the eventual real-value import. Both currently unassigned.
Proof it is fixed
Google Ads readback shows the conversion action carrying no value, or an explicitly disabled value field. No pack deck or client report prints a ROAS number until the real-value import is live.
Fix plan, step 5 of 5
1
Symptom. One report run pulls Google Ads and Meta Ads on 2026-07-25 to 08-23, BigQuery on 2026-07-24 to 08-22, the CRM sheet on 2026-07-26 to 08-24, and work evidence on 2026-06-23 to 08-23.
2
Root cause. Each collector pulls its own trailing window independently, driven by per-source lag and API history limits, and the report assembler merges them without normalizing to one canonical window.
3
Fix. Pick one canonical window per report run. Have every collector clip or pad to it, or return UNAVAILABLE for that source. Treat source_health.range as a gate a report cannot pass with mismatched ranges.
4
Who. The reporting-pipeline owner, the same code line that writes report_data.json.
Proof it is fixed
A rerun of the collector shows every source_health.range entry equal for one report_id, or an explicit UNAVAILABLE for any source that cannot supply that exact window.
Dependencies
| Step | Fix | Depends on | Blocks |
|---|---|---|---|
| 1 | F-21, cache stops leaking click IDs | none | 2, 3, 4, 5 |
| 2 | F-02, conversion action repointed, Purchase retired | 1 | 3 |
| 3 | F-04, CRM source and click-ID columns added | 1, 2 | 4, 5 |
| 4 | F-03, mislabeled value removed, real-value import planned | 3 | 5 |
| 5 | Report windows normalized to one canonical range | 1, 2, 3, 4 | none |
Where the numbers came from
| File | Window | Rows | Consumed by |
|---|---|---|---|
| .tmp/overnight-2026-08-10/data/meta_ads.json | no window field, account-level creative export | 39 ads | kreativ-teljesitmeny |
| .tmp/overnight-2026-08-10/data/meta_ad_insights.json | 2026-07-11..2026-08-09 | 20 rows | kreativ-teljesitmeny |
| .tmp/fusion-ppc-2026-08-06/breakdowns.json | 2026-07-08..2026-08-06 | Google: 4 breakdown sets. Meta: 4 breakdown sets, 15 adsets | riport-30-nap |
| outputs/loop-runs/2026-08-28-fusiontables-report/report_data.json | 5 source windows, 3 distinct ranges, see next slide | 7 source_health entries | riport-30-nap, belso-anyagok |
Defect detail
| Source | Current window | Status |
|---|---|---|
| google_ads | 2026-07-25 .. 2026-08-23 | degraded, change-event history before 07-26 unavailable |
| meta_ads | 2026-07-25 .. 2026-08-23 | degraded, results field is a form-start signal, not a verified enquiry |
| search_console | not available | absent, no property configured for this client |
| ga4 | not available | absent, no measurement configured for this client |
| bigquery | 2026-07-24 .. 2026-08-22 | disabled, no verified GA4 BigQuery export configured |
| crm_sheet | 2026-07-26 .. 2026-08-24 | degraded, blank legacy date header, 7 QA rows excluded |
| work_evidence | 2026-06-23 .. 2026-08-23 | degraded, Activity Log skipped, no CRM page ID configured |
Gaps
| Metric | Why not available | What would fix it |
|---|---|---|
| Cost-per-enquiry, ad-attributed ROI | Enquiries carry no source column, F-04 | Ship the fix-plan step 3 CRM columns |
| Enquiry source breakdown by channel | Same source-column gap, F-04 | Same as above, then a backfill window |
| Qualified lead, quote acceptance, purchase, revenue | No structured qualification field exists in the form register or CRM for either channel | EDIT-06 sheet fields, then EDIT-07 offline conversion import |
| GA4 landing-page funnel | No GA4 measurement configured for this client | Configure a GA4 property and link it in client config |
| Search Console organic figures | No Search Console property available to this client | Grant Search Console access and link it in client config |
| Fresh Meta account and dataset readback | The configured Meta API session is invalid, error 190/467, no authorized token | Re-authorize a live Meta access token for the ad account |
| Verified combined monthly Meta plus Google budget baseline (B) | T4A and T4B, the tasks that were to resolve baseline B, never ran, both stayed WAITING_DEPENDENCY | Run T4A/T4B against a fresh authenticated account readback |
Traceability
Acceptance
| Task | Originally asked for | This pack delivers | Still open |
|---|---|---|---|
| T4A | Decision-level Meta and Google strategy for the single pool-table landing page, allocated against a verified monthly budget baseline B | hirdetesi-strategia deck's single-offer scenario, built without a confirmed B | Baseline B verification, WAITING_DEPENDENCY, NOT STARTED at source |
| T4B | Full six-offer-group strategy at or below 1.5x baseline B | hirdetesi-strategia deck's second scenario, same baseline gap | Same baseline B verification, WAITING_DEPENDENCY, NOT STARTED at source |
| T7 | Source-traceable Google and Meta targeting and campaign pack for both scenarios, keyword-measured under a USD 3 DataForSEO cap | persona and hirdetesi-strategia decks carry targeting and audience detail. No DataForSEO keyword run occurred in this pack | Depended on accepted T4A and T4B, both still WAITING_DEPENDENCY at source |
QA
| Deck | Slides | Local QA | Live HTTP |
|---|---|---|---|
| 30 napos eredmények | 13 | PASS | 200 |
| Hirdetéskreatívok teljesítménye | 13 | PASS | 200 |
| Versenytársak hirdetései | 14 | PASS | 200 |
| Hirdetési és célzási stratégia | 35 | PASS | 200 |
| Persona elemzés | 22 | PASS | 200 |
| Belső anyagok és QA | 24 | PASS | 200 |
QA
| Check | Result |
|---|---|
| Deck is slides | PASS |
| Arrow key turns the page | PASS |
| On-screen back arrow works | PASS |
| On-screen forward arrow works | PASS |
| Navigation returns to slide 1 | PASS |
| No page scroll at 1280x900 | PASS |
| No slides-app chrome, 2 nav buttons only | PASS |
| No slide overflows its 1280x900 frame | PASS |
| 0 em-dashes in rendered text | PASS |
| 0 semicolons in rendered text | PASS |
| 0 console errors, 0 page errors | PASS |
| Live HTTP status | 200 |
| Comment layer present in fetched HTML | yes |
QA
| Check | Result |
|---|---|
| Deck is slides | PASS |
| Arrow key turns the page | PASS |
| On-screen back arrow works | PASS |
| On-screen forward arrow works | PASS |
| Navigation returns to slide 1 | PASS |
| No page scroll at 1280x900 | PASS |
| No slides-app chrome, 2 nav buttons only | PASS |
| No slide overflows its 1280x900 frame | PASS |
| 0 em-dashes in rendered text | PASS |
| 0 semicolons in rendered text | PASS |
| 0 console errors, 0 page errors | PASS |
| Live HTTP status | 200 |
| Comment layer present in fetched HTML | yes |
QA
| Check | Result |
|---|---|
| Deck is slides | PASS |
| Arrow key turns the page | PASS |
| On-screen back arrow works | PASS |
| On-screen forward arrow works | PASS |
| Navigation returns to slide 1 | PASS |
| No page scroll at 1280x900 | PASS |
| No slides-app chrome, 2 nav buttons only | PASS |
| No slide overflows its 1280x900 frame | PASS |
| 0 em-dashes in rendered text | PASS |
| 0 semicolons in rendered text | PASS |
| 0 console errors, 0 page errors | PASS |
| Live HTTP status | 200 |
| Comment layer present in fetched HTML | yes |
QA
| Check | Result |
|---|---|
| Deck is slides | PASS |
| Arrow key turns the page | PASS |
| On-screen back arrow works | PASS |
| On-screen forward arrow works | PASS |
| Navigation returns to slide 1 | PASS |
| No page scroll at 1280x900 | PASS |
| No slides-app chrome, 2 nav buttons only | PASS |
| No slide overflows its 1280x900 frame | PASS |
| 0 em-dashes in rendered text | PASS |
| 0 semicolons in rendered text | PASS |
| 0 console errors, 0 page errors | PASS |
| Live HTTP status | 200 |
| Comment layer present in fetched HTML | yes |
QA
| Check | Result |
|---|---|
| Deck is slides | PASS |
| Arrow key turns the page | PASS |
| On-screen back arrow works | PASS |
| On-screen forward arrow works | PASS |
| Navigation returns to slide 1 | PASS |
| No page scroll at 1280x900 | PASS |
| No slides-app chrome, 2 nav buttons only | PASS |
| No slide overflows its 1280x900 frame | PASS |
| 0 em-dashes in rendered text | PASS |
| 0 semicolons in rendered text | PASS |
| 0 console errors, 0 page errors | PASS |
| Live HTTP status | 200 |
| Comment layer present in fetched HTML | yes |
QA
| Check | Result |
|---|---|
| Deck is slides | PASS |
| Arrow key turns the page | PASS |
| On-screen back arrow works | PASS |
| On-screen forward arrow works | PASS |
| Navigation returns to slide 1 | PASS |
| No page scroll at 1280x900 | PASS |
| No slides-app chrome, 2 nav buttons only | PASS |
| No slide overflows its 1280x900 frame | PASS |
| 0 console errors, 0 page errors | PASS |
| Live HTTP status | 200 |
| Comment layer present in fetched HTML | yes |
Acceptance
| Row | Requirement | Status | Evidence file |
|---|---|---|---|
| A1 | Six decks plus the index are live on review.clientsflow.hu | PASS | qa/a1-live.md |
| A2 | Every deck is slides: arrow key and on-screen arrows turn the page, no page scroll at 1280x900, no app chrome | PASS | qa/a2-slides.md, qa/shots/ |
| A3 | 0 em-dashes and 0 semicolons in client copy, 0 console errors per deck | PASS | qa/a3-copy.md, qa/a3-console.md |
| A4 | Every number traces to a source file and window, unavailable is labelled | PASS | qa/a4-provenance.md |
| A5 | The creative deck extends the 2026-08-24 report rather than rebuilding it | PASS | qa/a5-extend.md |
| A6 | Gist exists and the strategy deck cites the T4A, T4B and T7 contract items | PASS | qa/a6-contracts.md |
| A7 | Work committed on a branch, nothing on main, no secrets | PASS | qa/a7-git.md |
| A8 | Index cards with status, slide count and what to check, plus the round 2 handoff | PASS | round-2-handoff.md |
Acceptance
Sources