Installs, cost and revenue by media source and campaign.
Your subscription revenue lives in AppsFlyer. What you paid to get those subscribers does not. Ask about both in the same sentence.
https://mcp.heymetra.com/mcp
Which media sources drove the most installs last month?
What did each campaign cost per install last month?
Which campaigns returned more revenue than they cost?
How did installs and cost move day by day this month?
No dashboard, no export, no query language. You ask in the assistant you already use and the answer comes back with the account it came from.
1. Open the Security centre in AppsFlyer
Sign in to AppsFlyer, open the account menu at the top right and choose Security centre, then Manage your AppsFlyer API tokens. You need an account admin to see this screen.
It is an account-level screen, not a per-app one. One token covers every app in the account; which app HeyMetra reads is decided by the app ID in the next step, not by the token.
2. Create a token of type API
The screen offers more than one kind. Choose API. Copy the value in full: it runs past seven hundred characters, so select all of it rather than what fits in the box.
AppsFlyer revoked every token issued before 10 March 2026. An older one that has been sitting in a password manager will fail, and the failure looks like a permission problem rather than an expiry.
3. Find the app ID
On Android it is the package name, exactly as the Play Store shows it, such as com.example.app. On iOS it is the letters id followed by the App Store number, such as id123456789.
One connection is one app. AppsFlyer publishes no way to ask a token which apps it may report on, so a second app is a second connection.
4. Paste both in HeyMetra and save
Choose AppsFlyer on the Connections screen, paste the token and the app ID, and save. HeyMetra checks the pair against AppsFlyer immediately, by asking for one finished day, so a token that cannot actually report fails here rather than later in a conversation.
5. Name your reporting currency
Optional, and worth doing. AppsFlyer publishes no currency anywhere in its reports, so without this every amount comes back with no currency stated rather than with the wrong one assumed.
6. Add HeyMetra to the assistant you use
Claude, ChatGPT, Cursor or Codex. HeyMetra gives you the address and the key to paste, and AppsFlyer answers there.
Add HeyMetra once and it is there in every conversation. The address is the same everywhere:
https://mcp.heymetra.com/mcp
npx add-mcp https://mcp.heymetra.com/mcpadd-mcp is a third-party installer that writes the configuration for Claude Code, Codex, Cursor, Antigravity, VS Code and seventeen other agents. It infers the name from the address, so the server lands as heymetra. Run against this endpoint before it was written here.
Claude — Settings → Customize → Connectors → Add custom connector
Paste the address above into Settings → Customize → Connectors → Add custom connector.
On Team and Enterprise plans only an owner can add it, under Organization settings.
Full walkthrough: heymetra.com/mcp/claude/
ChatGPT — Settings → Security and login → Developer mode, then chatgpt.com/plugins
Paste the address above into Settings → Security and login → Developer mode, then chatgpt.com/plugins.
The address has to end in /mcp here.
Full walkthrough: heymetra.com/mcp/chatgpt/
Grok — grok.com/connectors → New Connector → Custom
Paste the address above into grok.com/connectors → New Connector → Custom.
XAI calls this “bring your own MCP”.
Full walkthrough: heymetra.com/mcp/grok/
Perplexity — Settings → Connectors → Custom connector → Remote
Paste the address above into Settings → Connectors → Custom connector → Remote.
Perplexity documents it as a Pro, Max and Enterprise feature.
Full walkthrough: heymetra.com/mcp/perplexity/
Claude Code — claude mcp add --transport http
claude mcp add --transport http heymetra https://mcp.heymetra.com/mcpOr a .mcp.json in the project root; /mcp inside a session shows what connected.
Full walkthrough: heymetra.com/mcp/claude-code/
Codex — ~/.codex/config.toml
[mcp_servers.heymetra]
url = "https://mcp.heymetra.com/mcp"Under an [mcp_servers.] section, then codex mcp login.
Full walkthrough: heymetra.com/mcp/codex/
Cursor — ~/.cursor/mcp.json, or .cursor/mcp.json in a project
{
"mcpServers": {
"heymetra": { "url": "https://mcp.heymetra.com/mcp" }
}
}Leave the static OAuth fields empty; HeyMetra does not need them.
Full walkthrough: heymetra.com/mcp/cursor/
Antigravity — ~/.gemini/config/mcp_config.json, or .agents/mcp_config.json in a project
{
"mcpServers": {
"heymetra": { "serverUrl": "https://mcp.heymetra.com/mcp" }
}
}The key is serverUrl, not url, unlike every other JSON client.
Full walkthrough: heymetra.com/mcp/antigravity/
Propose a change to this account. Nothing is sent until you approve it, and HeyMetra cannot undo it afterwards.
Permissions are switched on per connection, and one you leave off is a tool your assistant never sees.
| Permission | What it covers | Changes anything? |
|---|---|---|
| Full account access | Lets your assistant read anything in this account to answer your questions. The figures are the provider's own, not ones HeyMetra has checked. It can also propose changes: none is applied until you approve it, and HeyMetra cannot undo one afterwards — 31 days a report. A longer question is refused rather than answered with a fortnight's figures.; AppsFlyer allows 120 reports a day for the account and 24 per app, and that allowance is SHARED with the export page in the AppsFlyer dashboard. Reports pulled here are reports you cannot download there that day.; Re-engagement and acquisition count different people. A re-engagement figure is not part of an install figure, and the same person can appear in both.; A cohort follows the people who ARRIVED in a period forwards, so it never adds up to that period's own installs or revenue.; Apple's SKAdNetwork figures for iOS are a second count of the same campaigns, not a part of the first: they cover every device rather than only those that allowed tracking, and adding the two counts an install twice.; A SKAdNetwork postback arrives at least a day after the install and version 4 sends two more later still, so the last few days are always still filling in.; Cost is whatever the media source chose to report, and most report nothing. An absent cost is unknown, not zero, so ROI and cost-per-install are withheld rather than computed from a gap.; AppsFlyer does not state a currency anywhere in its reports. Unless one was entered when connecting, the amounts are in the app account's own currency and nothing here can say which.; Revenue is GROSS: what the buyer paid, before the store's cut and tax. The rates AppsFlyer deducts can be read, but no net figure is computed from them, because that needs the country of each purchase and the reports do not carry one.; The rows carry the people. AppsFlyer's raw columns include device identifiers, the advertising id, the IP address and the device model of an app's users.; Ninety days. AppsFlyer deletes raw data past that and no request reaches it; the aggregate reports go further back.; Twenty-four pulls a day per report type, and that allowance is SHARED with the export page in the AppsFlyer dashboard. Raw data read here is raw data you cannot download there that day.; Real time, so the same question asked twice can return different rows.. | Yes — every change waits for your approval |
What each permission lets an assistant do, in full
- Ask anything about this account and get the answer from its live data. Reads only, and the figures are the provider's own rather than ones HeyMetra has checked.
- Propose a change to this account. Nothing is sent until you approve it, and HeyMetra cannot undo it afterwards.
Anything that would change something comes back as a proposal you approve, inside bounds that live in code rather than in a prompt: ±50% on a budget, 5 campaigns per action and 20 changes a rolling day, and an approval that expires after 30 minutes. How that works.
Saving fails and says the token was rejected, on a token you have used before.
Why: Tokens issued before 10 March 2026 19:00 UTC were revoked by AppsFlyer, and a revoked token is refused the same way a wrong one is.
Fix: Generate a new token of type API in the Security centre.
Saving fails although AppsFlyer clearly knows the app: the app ID is right and the token is new.
Why: Reporting through the Pull API is part of the AppsFlyer plan rather than a setting on the token. An account without it can list its apps and cannot read a single daily figure.
Fix: Ask your AppsFlyer account manager whether Pull API reporting is on your plan. No token change will substitute for it.
Saving fails saying that app ID is not in the account.
Why: The iOS form is the letters id followed by the App Store number, and a bare number or a bundle identifier is a different string.
Fix: Use com.example.app on Android and id123456789 on iOS. The app's own page in AppsFlyer shows the exact value.
An export you started in the AppsFlyer dashboard is refused for the rest of the day.
Why: The report allowance is shared. AppsFlyer permits 120 reports a day per account and 24 per app, counted across the API and the dashboard's own export page together.
Fix: The allowance resets at 00:00 UTC. HeyMetra reuses a recent answer where it can, so exploring through your assistant uses less of it than the same questions asked by hand. It is still one allowance, not two.
The iOS numbers do not match what the ad network reports.
Why: On iOS, AppsFlyer counts devices that allowed tracking and Apple's SKAdNetwork reports every device with the detail removed. They are two counts of the same campaigns and neither contains the other.
Fix: Ask for the SKAdNetwork figures alongside, and read them as a second measurement. Adding the two counts every install that appears in both twice.
One connection is one app. Ask your assistant about installs, cost, revenue, clicks and impressions for a period, grouped by day, media source, campaign, channel, country or app, up to 31 days at a time. Figures AppsFlyer marks as not reported are labelled as such instead of being summed into a total that looks complete. When you connect, you choose whether your assistant may also propose changes: creating an imported audience, adding people to one or removing them, and a request to erase one user's data. Every change it proposes waits for your approval.
About AppsFlyer
AppsFlyer is the mobile attribution and marketing analytics platform that ties installs, in-app events, and revenue back to the media that drove them. It’s the source of truth for mobile ROI and channel performance.
The reason to read AppsFlyer through HeyMetra rather than through a server that only knows AppsFlyer is everything else it can answer in the same breath:
Ads — Google Ads · Meta
Analytics — Google Analytics 4 · Google Search Console · PostHog
Ecommerce — Shopify · Trendyol · WooCommerce
Revenue & CRM — Stripe · HubSpot · Zoho CRM · Zoho SalesIQ · Zoho Marketing Automation
Mobile — AppsFlyer · RevenueCat · Adapty · App Store Connect
Work — Google Calendar · Google Meet · Jira
The full catalogue is at heymetra.com/connectors/.
- AppsFlyer connector page
- HeyMetra — what the product is
- Setup for every assistant
- Security and limits
- Pricing
- HeyMetra's own repository
Built by Zeisoft, who make HeyMetra. Not affiliated with AppsFlyer. This README is generated from HeyMetra's live connector catalogue and refreshed daily; corrections are welcome as issues.