Tools

What you'll build

A ledger of real orders.

Every paid order lands in one sheet. It comes from your store or your payment processor. The ad platform never writes to it.

Meta's purchase count sits in its own column next to it. Two numbers, side by side, every week.

Then an agent reads the ad account against the ledger and proposes the next change. Pause this ad. Move budget to that one.

Nothing goes live on Meta until you confirm it.

The story

A founder posted in r/SideProject about the problem that started their product:

Meta reported 41 purchases, the store reported 24, and every week somebody had to decide which number the business would act on. Nobody could.

That's 17 purchases Meta counted that the store never saw.

So they built around the ledger. Here's how orders get in:

A tracker script measures visits on the sites you register, and orders come in from your store's confirmation code, a signed server event from your payment backend, or a Shopify order payment webhook.

Some orders get more trust than others:

Shopify and server-signed orders get marked verified, browser-reported ones get marked unverified.

And Meta's number stays in its own column:

Meta's own reported conversions sit next to that ledger as a separate measurement rather than being merged into it.

The agent reads the account and proposes the next change. It publishes to Meta after they confirm it.

The product is called AdRiseLab, and it's Meta only. They said the attribution side ate most of the build time.

You can steal the pattern without buying their product.

Why the two numbers disagree

Meta counts a purchase its own way.

By default, it credits an ad if someone clicked it in the past week or saw it in the past day. Someone who scrolled past your ad and bought three days later from a Google search can land in Meta's count.

Some of Meta's number is also modeled. That's an estimate of sales Meta thinks happened but couldn't track.

Your store counts money that arrived.

Your store's number is the money in the bank.

The trouble starts when the agency report and the next budget change both run off Meta's count. At 41 versus 24, every decision sits on a number about 70% too high.

The business angle

Most small shops paying an agency get one number in the monthly report: Meta's.

The agency is passing along what the platform hands them.

This setup puts your own number next to it, every week. The argument about which one is right goes away. You can see both, and you know where each came from.

And the agent only proposes changes against the real orders. Scaling a campaign because Meta says it's working is the expensive mistake. This catches it before the money moves.

How to run it

Step 1: feed real orders into the ledger. Turn on the order-paid webhook in Shopify, or the payment webhook in Stripe. Each paid order becomes a row with its order number and amount, stamped with the time.

Step 2: mark how sure you are. Orders from Shopify or a signed Stripe event get marked verified. Anything reported from the customer's browser gets marked unverified. Keep both, and count them separately.

Step 3: pull Meta's count. Once a week the agent reads purchases and spend from Meta Ads Manager for the same dates. That goes in its own column. It never gets added to the ledger.

Step 4: show the gap. A weekly note: "Meta: 41 purchases. Store: 24 verified orders. Gap: 17." Same dates, same currency.

Step 5: propose first. The agent reads the ad account against the verified orders and suggests one or two changes. You get them in Telegram or Slack, and you say yes or no.

Step 6: only then publish. On a yes, the agent pushes the change to Meta. On a no, it logs why.

Who should steal this idea

Shopify stores spending real money on Meta ads.

Anyone whose agency report and bank deposits never seem to match.

Local service businesses running lead ads. Swap "orders" for booked jobs from your CRM and the same ledger works.

How hard is it

Intermediate.

The webhooks are the only technical part. Shopify and Stripe both have them built in, and an agent can walk you through turning them on.

Connecting to the Meta ad account takes an afternoon of permissions and API access.

Cost: the Claude subscription you already have. If you'd rather buy it, the source product starts at $39 a month.

Gotchas and tips

Match the dates. Meta credits a sale to the day someone saw or clicked the ad. Your store records the day of the order. Compare full weeks and the edges mostly wash out.

The gap won't be zero. Some of Meta's extra purchases are real sales it credited to itself. Some came from other channels. Track the size of the gap over time. A growing gap is the signal.

Decide on the verified count. A browser-reported order can be blocked, duplicated or faked. A signed payment event can't be.

Keep the agent on a leash: proposals only. The confirm step is what keeps a bad week of data from turning into a bad week of spending.

Refunds count. A refunded order should come off the ledger. Stripe and Shopify both send refund events, so wire those in too.

Ask your agency this week which number they're reporting to you.

Meta's number is what Meta believes. Your number is what got paid.

Keep reading