For SaaS and B2B teams
Paid ads for SaaS and B2B: run acquisition on CAC payback
Adrails sets your Meta and Google Ads accounts next to Stripe, PostHog and RevenueCat, so a SaaS or B2B team judges a campaign on the trials, demos and paying customers it brought rather than on clicks. Your server sends those conversions back to the ad platforms through Adrails tracking, and threshold automations act when acquisition cost crosses the line you set.
Reviewed Oct 4, 2026
The SaaS funnel
Where each step is measured, and what Adrails does with it
The ad platforms see the visit and the conversions their pixel or tag caught. The rest of the funnel lives in your product and your billing. This is where Adrails reads each step and what it does with the figure.
| Funnel step | Where the figure comes from | What Adrails does with it |
|---|---|---|
| Visit | The Adrails script on your pages records a page view and keeps the UTM parameters and click ids the visitor arrived with for 90 days. | Credits the visit to the campaign and ad. Everything the script sends stays in Adrails and never reaches an ad platform. |
| Trial or demo | Your server, signed with the server key: a trial_started, lead or signup event with the person's email and the saved click ids. | Records it for attribution and sends it to Meta as StartTrial, Lead or CompleteRegistration, and to Google Ads when that is the event you chose for it. |
| Activation | PostHog: daily counts of your product events and their breakdowns, read every 6 hours. | The agent reads them next to Stripe or RevenueCat figures to answer product questions. Nothing is sent to the ad platforms. |
| Paid | Your server: a purchase or subscription event with value and currency. Stripe payments are read every 15 minutes. | Sends it to Meta as Purchase or Subscribe, and to Google Ads when that is the event you chose, within the value and daily limits. The campaign's Tracking tab matches the customer to the ad. |
| Renewal | Stripe subscriptions, read every 30 minutes, with MRR and ARR. RevenueCat for a subscription app. | The agent reads active subscriptions, trials, MRR, ARR, payments and refunds. The Tracking tab shows monthly revenue and active subscriptions by ad. |
Built from the Adrails tracking, Stripe, PostHog and RevenueCat documentation. Only events your server signs reach Meta and Google Ads, and Google Ads receives the one event chosen in Settings. New Google Ads connections open once Google finishes verifying Adrails.
01
Measure SaaS advertising on trials and paying customers, not clicks
Ads for SaaS end in a billing system, not on a thank-you page. The platforms count clicks and the conversions their pixel or tag saw, while the trial converts two weeks later and the annual plan is paid in Stripe. Adrails records the trial, the sign-up and the purchase from your own server, credits each one to the campaign and ad that brought the visitor, and sends the signed events back to Meta Ads and, once your workspace can connect it, Google Ads.
A campaign's Tracking tab then shows which ads brought real customers and what those customers are worth in Stripe or RevenueCat: matched customers, lifetime spend or monthly revenue, average customer value and active subscriptions, by ad. Meta and Google Ads remain the source of their own conversions and ROAS, and the matching counts only the journeys Adrails can identify.
- Record trial_started, signup, lead and purchase events from your server
- Read customer value by ad from Stripe or RevenueCat in the Tracking tab
- Keep the platform's ROAS and your billing figures side by side, never merged
02
Read CAC payback and LTV to CAC next to the spend that produced them
In David Skok's SaaS Metrics 2.0, the best SaaS businesses hold an LTV to CAC ratio above 3 and recover their CAC in 5 to 7 months, and a payback beyond 12 months leaves profitability anemic. Both figures need the ad spend of a period and the revenue of the customers that spend brought, which usually live in two tools nobody reconciles weekly.
Adrails reads them together. The agent has ad spend by campaign over any period, and from Stripe the active subscriptions, trials, MRR, ARR, collected payments and refunds, with customers by billing cadence; from RevenueCat the same for a subscription app. Ask what a paying customer from a campaign cost last quarter and what those customers pay each month: the answer states its sources and periods, and the arithmetic stops where the data does, with no forecast attached.
Each source stays in its own currency and is never merged into the platform's revenue. When Stripe and Meta disagree on what a campaign earned, you see both figures and decide which one your CAC payback uses.
03
Search intent on Google Ads, demand creation on Meta
SaaS PPC splits into two jobs. Google Ads for SaaS captures people already searching for the category or a competitor: Search campaigns on the terms your trials come from, with Performance Max and Demand Gen for reach. Facebook ads for SaaS create the demand search cannot capture yet: B2B advertising on Meta is a Leads or Sales campaign to a defined audience, with the free trial or the demo as the offer.
The Campaign Manager prepares both from one brief, as an editable hierarchy of campaign, ad sets and ads with the tracking parameters added to the ads. Everything is created paused. On Meta a split test can vary the audience, placements or bidding of an ad set, or the text and creative of an ad; on a Google responsive search ad it varies the headlines and descriptions. Google Ads opens once Google finishes verifying Adrails, so connect Meta for now.
Decide low-volume B2B PPC tests on the step that has volume. A verdict needs at least 10 conversions per variant and 95% confidence, so a test decided on trials or demos settles in days where one decided on paid plans may never settle.
- Google Ads Search for category and competitor intent, B2B Facebook ads for demand creation
- One variable per split test, decided on CPA or conversion rate
- Decide tests on trials or demos, then read the paid step in the Tracking tab
04
Send trials and paid conversions back from your own server
Adrails tracking has two parts. A script on your pages keeps a first-party visitor id for a year and the UTM parameters and click ids, fbclid and gclid among them, for 90 days, and records page views. Your server sends the sales and leads, signed with a server key that never goes in a page: only these signed events can reach Meta and Google Ads, because a forged sale would teach a platform's bidding to buy more of nothing.
For Meta, each signed event goes to the dataset you chose right after it is recorded, with its event_id so Meta counts it once with your pixel, and the customer's email hashed with SHA-256. For Google Ads, signed events carrying a gclid go in hourly batches once they are 6 hours old, to the conversion action you chose for Purchase, Lead, Sign-up, Subscription or Trial started; when you set Google up later, the signed conversions of the last 7 days are sent too.
Two limits protect the platforms from a leaked key or a broken integration: a largest value per event, 100,000 by default, and 5,000 events per day per platform. Events past them are still recorded in Adrails and held back from the platforms. Settings shows what was sent, what waits and what was refused over the last 30 days.
- Use your Stripe customer or invoice id as event_id so a sale is never counted twice
- Store gclid, fbc and fbp with the account at sign-up to send the paid conversion later
- Pick the Google Ads event that matches the step you want its bidding to learn from
05
Automate on acquisition cost: alerts, pauses and a weekly review
An ad threshold automation watches a campaign, ad set or ad metric over today, the last 7 days or the last 30 days, checks it every hour and fires at most once a day for each item that crosses the line. The CPA alert template posts to Slack or Discord; Stop-loss and Spend without results pause what spends without a result, either at once after Adrails checks on the platform that nothing changed, or after waiting in Priorities on Home for 24 hours for an administrator to apply it.
Free trial ads need the same guardrail on cost per trial, since a trial that never activates costs the same as one that converts. A weekly review automation reads the accounts, asks an agent about the rows and emails the result with the top and worst ads. Every pause is logged with the figures that led to it, and a budget change an agent proposes is capped at 30% per change.
- Up to 5 threshold automations switched on at once, 25 automations per workspace
- Pause automatically, or hold each pause in Priorities for 24 hours
- Weekly review to Slack, Discord or email, with an agent's read of what changed
Go further
Read more
- Set up trackingThe script, the server key and the events Adrails records on your site.
- Send conversions to Meta and Google AdsWhat is sent, when, and the two limits that protect the platforms.
- Stripe integrationCustomers, payments and subscriptions next to your ad spend, through a read-only key.
- Target CPA, explainedHow to set the acquisition cost your bidding should hold.
FAQ
Common questions
Does Adrails compute CAC payback and the LTV:CAC ratio?
The agent reads ad spend by campaign and period next to Stripe or RevenueCat subscriptions, MRR, payments and refunds, and computes acquisition unit economics from those inputs with the sources and periods stated. It returns the arithmetic and its limits, not a forecast.
Can I send free trial sign-ups to Meta and Google Ads as conversions?
Yes, from your server with the server key: a trial_started event reaches Meta as StartTrial, and Google Ads as the Trial started conversion action when that is the event you chose. Events sent by the script on your pages stay in Adrails.
Does Google Ads for SaaS work in Adrails today?
New Google Ads connections open once Google finishes verifying Adrails, so connect Meta for now. Once your workspace can connect it, Search, Performance Max, Display, Demand Gen and Shopping campaigns, ad tests and conversion sending follow.
What about B2B deals that close months after the click?
Store the gclid, fbc and fbp with the account when the trial or demo is booked, then send the purchase event from your server when the deal closes, with the same email and the visitor id of that visit. Adrails records it, sends it to the platforms with those ids, and the Tracking tab matches the customer to the ad.
Do I need Shopify to use the Tracking tab?
No. The Tracking tab needs Shopify, Stripe or RevenueCat connected, and visits that carry the campaign and ad ids. For a SaaS, Stripe with a read-only restricted key is enough; for a subscription app, RevenueCat.
Next