MetricFabric.io
One dashboard · SEO and paid search

One dashboard across Ads, Analytics and Search Console — and what to do about it.

Google gives you three consoles that don't talk to each other. MetricFabric.io joins Search Console, GA4 and Google Ads into a single view, then tells you where your ad spend is wasted and which pages and queries are worth working on.

Read-only access · revoke any time · EU-resident storage
overlap.paid_vs_organicexample · £4,180 / mo flagged
queryposclicksspend
crm for accountants1.0412£1,904
practice management software1.2288£1,142
bookkeeping crm uk1.4201£731
accountant client portal2.0154£403
Recommendation: pause these four terms. You already rank first organically and are paying twice for the same click. The report needs all three sources — SEO tools don't have Ads, Ads tools don't have Search Console.
3 sources
Ads, GA4 and Search Console on one row
Daily
automated audits across every connected source
Deterministic
checks for waste, decay, striking distance and caps
Read-only
we never write to your Google accounts

Three sources, joined on the page and the query.

The joins are the point. Once impressions, sessions, conversions and cost sit on one row, the recommendations write themselves.

Search Console
Query, page, country, device — daily

Every property in the account, at the row limits the API allows, plus your BigQuery bulk export if you have one.

webmasters.readonly
Analytics 4
Sessions, conversions, landing pages

Landing-page performance keyed to the same URLs as Search Console, so organic impressions and outcomes sit on one row.

analytics.readonly
Google Ads
Search terms, spend, match type, budget caps

Search-term level detail is what makes the paid-versus-organic join possible, and what makes wasted spend findable.

adwords

Recommendations, not another chart.

Deterministic checks run every day against your own rows. Each one names the account, the number and the action.

Ad spend
Paying for clicks you already own

Search terms where you rank first organically and still buy the click. Needs Ads and Search Console together — which is why nobody else reports it.

Ad spend
Zero-conversion and match-type waste

Broad-match terms burning budget with no conversions, and campaigns losing impressions to budget caps while others underspend.

SEO
Striking distance and content decay

Queries sitting at positions 5–15 where a small gain pays, and pages whose impressions have been sliding for months before the traffic drop shows.

Every recommendation is a rule you can read, run against numbers you can click through to. Where we use a language model, it writes the explanation — never the analysis.
Also included · hosted MCP endpoint

Or ask it yourself, from the AI client you already use.

When you want to go past the dashboard, your MCP endpoint reads the same joined data directly — across all three sources and across your whole history, not just the window Google's own tooling still holds.

How the endpoint works →
mcp.metricfabric.io/sse
How did “crm for accountants” perform in Q3 2024 versus Q3 2025, and what did we pay for it?
→ gsc.query_performance(query, range: 2024-07-01…2024-09-30)
→ ads.search_terms(term, range: 2025-07-01…2025-09-30)
Impressions up 31% year on year, average position 3.4 → 1.0. Paid clicks on the same term rose to 412 at £1,904 — the position gain did not reduce spend.

What we do with your Google data

We request read-only scopes and use the data only to provide the features you can see in your own account. We do not sell it, we do not use it for advertising, and we do not use it to train or improve any generative model. Data is stored in Germany and deleted 90 days after you cancel — exportable in full until then.

Data residencyHetzner, Germany (EU)
Access levelRead-only, revocable
Retention90 days after cancellation
Model trainingNever
Product

One dashboard, then the actions.

Everything below is a view onto rows we hold in one schema. That is what makes the cross-source joins possible, what makes the recommendations checkable, and what keeps your history when Google's window has moved on.

01 Connect the three sources, read-only Read-only OAuth for the properties you choose. 16 months of history is backfilled immediately so the joins have something to work with; if you have a BigQuery bulk export, we import that too.
02 It collects every day, quietly Daily incremental collection across all dimensions, hot and cold tiers, so last week is fast and 2023 is still there.
03 Report, alert, or ask Scheduled reports and anomaly alerts by email or Slack, shareable client reports, and an MCP endpoint scoped to your workspace.

The reports that need more than one source

ReportWhat it findsNeeds
Paid × organic overlapSpend on search terms where you already rank in the top three organicallyGSC + Ads
Search-term wasteCost against terms with no conversions across a statistically useful windowAds
Striking distanceQueries sitting at positions 4–15 with impression volume worth chasingGSC
Content decayPages holding impressions while clicks and conversions fall awayGSC + GA4
Budget-cap lossesImpression share lost to budget on campaigns that convertAds

Every one of these is a deterministic rule over your own rows — checkable, explainable and cheap. Where the product writes prose about a finding, the finding came first.

MCP

A read-only interface onto your own joined data.

Not an AI integration in the sense that we send your data somewhere. An authenticated endpoint, scoped to one workspace, that answers requests you make from a client you configured.

1. Your endpoint
https://mcp.metricfabric.io/w/<workspace>/sse
2. Add it to your client
{
  "mcpServers": {
    "metricfabric": {
      "url": "https://mcp.metricfabric.io/w/acme/sse",
      "headers": { "Authorization": "Bearer oc_live_…" }
    }
  }
}

Tokens are created and revoked by you, scoped to a single workspace, and never carry your Google credentials — those stay on our servers. Every call is logged against your workspace so you can see exactly what left it and when.

Tools exposed
gsc.query_performanceread
gsc.page_performanceread
ga4.landing_pagesread
ads.search_termsread
overlap.paid_vs_organicread
No write tools exist. The endpoint cannot change anything in your Google accounts. When you connect a third-party AI client, data goes to that provider under your terms with them — worth reading before you connect client accounts.

Pricing

One dashboard across all three sources, with recommendations that name the action. 14 days free while the first audit runs, so you see what it finds in your own accounts before you pay — and unlimited retention on every plan, because the joins need the history.

Save 10%
{{ plan.name }} {{ plan.badge }}
{{ plan.price }} {{ plan.unit }}
{{ plan.subline }}

{{ plan.blurb }}

{{ f.label }}
{{ plan.ctaLabel }}
Over your property count? Nothing breaks.

We keep collecting and show you the overage — £6/mo per extra property on Warehouse, £5/mo on MCP. Halting ingestion to enforce a plan limit would destroy the one thing you are paying us for.

Cancelling keeps your data for 90 days

Exportable in full the whole time, in CSV or Parquet. After 90 days it is deleted and our Google access tokens are revoked. You can also delete everything immediately yourself.

FreeWarehouse+ MCPAgency
Search Console properties1310Unlimited
History retainedUnlimitedUnlimitedUnlimitedUnlimited
GA4 and Google Ads ingestionYesYes
Hosted MCP endpointYesPer client
Scheduled reports and alertsYesWhite-labelled
CSV and Parquet exportYesYesYes
BigQuery bulk-export importYesYesYes
Security & data handling

Where your data lives, and who can reach it.

Written plainly because reviewers, buyers and your own clients all ask the same questions.

Encryption

TLS 1.2+ in transit with HSTS, AES-256 at rest for databases, object storage and backups. OAuth and MCP tokens live in a dedicated secrets store with envelope encryption and are excluded from all logs.

Tenant isolation

Every row carries a tenant identifier and isolation is enforced by row-level security in the database, not by application code alone. MCP tokens are scoped to a single workspace.

Access

Least privilege, named accounts, mandatory MFA for production, quarterly access review, revocation within one working day of a role change. No one reads your data except on your support request or where security or law requires it.

Resilience

Encrypted daily backups with 35-day retention, restores tested quarterly, documented objectives of RPO 24 hours and RTO 8 hours.

Sub-processors

EntityPurposeLocation
Hetzner Online GmbHServers, database and object storage — all ingested dataGermany
Cloudflare, Inc.DNS, TLS termination, CDN, DDoS protectionEU PoPs; US parent
Stripe Payments EuropeBilling — billing identity only, never Google dataIreland
Resend, Inc.Transactional email and scheduled report deliveryUnited States

AI clients you connect over MCP are not our sub-processors — they receive data only when you make a request from a client you configured with a token you created. We give 30 days' notice before adding any sub-processor that touches ingested Google data.

Docs

Data model and API

The schema is public. Everything the dashboard, the recommendations and the MCP endpoint read is here, so you can check any number we show you.

gsc_daily
tenant_id · property_id
date · query · page
country · device
clicks · impressions
ctr · position
ga4_daily
tenant_id · property_id
date · landing_page
channel
sessions · engaged_sessions
conversions · key_events
ads_search_terms_daily
tenant_id · customer_id
date · search_term
campaign · ad_group
match_type
impressions · clicks
cost_micros · conversions

The overlap join

select t.search_term, g.position, g.clicks as organic_clicks,
       t.clicks as paid_clicks, t.cost_micros/1e6 as cost
from ads_search_terms_daily t
join gsc_daily g
  on g.tenant_id = t.tenant_id
 and g.date = t.date
 and normalise(g.query) = normalise(t.search_term)
where g.position <= 3.0
  and t.cost_micros > 0;

This is the whole differentiator, and it is four lines of join condition. It only works because both tables are in the same store, under the same tenant, on the same dates.

REST API

GET/v1/gsc/queries?property=&from=&to=&limit=
GET/v1/gsc/pages?property=&from=&to=
GET/v1/ga4/landing-pages?property=&from=&to=
GET/v1/ads/search-terms?customer=&from=&to=
GET/v1/reports/overlap?property=&customer=&from=&to=

Bearer-token auth with the same workspace-scoped tokens as MCP. Full reference and the backend implementation ship in the repository.