← Measure skills

Real ROAS Check

Meta's ROAS next to the money that reached your payment gateway, campaign by campaign, so you scale on real revenue.

Free skill · Runs on your ad account via TalkToAds · Works in Claude, Claude Code and ChatGPT

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.

Terminalmkdir -p ~/.claude/skills/real-roas-check && curl -fsSL https://talktoads.com/skills/real-roas-check/SKILL.md -o ~/.claude/skills/real-roas-check/SKILL.md

For 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

  1. Pick the window. Use the last 7 full days unless the user says otherwise. Avoid today, it's incomplete.

  2. Meta side. Call get_performance for the ad account with level: "campaign", since/until set to the window. Keep spend, purchases (results) and purchase value per campaign.

  3. 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.

  4. Match payments to campaigns. In this order:

    • utm_campaign / utm_content on 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.
  5. Build the table.

    CampaignSpendMeta revenueMeta ROASReal revenueReal ROASGap

    Real ROAS = real revenue ÷ spend. Gap = Meta ROAS ÷ real ROAS.

  6. 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.