Savings Methodology

How we compute "potential damage" and "AdFraud Shield contribution"

Full formula and known limitations behind the dashboard's two figures — the upper bound (counterfactual potential damage) and the lower bound (verified AdFraud Shield contribution). The single reference customers and sales can point to when asked "how do you arrive at that number?"

Last updated: 2026-05-07 (revamped to a 2-number model after a 3-round Gemini × Codex audit)

1. Why we show two numbers

"We blocked X bots" alone is too abstract for an e-commerce marketer. Translating it to ad spend makes ROI legible against the subscription fee.

But "savings" and "potential damage if no protection existed" are not the same thing — the **first click from a brand-new IP is always already paid for** (we judge on the landing page, after the click was billed). Some bots also fall below the exclusion threshold (score ≥ 85), are IPv6, or trip the false-positive guard, so they never reach Google Ads.

We therefore show two figures: ① upper = "potential damage without protection" (counterfactual) and ② lower = "AdFraud Shield contribution" (a conservative lower bound — only bot verdicts whose IP had time to propagate to Google Ads). Transparency over a single inflated number.

2. Formulas

potential_damage = SUM(bot verdict × site avg_cpc)
protected_savings = SUM(bot verdict × avg_cpc) FILTER WHERE the IP entered excluded_ips ≥ 1h before the verdict
  • bot_count: clicks classified as bot by the engine over the period (24h / 7d / 30d), aggregated from the `verdicts` table.
  • avg_cpc: weighted CPC pulled from the Google Ads API. Cascades 30 → 90 → 180 day windows so paused-mid-month customers still get real spend data (technical brief has the rest). Falls back to ¥100 (Japan EC median) when no spend data is available.
  • For multi-site owners, savings are computed per-site (each site's bot_count × that site's avg_cpc) and SUM'd via SQL JOIN. Agency-mode customers managing several stores stay accurate.
  • Additional protected-savings condition: only bot verdicts whose IP had been in the exclusion-candidate DB for **1h or more** are counted, as a proxy metric for the IP-exclusion path. Sync success, reflection on the Google Ads side, and actual ad suppression are not verified by this metric.

3. Limits, openly stated

**"Potential damage" is a counterfactual upper bound**: a hypothetical "if you had no protection." Google's actual invoice is not reduced by this amount. Roughly 21% of all bot verdicts are first-time hits whose click was already paid (production measurement).

**"AdFraud Shield contribution" is also not a direct measurement**: Google Ads' API does not report which clicks it blocked using your exclusion list. We use "IP was in the list ≥ 1h before the verdict" as a conservative proxy. IP-rotating bots are an inherent gap.

**±30% CPC variance**: avg_cpc is an average. Bots concentrated on premium campaigns mean true protection is higher; cheap campaigns mean lower.

**Not all bots arrive via ads**: a small fraction may be SEO/link-organic. Probability is low, but we cannot fully exclude it.

**Overlap with Google's own filters**: Google Ads itself flags some clicks as `invalid_clicks` and refunds them. Our pre-block and Google's post-refund are separate defenses — they run in parallel, not added (see the two-stage panel on /integrations).

4. Four ways for a customer to verify the number

You don't have to trust the figure. Here are four independent ways to check it.

Level 1 — read the dashboard number

As-is. Zero work. Persuasiveness: weak-medium.

Level 2 — watch Google Ads `invalid_clicks` over time

The /integrations page shows your Google Ads `invalid_clicks` in the two-stage panel. After AdFraud Shield is active, attempts that ever reach Google decrease, so this number trends down. Persuasiveness: medium.

Level 3 — compare CPA before vs. after sync

In Google Ads → campaign view, compare the same campaign's CPA in the 4 weeks before sync started vs. the 4 weeks after. Improvement is direct evidence of bot exclusion impact (need ~1 month of data to factor out seasonality). Persuasiveness: strong.

Level 4 — A/B test (apply sync to half your campaigns)

Run AdFraud Shield-enabled vs. AdFraud Shield-disabled campaign groups in Google Ads in parallel. Compare CPA / conversion rate. Statistically definitive. Persuasiveness: strongest. Effort: highest.

5. Update cadence

  • bot_count: real-time (each new verdict immediately updates the aggregate).
  • protected_count (defense contribution): today's bucket is computed live; past days are finalized by the daily aggregator (early rollup at 00:05 JST, re-aggregated at 03:20 JST). When avg_cpc is updated, BOTH bounds re-multiply against the new CPC at read-time, so the defense ratio you see is always internally consistent.
  • avg_cpc: hourly sync (pulls real spend from Google Ads API).
  • Google `invalid_clicks` (two-stage panel): hourly sync.
  • Dashboard numbers: cached in Redis with a 5-minute TTL, so the value you see is at most 5 minutes old (avoids API rate-limit pressure).
Read the Technical BriefContact sales