Sep 28, 2026
Written by
Kristian Krogh Bang
Key takeaways
Writeless is an AI writing tool built in Bubble, sold as Stripe subscriptions and advertised only on Meta. Before the rebuild, Meta Events Manager showed 2,256 purchases in three weeks against 708 new subscriptions in Stripe. Ads were being optimized on renewals and duplicates.
Sementa rebuilt the tracking server-side on Stape. Purchases now come from Stripe itself, one event per new subscription, with the browser data from sign-up stitched back on. In the first full week, GA4, Meta, and Stripe agreed on every purchase.
The old setup forwarded every Stripe event to Meta and GA4 as a purchase. Renewals, plan changes, and Stripe's own duplicate at checkout were all counted. From August 1 to 22, Meta received 2,256 purchases. Stripe had 708 new subscriptions and 2,790 renewals in the same period. 1,548 of the purchases Meta optimized on were not sales, and the real cost per purchase was about three times what Ads Manager showed.
GA4 had the same problem from a different angle: 1,406 purchase events plus four browser-side purchase events with no revenue, all against the same 708 subscriptions.

Sign-ups were inflated too. From July to August 23, GA4 recorded 3.8 sign_up events for every user who signed up, so its registration numbers were as unreliable as its purchases.
A third problem sat on the landing page. The A/B testing tool rewrote the address the moment the page loaded and dropped everything after the question mark, before the Meta pixel and Google Tag Manager ran. Meta's click ID (fbclid) and every UTM parameter were gone. Only 4 percent of events carried a click ID.
A server container logs every request it sends to Meta and GA4. Sementa used those logs as the source of truth, not the platform dashboards.
On September 20, the sign-up push in Bubble was moved into the Google login button's workflow. The logs showed registrations to Meta falling from 18.3 to 11.8 per hour, starting the exact hour the change went live: email and password sign-ups had stopped sending. The same logs showed duplicates had dropped from 10.1 to 0.8 percent, which looked like an improvement and hid the loss. The fix went live two days later, sending on both sign-up paths once per account. On October 1 to 2, the logs show 459 registrations to Meta, all accepted, with no duplicates.
The logs also gave field coverage per event (how many carry email, click ID, IP) and how many purchases found their sign-up session in the store, without depending on what Meta chooses to display.
PurchaseNewCustomer fires once per customer, ever. New customers run at half of purchases, so real cost per new customer is about twice the cost per purchase, and a custom metric in Ads Manager now shows it directly.
Verified September 3 to 9, one week after go-live:
Purchase events, Stripe: 357 paid subscription invoices (counted in the ad account's time zone, at the moment of payment).
Verified September 26 to October 2, after sign-up tracking was reworked:
| Measure | Before | After |
|---|---|---|
| Meta purchases per real new subscription | 3.19 | 1.00 (357 of 357) |
| GA4 purchases against Stripe | 1,406 against 708 | 338 of 338, revenue equal to the cent |
| New-customer event for CAC | Did not exist | PurchaseNewCustomer, 179 of 180 |
| Meta click ID on sign-ups | 4 percent | 27 percent |
Event match quality, Purchase | 6.9 | 8.0 |
Event match quality, CompleteRegistration | 6.9 | 7.8 |
Event match quality, PurchaseNewCustomer | Did not exist | 8.1 |
GA4 sign_up events per signed-up user | 3.8 | 1.0 |
| Sign-ups reaching GA4, against new accounts in Bubble | Not measured | 93 percent |
If the dashboard and the bank disagree, believe the bank and find out what the dashboard is counting. A webhook that forwards everything is the most common cause of numbers that look good and are wrong. And check the time zone before concluding anything: the same week of invoices counted 338 in New York time and 357 in Gulf time.
By setting up server-side tracking with Stape, you can:
PurchaseNewCustomer event alongside your standard purchase event to separate first-time buyers from returning ones and read the true CAC in Ads Manager without estimating it from cost per purchase.Want to start on the server side?
Try for freeWas this article helpful?
Sep 28, 2026
Sep 29, 2026
Apr 16, 2026
Case studies
Find out how Stape partner Sementa measures up to 30% more data gain for a Swiss fresh pet food company.
Sep 4, 2026
Comments