Real ROAS Check
Meta's ROAS next to the money that reached your payment gateway, campaign by campaign, so you scale on real revenue.
From Sanskar's ad account
For 19 Oct 2026 Meta reported 6.6x ROAS on the course campaign. Razorpay said 3.4x. Over the full week of 13–19 Oct, the real number was 1.6x. The campaign used a pixel shared with another site, so Meta was crediting sales that came from somewhere else. Budgets went up by 20%, not by 2x as Meta's number suggested.
Same thing on Google: a Shorts campaign claimed 3 sales. All 3 buyers had a Facebook click ID and 4 of the week's 5 buyers paid inside the Instagram app. They were Meta sales.
Install
Run this once in your terminal. Claude Code picks the skill up in your next session, in every project.
mkdir -p ~/.claude/skills/real-roas-check && curl -fsSL https://talktoads.com/skills/real-roas-check/SKILL.md -o ~/.claude/skills/real-roas-check/SKILL.mdFor one project only, use .claude/skills/real-roas-check inside the project instead.
Then ask
Compare Meta's ROAS with my Razorpay export for the last 7 days
The skill
What the agent follows, from the SKILL.md you download.
Meta's ROAS is Meta's opinion. Your payment gateway is the truth. This skill puts the two side by side, campaign by campaign, so you scale on real money.
Needs the TalkToAds connector (Meta) and a payments export the user gives you: a CSV from Razorpay, Stripe, Shopify or PayPal for the same dates, ideally with UTM or notes fields.
Steps
-
Pick the window. Use the last 7 full days unless the user says otherwise. Avoid today, it's incomplete.
-
Meta side. Call
get_performancefor the ad account withlevel: "campaign",since/untilset to the window. Keep spend, purchases (results) and purchase value per campaign. -
Money side. Ask for the payments export for the same dates (use the gateway's timezone, usually the account timezone). Keep only captured or paid payments. Drop refunds and failed attempts.
-
Match payments to campaigns. In this order:
utm_campaign/utm_contenton the payment or order, if present- the product: if one campaign sells one product, all payments for that product in the window belong to it, minus organic (ask the user what a normal no-ads day looks like)
- anything left over = "unattributed". Show it, don't guess.
-
Build the table.
Campaign Spend Meta revenue Meta ROAS Real revenue Real ROAS Gap Real ROAS = real revenue ÷ spend. Gap = Meta ROAS ÷ real ROAS.
-
Verdict per campaign.
- Real ROAS ≥ 2x: winner, candidate for scaling (see the scale-the-winners skill)
- 1x–2x: keep, fix creative or price
- below 1x for 3+ days: pause candidate Then give one recommendation and wait for a yes before changing anything.
Why the numbers differ
- Shared pixel. If two websites or products fire the same pixel, Meta credits sales from one to ads for the other.
- View-through credit. Meta counts a sale if someone saw the ad and bought within a day, even if they came from somewhere else.
- Payment methods. UPI and in-app browser payments often lose the pixel event, which makes Meta under-count.
- Other ad platforms claim the same sale. Google Demand Gen and Meta can both take credit for one purchase.