Which Ads Make Money? Revenue Attribution Your AI Agent Can Read Over MCP
Stripe MCP has payments. Meta and Google Ads MCP have spend. Neither tells your agent which ad made a paying customer. Here is how joined revenue attribution over MCP works, field by field.

The short answer: Stripe's MCP server gives an agent payment data, and the Meta and Google Ads MCP servers give it spend and platform-reported conversions, but none of them alone tells you which ad produced a paying customer. That needs a tool that joins ad spend, the visitor's session and the matched payment. Humblytics does this and exposes it over a hosted MCP server, so Claude, Cursor or another MCP client can report revenue and return on ad spend per Meta or Google Ads campaign from Stripe or Foxy payments, not clicks.
Ask an agent "which campaign brought in paying customers last month?" and the answer depends on what it can see. Most agents connected to marketing tools today can see one side of the question. This post shows what each server answers on its own, what the joined answer looks like, and the prompts that get you there.
TL;DR
- Payments, spend and sessions live in three different systems. Revenue per campaign needs all three joined.
- Stripe MCP has payments. Meta Ads MCP and Google Ads MCP have spend and their own conversion counts. None has the session that links a click to a payment.
- Humblytics
get_ads_attributionreturns spend, sessions, revenue, ROAS and true CPA per campaign, plus the campaigns that did not join.- Every Humblytics ad tool is read-only. Your agent can report on spend. It cannot change it.
Which MCP servers can tell your agent which ads make money?
Only one that joins spend to payments. To say "campaign X made $Y", an agent needs three facts about the same customer:
- Spend. What the campaign cost. This lives in Meta Ads or Google Ads.
- Session. Which campaign the visitor arrived from. This lives in your site analytics, usually as a
utm_campaigntag. - Payment. Whether that visitor paid, and how much. This lives in Stripe or another payment processor.
Ad platforms know spend and their own pixel conversions. Stripe knows payments. Neither knows the session in between. Your analytics knows the session, and if it also holds spend and payments, it can do the join.
What Stripe MCP, Meta Ads MCP and Google Ads MCP each answer alone
All three vendors ship an official MCP server. Each is good at its own data. We read each vendor's documentation on 5 November 2026.
| Server | Hosting | What the agent gets | Can it write? | Can it answer "revenue per campaign"? |
|---|---|---|---|---|
| Stripe MCP | Hosted at mcp.stripe.com |
Read and write on Stripe API objects through stripe_api_read and stripe_api_write, plus stripe_analytics (preview) for metrics, subscriptions and billing |
Yes | No. Stripe has no ad spend and no record of the ad click. |
| Meta Ads MCP | Meta-hosted at mcp.facebook.com/ads |
Reporting on spend, impressions, CTR, ROAS and more, plus creating and editing campaigns, ad sets and ads | Yes | Partly. Its ROAS uses Meta's own conversion tracking, not your payments. |
| Google Ads MCP | Runs locally with Python, or self-hosted on Cloud Run | list_accessible_customers, search (GAQL queries for metrics, budgets and status) and get_resource_metadata |
No. Read-only in the current release. | Partly. It reports Google's own conversions, not your payments. |
| Humblytics MCP | Hosted at mcp.humblytics.com/v1, or local over stdio |
Spend joined to sessions and Stripe or Foxy revenue per campaign, plus traffic, funnels and A/B tests | Only A/B tests and saved funnels. Ad tools are read-only. | Yes, for Meta and Google Ads campaigns tagged with utm_campaign. |
A few details matter when you pick:
- Stripe recommends turning on your client's tool-approval setting so you review tool calls before they run. Its server can write, including refunds and subscription changes. Stripe also says it will stop accepting full-access secret keys and untagged restricted keys in December 2026, so use OAuth or an agent API key.
- Meta's server can change your ads. Meta's own guidance is to give an agent read-only access unless it needs to make changes.
- Google's server needs a Google Cloud project with Google Ads API access and OAuth or service account credentials.
You can connect all of them at once. The point is that connecting Stripe and Meta side by side does not give the agent the join. It gives it two lists with no shared key, and the agent will guess.
Joined attribution over MCP: what the agent sees
The Humblytics MCP server has one tool for this: get_ads_attribution. It takes a date range and returns the full funnel per campaign, from impressions to revenue.
Inputs
| Input | Notes |
|---|---|
startDate |
Inclusive ISO date, for example 2026-10-01 |
endDate |
Inclusive ISO date, for example 2026-10-31 |
propertyId |
Optional. Resolved for you when your key covers one site. With several sites, the agent calls list_properties first. |
Dates are date-only and use the property's default timezone.
What comes back
| Section | What it holds |
|---|---|
campaigns[] |
Campaigns that joined across spend, sessions and revenue |
totals |
The same metrics rolled up across matched campaigns |
unmatched_ad_campaigns[] |
Spend with no matching utm_campaign in session data |
unmatched_utm_campaigns[] |
Sessions and revenue with a utm_campaign but no matching spend |
breakdowns |
Per campaign, sessions by device, country, browser, OS, landing page and utm_content |
connections |
How many Meta and Google Ads connections the site has |
Fields per campaign
| Field | Meaning |
|---|---|
campaign, utm_campaign, platforms |
Ad platform name, the UTM value it matched on, and google and/or meta |
top_landing_page, target_urls |
Where the campaign sent people |
spend, impressions, clicks, ad_conversions |
From the ad platform. ad_conversions is the platform's own pixel or tag count. |
sessions, click_to_session_rate |
Visits matched to the campaign, and sessions divided by clicks |
revenue_conversions, revenue, trial_count |
Matched payments and trial starts |
roas |
Revenue divided by spend |
true_cpa |
Spend divided by revenue conversions: what one paying customer cost |
cost_per_trial, avg_hours_to_convert |
Spend per trial, and average time from first session to payment |
Here is what one row looks like. This is example data from the sample response in the Humblytics API docs, not a customer account.
| Field | Example value |
|---|---|
campaign |
GADS_CORE_PainPoints_2026Q1 |
spend |
1,240.55 |
clicks |
1,832 |
ad_conversions |
41 |
sessions |
1,654 |
revenue_conversions |
12 |
revenue |
4,380.00 |
roas |
3.53 |
true_cpa |
103.38 |
Look at ad_conversions next to revenue_conversions. In this example the ad platform counted 41 conversions, and 12 payments matched the campaign. That gap is the reason to join on payments. The platform number tells you what its pixel or tag saw. The revenue number tells you who paid.
The two unmatched lists are just as useful. A campaign in unmatched_ad_campaigns is spending money you cannot trace, usually because the ad link has no utm_campaign. A row in unmatched_utm_campaigns is tagged traffic with no spend behind it, often email or organic. An agent can read both and tell you exactly which links to fix.
How to connect it
- Connect your sources in Humblytics. Add Meta Ads or Google Ads under Connectors, and connect Stripe or Foxy as your revenue source.
- Tag your ads. Every ad link needs
utm_campaign. For Google Ads, setutm_campaignto the campaign name in each campaign's final URL suffix, because Google has no campaign-name ValueTrack parameter. - Add the server to your agent. In Claude Code, run
claude mcp add humblytics --transport http https://mcp.humblytics.com/v1. In other MCP clients, addhttps://mcp.humblytics.com/v1as a streamable HTTP server. Developers can also run it locally over stdio with their own API key.
Until both an ad source and a revenue source are connected, get_ads_attribution returns empty revenue rather than a guess. If connections shows { google: 0, meta: 0 }, the agent knows no ad source is connected and can tell you so.
Prompts that work
You do not need to name tools. The agent picks them. These prompts map cleanly to the data above.
Weekly revenue by campaign
"Show revenue, ROAS and true CPA for every ad campaign last week. Sort by revenue. Flag any campaign where ROAS is below 1."
Cut or scale
"For October, list campaigns with spend but zero revenue conversions, and campaigns with the lowest true CPA. Recommend which to cut and which to scale, and show the numbers behind each call. Do not change anything."
Platform conversions versus payments
"Compare ad_conversions with revenue_conversions per campaign for the last 30 days. Which campaigns does the ad platform overcount the most?"
Landing page by ad
"For each campaign, which landing page gets most of its sessions? Which campaigns send people to a page that is not their top_landing_page?"
UTM hygiene check
"List everything in unmatched_ad_campaigns for this month with its spend. Tell me which ad links need a utm_campaign tag."
Spend reconciliation
"Pull Meta daily insights for last week and compare total spend with the attribution report. Tell me if they differ."
The last prompt uses get_meta_daily_insights, one of the 11 read-only ad account tools. The revenue-attributor skill, served as an MCP prompt, packages the cut-or-scale workflow if you prefer a ready-made starting point.
Limits
Be clear about what this report does and does not do before you move budget on it.
- Two ad platforms. Spend comes from Meta Ads and Google Ads. TikTok, LinkedIn or other paid channels have no spend in the report. If you tag their links, their sessions and revenue appear in
unmatched_utm_campaigns. - Matching is by
utm_campaign. Untagged or mistagged ads do not join. The report shows them as unmatched instead of guessing. - Refunds. The docs do not say attributed revenue is net of refunds. Check refunds in Stripe before you cut a campaign on a thin margin.
- No attribution model setting. The tool does not expose a lookback window or model choice.
avg_hours_to_converttells you how long payment usually takes, which helps you pick a date range that gives late payers time to land. - Currency. Values are in the property's account currency, set when the connector was authorized.
- Read-only. The agent can recommend a budget change. It cannot make one through Humblytics. If you also connect Meta's server, it can, so set its permissions with care.
FAQ
Can Claude tell me which ads drive revenue?
Yes, if it is connected to a tool that joins ad spend to payments. Stripe MCP alone has payments but no ad spend. The Meta Ads and Google Ads MCP servers have spend and platform-reported results but no payments. The Humblytics MCP server joins Meta or Google Ads spend with sessions and Stripe or Foxy revenue per campaign, so Claude can report revenue, ROAS and cost per paying customer for each campaign.
Can Stripe MCP show revenue by ad campaign?
Not on its own. Stripe's MCP server gives an agent read and write access to Stripe API objects such as charges, invoices and subscriptions, plus a preview analytics tool. Stripe does not hold your ad spend or the visit that led to a payment, so the agent has nothing to join a payment to a campaign with unless you pass that data in yourself. Our guide to Stripe revenue attribution covers the ways to link a payment to its visit.
Is the ROAS in the Meta Ads MCP server the same as revenue ROAS?
No. The ROAS the Meta Ads MCP server reports comes from Meta's own conversion tracking. Revenue-based ROAS divides payments matched to the campaign by its spend. The two often differ, which is why it helps to have both in front of the agent.
What do I need connected for revenue attribution over MCP?
In Humblytics you need an ad source (Meta Ads or Google Ads), a revenue source (Stripe or Foxy) and utm_campaign tags on your ad links. Without both sources, get_ads_attribution returns empty revenue instead of a guess.
Can my agent change my ad budgets through Humblytics MCP?
No. The 11 ad account tools in the Humblytics MCP server only read. Across the whole server, 35 of 45 tools read data. The 10 that write cover A/B tests, saved funnels, sites and billing top-ups.
Why does my attribution report show unmatched campaigns?
unmatched_ad_campaigns lists campaigns with spend but no matching utm_campaign in your session data, which usually means the ad link is not tagged. unmatched_utm_campaigns lists tagged sessions and revenue with no matching spend, which is usually email, organic or affiliate traffic.
Related reading
- Stripe revenue attribution: tie every Stripe payment to its traffic source
- Track Meta and Google Ads ROAS on Stripe subscriptions
- Best revenue attribution tools
- Best Meta Ads attribution tools
- Best MCP servers for marketers
- Stripe agent wallets
- Humblytics MCP server
Sources
All read 5 November 2026.
- Humblytics, "Ads Attribution API,"
docs.humblytics.com/ads-attribution-api - Humblytics MCP server,
get_ads_attributionand ads connections tool definitions - Stripe Documentation, "Model Context Protocol (MCP),"
docs.stripe.com/mcp - Meta for Developers, "Ads MCP Server,"
developers.facebook.com/documentation/ads-commerce/ads-ai-connectors/ads-mcp-server/ads-mcp-server-overview(updated 14 July 2026) - Meta for Developers, "Connect AI agents to Meta with MCP,"
developers.facebook.com/documentation/mcp(updated 21 September 2026) - Meta for Developers blog, "Meta's ads MCP server is now available for developers," 16 July 2026
- Google Ads API, "Google Ads MCP server: Developer integration guide,"
developers.google.com/google-ads/api/docs/developer-toolkit/mcp-server(last updated 30 October 2026)