signal_quality — v1

Back to project
IDdfc3f7af-9cd7-4156-8d53-36c82e7f6421
Lenssignal_quality
Functionassess
Phasediagnosis
Topicssignal-quality, signal-inventory
Versionv1
Created2026-04-21T08:12:18+00:00

Content

{
  "dimensions": [
    {
      "name": "deduplication",
      "findings": [
        {
          "finding": "Google Ads purchase conversion tag fires on every page load, not on actual purchase events, causing massive conversion inflation",
          "evidence": "Signal 'Google Ads conversion (label=NeCfCNuMwOkaEPa1n68_, bttype=purchase)' fires on homepage load with value=0 and no transaction_id. Conversion feedback loop confirms: 'fires on every page load, not on an actual purchase event'. Multiple endpoints receive the same conversion event (googleadservices.com, doubleclick.net, 1p-conversion) all without orderId-based deduplication.",
          "current_state": "can_be_improved",
          "target_state": "Purchase conversion should fire only on a confirmed purchase/thank-you page with a unique transaction_id passed to all Google Ads conversion endpoints. Google Ads uses transaction_id to deduplicate across client-side and server-side hits automatically.",
          "priority": "high",
          "opportunity": "Fixing this is critical: Smart Bidding (tROAS, tCPA) is currently optimising toward inflated, zero-value page loads. Correcting the trigger and adding transaction_id will immediately improve bidding signal quality, reduce wasted spend, and align reported conversions with actual business outcomes."
        },
        {
          "finding": "Google Ads conversion fires to three separate endpoints without any transaction_id for deduplication",
          "evidence": "The same conversion label NeCfCNuMwOkaEPa1n68_ fires to googleadservices.com/pagead/conversion, googleads.g.doubleclick.net/pagead/viewthroughconversion, and google.com/pagead/1p-conversion \u2014 all on the same page load. No transaction_id or order_id parameter is present in any of these requests.",
          "current_state": "can_be_improved",
          "target_state": "A unique transaction_id should be passed with every conversion fire. Google's systems use this to deduplicate across endpoints and between client-side and any future server-side implementation. This is a standard gtag parameter (transaction_id) supported natively.",
          "priority": "high",
          "opportunity": "Prevents triple-counting of the same conversion event across Google's ad-serving infrastructure, which inflates conversion volume and distorts automated bidding signals."
        },
        {
          "finding": "LinkedIn fires both a general insight tag and a specific conversion (conversionId=20244068) on every page load, each via two separate request types",
          "evidence": "LinkedIn pixel fires attribution_trigger with pid=7288028 (no conversionId) AND attribution_trigger with conversionId=20244068, plus corresponding collect requests for each \u2014 totalling four LinkedIn requests per page load. Deduplication concern flagged as risk_level=low in upstream data.",
          "current_state": "adequate",
          "target_state": "The page-level conversion (conversionId=20244068) should only fire on pages that represent a meaningful conversion action (e.g., form submission, demo request), not on every page load. The general insight tag (no conversionId) is correctly used for audience building and should continue firing on all pages.",
          "priority": "medium",
          "opportunity": "If conversionId=20244068 is configured as a conversion action in LinkedIn Campaign Manager, it is over-counting conversions on every page view. Restricting its trigger to actual conversion pages will improve LinkedIn campaign optimisation and reporting accuracy."
        },
        {
          "finding": "Twitter/X fires two separate pixel events with different txn_ids on every page load",
          "evidence": "Two distinct adsct requests fire: txn_id=tw-pfume-pyq3r and txn_id=pfume, each also duplicated across t.co and analytics.twitter.com endpoints. Upstream analysis notes this 'could cause over-counting if both are set as conversions.'",
          "current_state": "adequate",
          "target_state": "Confirm in Twitter Ads Manager that only one txn_id is mapped to a conversion action used for bidding optimisation. The other should be used for audience/remarketing only. If both are mapped as conversion events, one should be removed or recategorised.",
          "priority": "low",
          "opportunity": "Prevents potential double-counting of page visit conversions in Twitter Ads, which could inflate conversion metrics and distort any automated bidding strategies on the platform."
        }
      ]
    },
    {
      "name": "latency",
      "findings": [
        {
          "finding": "All conversion signals are delivered exclusively via client-side pixels with no server-side redundancy",
          "evidence": "Data architecture shows every data flow from gtm_web to ad platforms uses mechanism=pixel_fire and delivery_method=client_side. The feedback loop assessment confirms: 'No server-side conversion forwarding or Conversions API implementation detected despite capi=1 flag on Google Ads tags.' No batch import, offline conversion upload, or server-side GTM container was observed.",
          "current_state": "can_be_improved",
          "target_state": "Implement server-side conversion forwarding via Google Ads Conversions API (or server-side GTM), Meta Conversions API, LinkedIn CAPI, and Bing Offline Conversions. Server-side signals provide a latency-resilient redundancy layer and are not subject to browser-based signal loss. Real-time server-side forwarding maintains <1 second latency while providing resilience.",
          "priority": "high",
          "opportunity": "Server-side signals are not subject to ad blockers, ITP/cookie restrictions, or page-exit timing issues. Implementing CAPI for key platforms will increase signal coverage by 15-30% (industry benchmarks) and provide a foundation for enhanced conversions and offline conversion imports."
        },
        {
          "finding": "No offline conversion import or batch feedback mechanism exists for any ad platform",
          "evidence": "Feedback loop assessment lists platforms_with_complete_loops as empty. No evidence of Google Ads Offline Conversion Import, Meta Offline Events, or LinkedIn Offline Conversions was observed. HubSpot CRM data (which likely contains lead qualification and deal stage data) has no observed export path to any ad platform.",
          "current_state": "not_yet_configured",
          "target_state": "For B2B/SaaS businesses, implement an offline conversion pipeline from HubSpot CRM to Google Ads (via Offline Conversion Import or Enhanced Conversions for Leads), Meta (via Offline Conversions API), and LinkedIn (via Offline Conversions). CRM events like MQL, SQL, Opportunity Created, and Closed-Won should be uploaded within 24 hours of occurring, well within Google's 7-day and 90-day import windows.",
          "priority": "high",
          "opportunity": "Enables value-based bidding on downstream CRM outcomes rather than top-of-funnel page views. Smart Bidding can optimise toward actual revenue-generating leads rather than the currently misconfigured page-load 'conversions,' dramatically improving ROAS and lead quality."
        }
      ]
    },
    {
      "name": "coverage_gaps",
      "findings": [
        {
          "finding": "Meta Pixel is initialised but sends no conversion events whatsoever",
          "evidence": "Meta Pixel (498148151146096) loads via GTM and fetches its config from connect.facebook.net/signals/config/498148151146096, but the feedback loop assessment confirms: 'no conversion events (Purchase, Lead, CompleteRegistration) were observed firing.' The meta_pixel_init conversion action has conversion_type=micro and only captures config, not any standard or custom Meta events.",
          "current_state": "can_be_improved",
          "target_state": "Meta Pixel should fire at minimum a PageView standard event on all pages, a Lead or CompleteRegistration event on form submissions, and ideally a Purchase event on conversion pages. These standard events feed Meta's machine learning models for audience building, lookalike targeting, and conversion optimisation.",
          "priority": "high",
          "opportunity": "Without conversion events, Meta campaigns cannot exit the learning phase for conversion-optimised campaigns. Adding standard events enables Meta's Advantage+ bidding, custom audience creation from converters, and lookalike audience expansion \u2014 directly impacting Meta ROAS."
        },
        {
          "finding": "No actual conversion events (purchase, sign_up, generate_lead) exist in the dataLayer for any platform",
          "evidence": "The feedback loop assessment states: 'No actual purchase, sign_up, or generate_lead conversion events observed in the dataLayer \u2014 only gtm.js, gtm.dom, gtm.load, and gtm.scrollDepth events exist.' The signal inventory confirms only init, page_view, track (scroll), consent, and ad_sync category events were captured. The only 'conversion' firing is the misconfigured Google Ads purchase tag on page load.",
          "current_state": "can_be_improved",
          "target_state": "The application should push meaningful conversion events to the dataLayer (e.g., generate_lead on form submission, sign_up on account creation, purchase on payment completion) with structured event data including value, currency, and transaction_id. GTM tags should be triggered by these dataLayer events rather than page load.",
          "priority": "high",
          "opportunity": "This is the foundational gap that prevents all ad platforms from receiving accurate conversion signals. Without dataLayer conversion events, no platform can optimise toward actual business outcomes. Implementing this unlocks conversion-optimised bidding across all six ad platforms simultaneously."
        },
        {
          "finding": "Bing UET tracks only pageLoad events with no conversion events configured",
          "evidence": "Bing UET (ti=97194847) fires a pageLoad event and consent signals but no custom conversion or goal events. The bing_page_load conversion action is typed as conversion_type=micro with no value parameter.",
          "current_state": "can_be_improved",
          "target_state": "Configure UET custom events or goal URLs in Microsoft Advertising for key conversion actions (lead form submission, sign-up, purchase). Pass revenue values with UET event tracking to enable ROAS-based bidding in Microsoft Ads.",
          "priority": "medium",
          "opportunity": "Enables Microsoft Advertising automated bidding strategies (Target CPA, Target ROAS) which currently have no conversion signal to optimise toward, limiting campaigns to traffic-based bidding only."
        },
        {
          "finding": "Reddit Pixel sends only a custom page_view event with no conversion events",
          "evidence": "Reddit Pixel (a2_gws68xi53fgh) fires event=Custom with customEventName=page_view and a placeholder value (m.valueDecimal=1, m.value empty). No standard Reddit conversion events (SignUp, Lead, Purchase) were observed.",
          "current_state": "can_be_improved",
          "target_state": "Implement Reddit standard conversion events (SignUp, Lead, Purchase) triggered by actual user actions. Pass meaningful revenue values to enable Reddit's conversion-optimised bidding.",
          "priority": "low",
          "opportunity": "Enables Reddit Ads conversion optimisation and more accurate campaign performance measurement. Without conversion events, Reddit campaigns cannot optimise beyond page view volume."
        },
        {
          "finding": "Twitter/X fires only page visit tracking events with no conversion events",
          "evidence": "Both Twitter pixel instances (txn_id=tw-pfume-pyq3r and txn_id=pfume) fire with event={} (empty event object) and no value parameters. No specific conversion events (Purchase, SignUp, Lead) were observed.",
          "current_state": "can_be_improved",
          "target_state": "Configure Twitter event-specific conversion pixels that fire on actual conversion actions (form submission, sign-up) with appropriate event types and values.",
          "priority": "low",
          "opportunity": "Enables Twitter Ads conversion-optimised bidding and accurate conversion attribution for Twitter campaigns."
        },
        {
          "finding": "HubSpot CRM receives only pageview data with no conversion event tracking configured",
          "evidence": "HubSpot (portal 244051090) fires only a __ptq.gif pageview pixel. The hubspot_page_view conversion action confirms conversion_type=micro with no value. The feedback loop assessment notes: 'HubSpot receives only pageview data with no conversion event tracking configured.'",
          "current_state": "can_be_improved",
          "target_state": "Configure HubSpot behavioural events and form submission tracking to capture conversion actions. More critically, establish HubSpot as the CRM source of truth for lead lifecycle stages and pipe those stages back to ad platforms via offline conversion imports.",
          "priority": "medium",
          "opportunity": "HubSpot likely contains the most valuable downstream conversion data (MQL, SQL, Opportunity, Closed-Won). Connecting this data back to ad platforms via offline conversion imports would enable optimisation toward actual revenue, not just top-of-funnel page views."
        },
        {
          "finding": "Only one page (homepage) was observed in the signal inventory \u2014 no visibility into conversion page or funnel step signals",
          "evidence": "All 50 signals in the signal inventory have page='https://kilo.ai/' (homepage only). No signals were captured from pricing pages, demo request pages, sign-up flows, checkout pages, or thank-you/confirmation pages.",
          "current_state": "can_be_improved",
          "target_state": "Signal coverage should be validated across all key funnel pages: landing pages, pricing page, demo/trial request forms, sign-up flow, and post-conversion confirmation pages. Each funnel stage should have appropriate conversion events firing to ad platforms.",
          "priority": "medium",
          "opportunity": "The current assessment may understate signal coverage on deeper funnel pages. However, the absence of any conversion dataLayer events and the misconfigured Google Ads purchase tag on the homepage strongly suggest conversion tracking is not properly implemented on conversion pages either."
        }
      ]
    },
    {
      "name": "value_calibration",
      "findings": [
        {
          "finding": "Google Ads conversion sends a hardcoded value of 0 with bttype=purchase, providing no value signal for Smart Bidding",
          "evidence": "Google Ads conversion request includes value=0 with bttype=purchase and label=NeCfCNuMwOkaEPa1n68_. The feedback loop assessment confirms: 'No dynamic revenue values are passed to any ad platform \u2014 the only value observed is a static 0.' Value_signal_quality is rated as 'weak.'",
          "current_state": "can_be_improved",
          "target_state": "Conversion values should reflect actual or estimated business value. For B2B/SaaS: assign proxy values based on lead scoring (e.g., demo request = estimated pipeline value \u00d7 conversion probability) or pass actual deal values from CRM via offline conversion imports. For any e-commerce component: pass actual transaction revenue dynamically.",
          "priority": "high",
          "opportunity": "Value=0 makes tROAS bidding impossible and degrades tCPA bidding because Google cannot distinguish high-value from low-value conversions. Implementing dynamic values enables value-based bidding, which typically improves ROAS by 15-30% compared to volume-based bidding (Google benchmarks)."
        },
        {
          "finding": "No calibration feedback loop exists to compare estimated conversion values against actual outcomes",
          "evidence": "Feedback loop assessment shows platforms_with_complete_loops=[] (empty). No server-side or offline conversion pipeline was detected. HubSpot CRM (which likely holds actual deal values and lead outcomes) has 'weak' joinability with GA4 and no join path to any ad platform. No mechanism exists to update conversion values based on actual closed-won revenue.",
          "current_state": "not_yet_configured",
          "target_state": "Implement a quarterly (minimum) calibration process: export actual CRM outcomes (closed-won deals, deal values, lead-to-close rates by source) and compare against the estimated values sent to ad platforms. Use these actuals to update value assignments. Ideally, automate this via a CRM-to-ad-platform pipeline that sends actual deal values as offline conversions.",
          "priority": "high",
          "opportunity": "Without calibration, any future value assignments will drift from reality as conversion rates, average deal sizes, and product mix evolve. A calibration loop ensures Smart Bidding algorithms always receive accurate value signals, maintaining bidding efficiency over time."
        },
        {
          "finding": "No conversion value is passed to any non-Google ad platform",
          "evidence": "LinkedIn conversion (conversionId=20244068) has value_type=none. Reddit pixel sends m.valueDecimal=1 (placeholder) with m.value empty. Twitter events have empty event objects with no value. Bing UET pageLoad has no value. Meta Pixel fires no conversion events at all.",
          "current_state": "not_yet_configured",
          "target_state": "All ad platforms receiving conversion events should receive consistent, meaningful values. LinkedIn, Bing, Reddit, and Twitter all support value parameters on conversion events. Values should be consistent across platforms (same conversion action = same value) to enable like-for-like cross-platform performance comparison.",
          "priority": "medium",
          "opportunity": "Passing values to all platforms enables value-based bidding strategies across the entire media mix, not just Google Ads. It also enables accurate cross-platform ROAS comparison, which is essential for budget allocation decisions."
        }
      ]
    },
    {
      "name": "micro_conversion_configuration",
      "findings": [
        {
          "finding": "Google Ads purchase conversion is misconfigured as a page-load trigger and is likely set as a primary conversion action, corrupting Smart Bidding",
          "evidence": "The Google Ads conversion with bttype=purchase and label=NeCfCNuMwOkaEPa1n68_ fires on every homepage load. The bttype=purchase designation strongly suggests this is configured as a primary conversion action in Google Ads. It fires with value=0 on every page view, which means Smart Bidding is optimising to maximise zero-value page loads.",
          "current_state": "can_be_improved",
          "target_state": "This conversion action should either be: (a) re-triggered to fire only on actual purchase/conversion pages with correct values, or (b) demoted to a secondary/observation-only conversion in Google Ads while a correctly configured primary conversion is created. A new primary conversion action should fire on actual lead or purchase events with dynamic values.",
          "priority": "high",
          "opportunity": "This is the single highest-impact fix available. Correcting this one misconfiguration will immediately stop Smart Bidding from optimising toward page loads and allow it to target actual conversions, likely producing a dramatic improvement in Google Ads campaign efficiency."
        },
        {
          "finding": "No mid-funnel micro-conversions are configured for any ad platform",
          "evidence": "The only behavioural signals captured are page_view events and scroll depth (gtm.scrollDepth at 90%). No micro-conversions for engagement actions like video views, CTA clicks, pricing page visits, demo page visits, or content downloads were observed in the signal inventory or dataLayer.",
          "current_state": "not_yet_configured",
          "target_state": "Configure secondary/observation conversion actions on Google Ads (and equivalent on other platforms) for key mid-funnel micro-conversions: pricing page visit, demo page visit, CTA click, content download, video engagement. These should be marked as secondary (reporting-only) so they don't interfere with primary conversion bidding but provide optimisation signals during low-volume periods.",
          "priority": "medium",
          "opportunity": "Mid-funnel micro-conversions give ad platforms additional optimisation signals, which is especially valuable for B2B businesses with low conversion volumes. Google Ads can use secondary conversions as supplementary signals in Smart Bidding even when they don't directly influence the bid."
        },
        {
          "finding": "Scroll depth tracking (90%) fires as a GTM dataLayer event but is not sent to any ad platform as a micro-conversion",
          "evidence": "Signal 'dataLayer gtm.scrollDepth (90%)' fires with gtm.scrollThreshold=90 and gtm.scrollUnits=percent, but no corresponding conversion or event tags were observed sending this engagement signal to Google Ads, LinkedIn, or any other ad platform.",
          "current_state": "can_be_improved",
          "target_state": "If scroll depth is a meaningful engagement indicator, consider sending it to GA4 as a custom event and potentially to Google Ads as a secondary conversion. This provides an engagement quality signal that can help distinguish high-intent from low-intent traffic.",
          "priority": "low",
          "opportunity": "Provides a lightweight engagement quality signal to ad platforms. For content-heavy pages, scroll depth can serve as a proxy for content consumption quality, helping Smart Bidding identify higher-quality traffic sources."
        }
      ]
    },
    {
      "name": "signal_loss",
      "findings": [
        {
          "finding": "No server-side fallback exists for any ad platform signal, making all conversion data vulnerable to client-side signal loss",
          "evidence": "Data architecture shows all 11 data flows use mechanism=pixel_fire with collection_method=client_side_pixel. The feedback loop assessment confirms: 'No server-side conversion forwarding or Conversions API implementation detected despite capi=1 flag on Google Ads tags.' No server-side GTM container, Meta CAPI, LinkedIn CAPI, or any other server-side signal path was observed.",
          "current_state": "can_be_improved",
          "target_state": "Implement server-side conversion APIs for at minimum Google Ads (Enhanced Conversions / server-side GTM), Meta (Conversions API), and LinkedIn (Conversions API). Server-side signals should be configured with deduplication (event_id matching) against client-side signals to avoid double-counting while maximising coverage.",
          "priority": "high",
          "opportunity": "Industry data suggests 10-30% of client-side signals are lost to ad blockers, ITP/cookie restrictions, and page-exit timing. Server-side signals recover a significant portion of this lost data, directly improving match rates, attribution accuracy, and bidding algorithm input quality across all platforms."
        },
        {
          "finding": "No enhanced conversions or hashed user data (email, phone) is sent to any ad platform",
          "evidence": "Feedback loop assessment confirms: 'No enhanced conversions or hashed user data (email/phone) detected on any platform.' All conversion actions have has_enhanced_matching=no. No user_data, em (hashed email), or ph (hashed phone) parameters were observed in any ad platform request.",
          "current_state": "not_yet_configured",
          "target_state": "Implement enhanced conversions for Google Ads (passing hashed email/phone with conversion events), Meta Advanced Matching (passing hashed user data with pixel events), and LinkedIn enhanced conversion tracking. This requires collecting first-party user data (e.g., from form submissions) and hashing it before sending to ad platforms.",
          "priority": "high",
          "opportunity": "Enhanced matching dramatically improves conversion attribution rates, especially in a post-cookie world. Google reports 5-15% improvement in measured conversions with enhanced conversions enabled. Meta reports similar gains with Advanced Matching. This directly improves bidding algorithm effectiveness by reducing unattributed conversion signal loss."
        },
        {
          "finding": "HubSpot consent banner is loaded but consent-gating impact on signal delivery is unclear",
          "evidence": "HubSpot consent banner script loads from js-na2.hs-banner.com/v2/244051090/banner.js. Bing UET shows explicit consent handling (evt=consent with src=default and src=update). However, the consent mechanism's impact on other ad platform pixel firing was not captured \u2014 it is unclear what percentage of visitors decline consent and how this affects signal coverage for Google Ads, Meta, LinkedIn, Twitter, and Reddit.",
          "current_state": "can_be_improved",
          "target_state": "Implement Google Consent Mode v2 across all Google tags (GA4, Google Ads) to enable modelled conversions for non-consented users. Verify that all ad platform tags respect consent state via GTM's consent built-in variables. Monitor consent rates by region and quantify signal loss from consent denial. For EU/EEA traffic, ensure server-side signals also respect consent state.",
          "priority": "medium",
          "opportunity": "Google Consent Mode v2 enables Google to model conversions for users who decline consent, recovering an estimated 50-70% of otherwise lost conversion signals in consent-required regions. Without it, consent-denied users represent a complete signal black hole."
        },
        {
          "finding": "Client-side cookie/identity fragmentation with no first-party identity strategy observed",
          "evidence": "GA4 and Google Ads share cookie space (auid=854434084.1776757741, client_id=826842155.1776757741) but joinability with non-Google platforms is 'none' (Meta, LinkedIn, Twitter, Bing, Reddit all operate in isolated ID spaces). Joinability between GA4/Google Ads and HubSpot CRM is 'weak' with no shared identifier observed. PostHog uses a separate distinct_id with no join path to any other system.",
          "current_state": "can_be_improved",
          "target_state": "Implement a first-party identity resolution strategy: when users authenticate (form submission, login, sign-up), pass a hashed user_id or email to GA4 (user_id feature), PostHog (identify call), HubSpot (contact association), and ad platforms (enhanced conversions). This creates a cross-system identity graph that survives cookie expiry and enables accurate cross-device/cross-session attribution.",
          "priority": "high",
          "opportunity": "A unified first-party identity strategy is the foundation for durable measurement in a post-cookie environment. It enables cross-system attribution, CRM-to-ad-platform feedback loops, and enhanced conversion matching \u2014 all of which are currently impossible due to siloed identity spaces."
        },
        {
          "finding": "PostHog proxying through first-party domain reduces signal loss for product analytics but this pattern is not applied to ad platforms",
          "evidence": "PostHog sends all requests through kilo.ai/ingest/ (first-party proxy), which is resilient to third-party cookie blocking and many ad blockers. However, all ad platform pixels (Google Ads, Meta, LinkedIn, Twitter, Bing, Reddit) fire directly to third-party domains (googleadservices.com, px.ads.linkedin.com, etc.) with no first-party proxy or server-side forwarding.",
          "current_state": "can_be_improved",
          "target_state": "Apply the same first-party proxy pattern used for PostHog to ad platform signals via server-side GTM. A server-side GTM container running on a kilo.ai subdomain (e.g., sgtm.kilo.ai) can receive events via a first-party endpoint and forward them to ad platforms server-side, bypassing third-party domain blocking.",
          "priority": "medium",
          "opportunity": "Leveraging the first-party proxy pattern already proven with PostHog for ad platform signals would increase signal delivery rates, improve cookie duration (first-party cookies are not subject to ITP 7-day cap), and provide a foundation for server-side tag management."
        }
      ]
    }
  ]
}