---
name: real-roas-check
description: Compare the ROAS Meta reports with the money that actually reached your payment gateway (Razorpay, Stripe, Shopify, PayPal). Splits revenue by campaign using UTMs, finds the gap, and tells you which campaigns really make money. Use when the user asks "is this ad actually profitable", "real ROAS", "Meta says X but I made Y", or before scaling any campaign.
---

# Real ROAS check

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

   | Campaign | Spend | Meta revenue | Meta ROAS | Real revenue | Real ROAS | Gap |
   | --- | --- | --- | --- | --- | --- | --- |

   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.

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