Skip to content
ARGBE.TECH
Search and AI answers, 21 min readBy argbe.tech

Guide to PPC and Paid Media Strategy

In attribution-constrained B2B stacks, wasted spend usually comes from measurement and intent mismatches, not “bad ads.” This guide turns PPC into a decision system executives can check: measurement QA before scaling, unit economics, and scale/stop rules that account for small numbers and lag.

Flow diagram of a B2B PPC system: user intent passes a filter that separates noise from qualified traffic, then an AI retrieval box, ending at a target labeled qualified conversion beside a metrics table.

Who this is for / not for

fornot for
B2B SaaS or services with low conversion volume and long sales cyclesPure DTC ROAS playbooks and “bid scaling” guides
Teams with messy attribution (multi-touch, consent loss, CRM stages)Ultra high-volume ecommerce where platform optimization is the main lever
Leaders who need decisions that survive CFO scrutinyAnyone seeking a platform tutorial (buttons, settings, hacks)

The question this guide answers: why do platform results and qualified pipeline disagree, and what do you check before you scale spend?

Mini glossary (metrics executives will quote)

termdefault definition (operational)
CPACost / platform-tracked primary conversion (the one you optimize bids toward).
CACFully loaded cost to acquire a customer (media + sales + tooling overhead) / new customers.
ROASAttributed revenue / ad spend (platform or analytics attribution, not causality).
MERTotal revenue / total marketing spend (includes spend not credited by platforms).
IncrementalityLift caused versus a control (what changed because ads ran), not what attribution credited.

In attribution-constrained B2B stacks, most “PPC strategy” advice becomes budget theater: it optimizes dashboards without proving lift.

What PPC Strategy Actually Means (and Why Most Plans Fail)

A PPC strategy is not “run search + run social.” It’s a decision system: what demand you’re buying, what offer you’re presenting, how you define success, and what conditions trigger scale, pause, or rebuild.

Tactics live inside the system (ads, keywords, audiences). Strategy defines the rules that keep tactics from turning into random motion, especially when conversion volume is low and small changes look “significant” by accident.

The three constraints that break most plans are simple:

  1. conversion volume (not enough outcomes to learn reliably),
  2. sales cycle length (signal arrives late and is noisy),
  3. measurement integrity (you can’t trust what you’re optimizing).

On any platform, automated bidding optimizes toward the conversion you define. Define an easy, shallow action and the system will find more of it, whether or not it becomes pipeline.

Paid media buys learning. Performance comes from iteration, but iteration only works if your definitions are stable, your outcomes are traceable, and your economics are explicit.

Glossary (campaign mechanics):

  • Campaign: budget and objective container for a distinct goal (for example, capturing demand vs creating it).
  • Ad group: a set of ads targeting a consistent intent slice (keywords or audiences) so you can interpret results.
  • Keyword and match type: how tightly you bind search intent to your offer.
  • Audience: a rule set defining who sees ads; tighter audiences reduce wasted impressions but can limit volume.
  • Conversion: the “success” event you optimize toward; if this is wrong, every optimization is wrong.
  • Attribution: the system that assigns credit; it is not proof of causality.

Choose the Right Objective: Demand Capture vs Demand Creation

Your first strategic decision isn’t “which platform.” It’s which mode you’re in.

Demand capture is when intent already exists. Someone is actively looking for a solution, a category, or a competitor. Your job is to show up with a relevant promise, reduce friction, and avoid paying for curiosity clicks that never become pipeline.

Demand creation is when intent doesn’t exist yet (or is dormant). Your job is to build consideration: clarify the problem, define the stakes, and earn the right to ask for a next step. Measurement gets harder because outcomes are delayed and multi-touch by default.

Search is usually the natural fit for capture because the query states the intent. LinkedIn is often used for creation in B2B because targeting is explicit while intent is implicit; that trade-off changes what “good” looks like.

Paid channel selection is about constraints, not hype. The matrix below is our judgment of how channels typically behave for low-volume B2B; check it against your own data.

ChannelIntentBest ForTime To SignalMeasurement RiskFailure Modenotes
Google Ads (Search)Demand capture (explicit)High-intent solution/category queriesFastMediumLanding page mismatch / shallow conversionsStrong when landing pages match intent; weak when your “conversion” is too shallow
Microsoft Advertising (Search)Demand capture (explicit)Additional search coverageMediumMediumCopy-paste structure without intent validationVolume varies by market; treat it as a parallel capture loop, not a copy of Google
Social ads (paid social)Demand creation + retargetingProspecting + creative iteration; retargeting loopsMediumHighRetargeting over-crediting / view-through inflationUseful for message testing; risk rises when attribution credits view-through behavior
LinkedIn Ads (Social)Demand creation (targeted)ICP shaping, account-based themes, pipeline warmingSlowHighWeak offer + impatience + no offline feedback loopLearning is slow at low volume; needs a clear offer and patient measurement windows
Programmatic DisplayDemand creation (broad)Reach, frequency, category associationSlowHighImpressions without lift (needs controls)Easy to buy impressions; hard to prove lift without controls
YouTube/VideoDemand creation (broad)Narrative + education for long cyclesSlowMediumCreative fatigue / unclear downstream pathNeeds a clear downstream measurement plan and creative discipline

Budget allocation rule of thumb (framework, not a promise): prioritize capture until you hit diminishing returns, then fund creation to widen the future capture pool, without pretending short-term ROAS is the goal.

How to Validate PPC Tracking Before Scaling Spend

In attribution-constrained B2B, wasted spend usually isn’t “bad ads.” It’s optimizing against a conversion definition you don’t believe, or can’t defend.

Start by defining your primary conversion in GA4: the closest observable event to business value that you can measure consistently, marked as a key event. Google Ads conversions can be created from GA4 key events, which keeps counts consistent between the two (Google Analytics Help: about key events, accessed 2026-10-18)1. If your primary conversion is “Book a demo,” verify that it fires once, fires reliably, and maps to the right intent paths.

Google Tag Manager is the bridge that connects on-site behavior to GA4 events. If the bridge is shaky (duplicate events, missing parameters, inconsistent naming), your bidding system learns the wrong lesson faster than your team can correct it.

UTM parameters are not busywork; they’re the minimum contract between ads and analytics (Google Analytics Help: URL builders and campaign parameters, accessed 2026-10-18)2. When UTMs are inconsistent, you can’t defend channel claims in a review, and you can’t debug why “performance changed” without blaming the platform.

Offline conversion imports are how B2B teams stop optimizing for cheap form fills and start optimizing for real outcomes. Google Ads lets you send a click identifier back with the offline outcome, and recommends starting with enhanced conversions for leads, which uses hashed customer data you already collect (Google Ads Help: about offline conversion imports, accessed 2026-10-18)3. If you can connect “qualified opportunity created” (or “SQL accepted”) from your CRM back to the ad click, you can shift bidding toward pipeline.

Measurement integrity is also about deduplication. If a social platform’s browser pixel and its server-side conversions API both send the same purchase or lead without a shared identifier, the event can be counted twice. One large social ad platform documents its rule: it deduplicates only when the pixel’s eventID matches the server event’s event_id, the event names match, and both arrive within 48 hours (platform deduplication documentation, accessed 2026-10-18)4. Check the equivalent rule for each platform you send server events to. Double counting makes ROAS look better right before you scale into a reporting mirage.

Consent changes what you can observe. With Google’s consent mode, tags adjust to the visitor’s consent choices; in the advanced implementation, Google Ads and Analytics model conversions for users who declined, and in the basic implementation they fall back to a general model (Google: consent mode overview, accessed 2026-10-18)5. Know which mode you run and how much of your reported conversion count is modeled before you compare periods.

Use this checklist before you raise budgets. It’s verifiable and owner-assigned, so executives can treat it like a pre-flight, not a marketing opinion.

Measurement Integrity Checklist (Before You Scale Spend)

CheckWhyHow To ValidateOwnerSeverity If Wrong
Primary conversion definitions are stableBidding optimizes what you define, not what you meantGTM Preview + GA4 DebugView: one real action = one event; no double-fire on refresh or backAnalytics/EngineeringCritical
UTMs are consistent across channelsBroken UTMs = broken reporting and debuggingSpot-check a sample of live ad clicks (ten is a reasonable start): GA4 session source/medium/campaign are correct, not direct/nonePerformance MarketingHigh
Cross-domain + redirects retain UTMs + click IDsLost params break attribution and offline matchingCold click with utm_* + gclid or the social platform’s click ID: final URL keeps them; GA4 receives params; cross-domain linker testedWeb/EngineeringHigh
Event deduplication is configured (browser + server)Double counting fakes ROAS/CPA improvementsConfirm matching event_id and event name across browser pixel and server events (deduplication rules); reconcile counts across GA4, pixel, and serverAnalytics/EngineeringCritical
Bot/spam filtering policy exists for conversionsForm spam corrupts CPA and trains bidding wrongReview the last month: spam rate, patterns, blocked sources; confirm CAPTCHA + server validation; exclude spam from offline importsRevOps/WebHigh
Single source of truth for revenue is documentedCRM vs billing mismatches break MER and payback mathDefine the canonical revenue source (billing/ERP); reconcile totals against CRM closed-won monthly; document mapping and gapsFinance/RevOpsHigh
Consent + tagging behavior is understoodConsent loss changes observed conversionsDocument CMP + consent mode (basic or advanced); track observed vs modeled conversions and any consent-policy changesAnalyticsMedium
Offline outcomes are mapped back to adsWithout it, “cheap conversions” winTrace a sample of SQLs or opportunities: click IDs → upload; confirm stage mapping, match rate, and timestampsRevOpsHigh
Attribution windows are explicitWindow changes can “improve” results artificiallyRecord each channel’s attribution window and last change date; don’t change mid-testPerformance MarketingMedium
QA checks exist for deploymentsSmall site changes can kill measurement silentlyPre/post release QA: conversion fires, params retained, consent works; alert on a sudden conversion dropWeb/EngineeringCritical

Three warning signs that attribution is improving while incrementality is getting worse:

  1. conversion rate rises while the qualified pipeline rate falls,
  2. retargeting’s share of conversions grows without new pipeline growth,
  3. reported ROAS rises while MER stays flat or declines.

What to do next: PPC diagnosis → next action

if you see this symptom (now)likely diagnosisnext action (do this before scaling)
ROAS up but MER flat/downDeduplication drift, retargeting over-credit, or attribution inflationAudit dedupe and retargeting share; plan an incrementality test (holdout, geo split, or exclusion test)
CPA down but pipeline quality downConversion definition is too shallowTighten the primary conversion; import offline outcomes (SQL accepted or Opportunity created) and optimize to those
Conversions too low for platforms to learnToo much structure + too little signal; offer/intent too broadSimplify structure; tighten intent; extend the evaluation window; shift to a higher-intent offer
Results look “too good” suddenly (week-over-week jump)Measurement integrity issue (double counting, broken params, new attribution window)Freeze scaling; run the measurement integrity checklist end to end; validate parameter retention and dedupe before changing budgets

Budgeting and Unit Economics: CAC, Payback, Margin, and Risk

A platform can optimize perfectly and still lose you money, because platforms optimize to your selected event, not to your business constraints.

Your guardrails should be business-native:

  • Max CAC: the most you can pay to acquire a customer profitably.
  • Payback window: how long cash can be tied up before you recover acquisition cost.
  • Margin thresholds: how much contribution margin remains after acquisition and delivery.
  • Risk tolerance: how much volatility you can accept while learning.

CPA and ROAS are not “bad,” but they’re incomplete. They mislead when conversion definitions are too top-funnel, when the sales cycle is long, or when attribution is overconfident.

Treat attribution as an accounting system, not physics. Only a controlled comparison separates “credited” from “caused.” Google Ads campaign experiments, for example, split traffic between your original campaign and a trial version, and recommend cookie-based splits so each user sees only one version (Google Ads Help: set up a custom experiment, accessed 2026-10-18)6. A before/after comparison without a control is correlation; label it that way.

Use this table to translate platform metrics into business meaning, and to know when a “win” is suspicious.

KPI Translation Table (Platform Metrics → Business Outcomes)

metricMeasuresgood Signal Whenmisleading Whenpaired Metric
CPACost per tracked conversion actionConversion is tightly tied to qualified intentConversion is shallow (e.g., any lead) or easily gamedQualified lead rate (SQL accepted / leads)
CACFully loaded cost to acquire a customerYou can connect spend to closed-wonSales cycle is long and you attribute too earlyPayback period
ROASAttributed revenue / spendYou sell transactionally or have reliable revenue mappingAttribution inflates credit (retargeting, view-through)MER
MERTotal revenue / total marketing spendYou want executive-level efficiencyRevenue is seasonal and you ignore lag windowsPipeline velocity ((Opps × win rate × ACV) / cycle length)
CTRClick propensityCreative-message fit is improvingYou optimize clicks instead of outcomesCVR
CVRLanding/offer effectivenessConversion is valid and consistentTracking breaks or form spam risesLead quality (share reaching SQL/Opp within your lag window)
Impression shareAuction coverageCapture channels are constrained by rank/budgetYou buy unqualified reach just to “own” shareIncremental pipeline (vs a control)

Contrarian but practical: in B2B, a lower CPA can be a negative signal if it comes from a weaker conversion definition or a shift toward low-intent audiences. Your job isn’t to win the cheapest conversion; it’s to win the right unit economics.

Default operational definitions used in this guide:

  • Lead quality: the share of leads that reach SQL accepted or Opportunity created within your lag window (computed below from your own CRM history).
  • Incremental pipeline: pipeline that increases versus a randomized or geographic control during a test window. Without a control, report the change as directional.

Small Numbers and Lag: Rules That Survive Scrutiny

Low-volume B2B accounts produce small counts, and small counts swing a lot on their own. Two rules keep you from acting on noise.

Rule one: wait out the lag before you judge lead quality

If leads take weeks to become SQLs, last week’s leads will look low-quality no matter what you changed. Measure your own lag from CRM history, then judge lead quality only on leads older than it.

-- lag.sql: how long do leads take to become SQLs? Tested in DuckDB (duckdb < lag.sql).
-- Replace the VALUES list with your CRM export: one row per lead that reached SQL.
WITH leads(lead_id, created_at, sql_at) AS (
  VALUES
    (1, DATE '2026-07-01', DATE '2026-07-03'), (2, DATE '2026-07-02', DATE '2026-07-20'),
    (3, DATE '2026-07-05', DATE '2026-07-09'), (4, DATE '2026-07-08', DATE '2026-08-02'),
    (5, DATE '2026-07-10', DATE '2026-07-12'), (6, DATE '2026-07-14', DATE '2026-07-30'),
    (7, DATE '2026-07-15', DATE '2026-07-22'), (8, DATE '2026-07-21', DATE '2026-07-24')
)
SELECT count(*) AS sql_leads,
       round(percentile_cont(0.5) WITHIN GROUP (ORDER BY sql_at - created_at)::numeric, 1) AS median_days,
       round(percentile_cont(0.9) WITHIN GROUP (ORDER BY sql_at - created_at)::numeric, 1) AS p90_days
FROM leads;

On the illustrative sample above, it reports a median under a week and a 90th percentile of about three weeks. With numbers like those, a lead-quality comparison should only include leads at least three weeks old.

Rule two: test whether a count really changed

Replace “pause if lead quality drops below X% of baseline” with a check that knows how noisy small counts are. This script gives an exact 95% interval for each count (Garwood’s method) and an exact test of whether the two periods could share the same underlying rate; it assumes both windows are the same length.

"""counts.py: is a change in a small count real? (Python 3, stdlib only)

Usage: python3 counts.py BASELINE_COUNT CURRENT_COUNT
Both counts must cover windows of equal length (for example, four weeks each).
Prints an exact 95% interval for each count and a two-sided exact test of "same underlying rate".
"""
import math
import sys


def poisson_cdf(k, mu):
    term = total = math.exp(-mu)
    for i in range(1, k + 1):
        term *= mu / i
        total += term
    return total


def solve(f, lo, hi):
    for _ in range(200):  # bisection: f(lo) < 0 < f(hi)
        mid = (lo + hi) / 2
        lo, hi = (mid, hi) if f(mid) < 0 else (lo, mid)
    return (lo + hi) / 2


def interval(k, alpha=0.05):
    """Exact (Garwood) interval for a Poisson count."""
    lower = 0.0 if k == 0 else solve(lambda mu: (1 - poisson_cdf(k - 1, mu)) - alpha / 2, 0, k + 50)
    upper = solve(lambda mu: alpha / 2 - poisson_cdf(k, mu), 0, k * 3 + 50)
    return lower, upper


def same_rate_p(a, b):
    """Conditional test: given a + b events, b ~ Binomial(a + b, 0.5) if the rates are equal."""
    n = a + b
    probs = [math.comb(n, i) * 0.5**n for i in range(n + 1)]
    return min(1.0, sum(p for p in probs if p <= probs[b] * (1 + 1e-9)))


baseline, current = (int(x) for x in sys.argv[1:3])
for label, k in (("baseline", baseline), ("current", current)):
    lo, hi = interval(k)
    print(f"{label:9} {k:4d}  95% interval {lo:6.2f} to {hi:6.2f}")
p = same_rate_p(baseline, current)
print(f"two-sided p = {p:.3f}: " + ("treat as noise" if p >= 0.05 else "unlikely to be noise; investigate"))

Two illustrative runs (run 2026-10-18; results cross-checked against SciPy):

$ python3 counts.py 12 8
baseline    12  95% interval   6.20 to  20.96
current      8  95% interval   3.45 to  15.76
two-sided p = 0.503: treat as noise

$ python3 counts.py 40 22
baseline    40  95% interval  28.58 to  54.47
current     22  95% interval  13.79 to  33.31
two-sided p = 0.030: unlikely to be noise; investigate

The first case is the one that fools teams: qualified opportunities fell from twelve to eight, a third lower, and it’s entirely consistent with nothing having changed. The second drop is large enough to investigate (start with the measurement integrity checklist, not the bids). The intervals are Garwood’s exact Poisson limits (Garwood, Biometrika, 1936, accessed 2026-10-18)7; the test is the classic conditional comparison of two Poisson counts (Przyborowski and Wilenski, 1940, accessed 2026-10-18)8.

Use it as a stop rule written down before launch: for example, “pause and investigate if a four-week count of qualified opportunities drops versus the previous four weeks with p < 0.05, counting only leads older than our lag window.” A p-value is not a business decision; it tells you whether there is anything to decide.

Account Architecture: Campaigns, Audiences, and Creative Loops

Account structure is not a hygiene task; it’s an optimization lever. It controls how cleanly you can interpret signals and how safely you can change variables.

A useful mental model is to separate learning loops:

  • Prospecting: generate new demand signals (often noisy).
  • Retargeting: convert existing interest (often over-credited).
  • Brand protection: capture high-intent navigational demand without confusing it for growth.

Social platforms can blend prospecting and retargeting unless you deliberately segment audiences and creative intent. A second search engine can act as a parallel capture loop, but only if conversion definitions are consistent enough to compare.

Keep the message matched to intent:

  • problem-aware buyers need clarity on stakes and criteria,
  • solution-aware buyers need differentiation and proof,
  • product-aware buyers need friction removal and risk reduction.

Simplicity wins when volume is low. If your account structure creates more buckets than your conversion flow can feed, you’ll mistake randomness for signal.

Here’s the optimization loop as a system, not a platform tutorial:

Objective + guardrails

Conversion definition

Launch small

Is the signal
trustworthy?

Are the unit
economics OK?

Scale with rules

In words: set the objective and guardrails, define the conversion, launch a minimal structure, and check whether the signal is trustworthy. If it isn’t, fix measurement and relaunch. If it is, check unit economics (adjust the offer, landing page, or targeting if they fail and relaunch), then scale under written rules and re-check incrementality and quality as you go.

Testing and Optimization: What to Change (and What to Leave Alone)

The fastest way to destroy performance is “random walk optimization”: changing everything because you’re under pressure to do something.

A disciplined test has:

  • one variable,
  • one hypothesis,
  • one success metric,
  • and a decision rule (scale, stop, iterate) written before launch.

Keep the decision surface stable: one report view whose definitions don’t change every week. Use your CRM to validate whether improvements are real (quality, progression, close rate), not just attributed.

What to change first depends on the failure mode:

  • If traffic is relevant but conversion is weak, prioritize landing page and offer clarity.
  • If traffic is irrelevant, prioritize targeting and intent alignment.
  • If outcomes look “too good,” prioritize measurement integrity before believing anything.

The leakage grid

In attribution-constrained B2B programs, performance usually leaks in one of four places: intent, offer, measurement, or economics. Identify the failure mode and fix it in this order.

leakageAreacommon symptom (what you observe)fix-first order
MeasurementSudden jumps, conflicting dashboards, “too good” performanceFix tracking integrity, parameter retention, dedupe, and offline mapping
IntentHigh spend, low qualified rate, lots of “curiosity clicks”Tighten targeting and keywords; narrow to high-intent paths; exclude junk
OfferCTR fine but CVR weak; demos booked but no-shows; pipeline stallsStrengthen the offer’s promise, proof, and friction removal; align landing to intent
EconomicsGood platform metrics but payback/CAC failsReset guardrails; adjust pricing/package, funnel efficiency, or channel mix

If you can’t write your conversion definition and your scale rule in one sentence each, you’re not ready to scale spend.

One-page worksheet (copy/paste):

Primary conversion (one sentence):
Offline outcome (SQL accepted or Opportunity created):
Lag window you will report on (from lag.sql on your own CRM data):

Leakage diagnosis (choose one): measurement / intent / offer / economics
Fix-first action (this week):
Decision rule (scale/stop/iterate), including the counts check you'll apply:

Two guardrails to reduce self-inflicted volatility:

  • Don’t change bidding, targeting, and creative in the same window.
  • Don’t declare winners or losers until the counts check says the change is unlikely to be noise, using only outcomes older than your lag window.

Reporting that Executives Trust

Executives don’t want a dashboard. They want a narrative that survives cross-examination.

A one-page report structure that holds up:

  1. Goal (business outcome, not platform objective)
  2. Spend (and what changed)
  3. Outcome (pipeline or revenue proxy, plus a quality note)
  4. Constraints (volume, lag, tracking integrity)
  5. Next actions (tests and decisions)

If you report ROAS, pair it with a credibility statement: what you’re assuming about attribution, lag windows, consent, and deduplication. That’s how you avoid the trap where performance “improves” right before budget increases, and then collapses.

Copy/paste executive reporting template:

Goal:
Spend (what changed):
Outcome (pipeline/revenue proxy + quality note):
Credibility statement (lag window, attribution window, dedupe status, consent mode, modeled share):
Noise check (counts.py result for the headline number):
Next actions (tests + decision rules):

FAQ (Definitions)

What is the difference between CAC and CPA?
CPA is the cost for a platform-tracked conversion action; CAC is the fully loaded cost to acquire a customer (including sales, tools, and non-converting spend).

What is the difference between ROAS and MER?
ROAS is revenue attributed to an ad platform divided by spend; MER (marketing efficiency ratio) is total revenue divided by total marketing spend, regardless of attribution.

What is the difference between brand and non-brand PPC?
Brand PPC targets queries containing your brand or product name; non-brand PPC targets category, problem, or competitor intent where the buyer may not know you yet.

What is “incrementality” in paid media?
Incrementality is the lift you caused (additional outcomes compared with a randomized or geographic control), not the outcomes you were credited for by attribution.

What does “learning phase” mean in paid media?
It is the period in which a platform’s delivery system explores audiences, creative, and placements before delivery stabilizes. Low conversion volume and frequent significant edits keep campaigns in it longer.

When is a lower CPA a bad sign in B2B?
When the “conversion” is too top-funnel (or low-quality), CPA can fall while qualified pipeline and closed-won outcomes get worse.

Next Steps: A Two-Week Paid Media Setup Plan (Without the Busywork)

This plan is for teams with limited conversion volume and a long sales cycle. It’s intentionally high-level: no platform feature tour.

First: measurement integrity and conversion definitions

  • Align your primary conversion with the business outcome you actually want, and mark it as a key event.
  • If ecommerce purchases are in the mix, confirm event quality and deduplication before you trust ROAS.
  • If you use a server-side conversions API, confirm that server and browser events share IDs and reconcile.
  • Run lag.sql on your CRM history and write down your lag window.

Then: launch a minimal architecture with guardrails

  • Separate prospecting from retargeting intent.
  • Write the stop rule before you spend, using the counts check and the lag window rather than a fixed percentage of baseline.
  • Document attribution assumptions, consent mode, and lag windows so you can explain changes without platform folklore.

Then: the first disciplined test cycle

  • Run one meaningful test (one variable, one hypothesis), with a control if the platform supports one.
  • Translate outcomes with the KPI translation table so you don’t optimize the wrong number.
  • Decide (scale, iterate, or rebuild) based on signal trustworthiness and economics, not platform optimism.

If you want this measurement QA set up for your account, see sales funnels and paid media.

How this was checked

Platform behavior (GA4 key events, UTMs, offline conversion import, social-platform deduplication, consent mode, Google Ads experiments) was checked against the linked documentation on 2026-10-18. Both scripts were run on 2026-10-18; their sample inputs are illustrative, not client data, and the interval and p-values were cross-checked against SciPy. The channel matrix, rules of thumb, and plan are editorial judgment, not measured results.