Ad measurement
How Voidhash credits signups, payers and revenue to the ads and links that brought people in.
Voidhash measures what the people an ad or tracked link brought in went on to do: visits, signups, installs, trials, payments and revenue. It measures from your own data, so you can compare it with what your ad platform claims. Web-only, app-only and web-to-app journeys work the same way.
Meta is the only ad platform you can connect today, for spend and campaign data. Google Ads, TikTok, Apple Ads, Snapchat and Reddit appear in Settings → Ad platforms as coming soon. Crediting people to campaigns works for every network, connected or not.
What you need
- Your developers have added the Voidhash SDK to your website and apps, and sign people in with the same user ID everywhere. That ID links a person's web visit, app install and purchases. See Page views and attribution (developer docs) for their setup.
- Campaign parameters on your ad links, such as Meta's URL parameters, so each visit carries its campaign, ad set and ad.
Where people come from
A touch is a moment Voidhash learns where a person came from. Touches come from:
- Web links with UTM parameters (labels on a link that name its source and campaign) or ad click IDs (codes an ad network adds when someone clicks) from Meta, Google, TikTok, Microsoft, X, LinkedIn, Snapchat, Reddit or Pinterest.
- iOS installs from Apple Ads, and campaign links that open the app.
- Android installs from Google Play campaigns and Meta ads.
- Web to app: a person who visited your website and then signs in to your app.
A touch from an ad carries its network; anything else counts as organic.
How credit works
A signup is the first time a person signs in with your user ID, anywhere. Someone who buys or starts a trial before creating an account counts as a signup from that moment.
Each signup is credited to one touch: the person's last ad touch within the attribution window before signing up, otherwise their last other touch in that window. With no touch in the window, the signup is unattributed. Everything the person pays later, renewals included, belongs to that touch, wherever they pay. A person who clicks an ad on the web and subscribes in your iOS app counts toward that ad.
The last ad touch in the window wins, even over a later organic visit. With no ad touch, the last other touch in the window gets the credit; with no touch at all, the signup is unattributed.
| Term | Meaning |
|---|---|
| Attribution window | How many days before a signup a touch still gets credit: 1, 7, 14, 30, 60 or 90, 7 by default. A change applies to past days too. |
| Key conversion | The step your ads are judged by: Signup, Trial (when your project has trials) or Payer (the default). |
| Surface | Where something happened: web, iOS or Android. Stripe and other web payments count as web, the App Store as iOS, Google Play as Android. |
| Visit | A web session that started from a link with campaign parameters. |
| Payer | A person who made a paid charge. A free trial isn't one. |
| Returning people | People an ad reached after they'd already signed up, such as customers you retarget. An ad never gets credit for an earlier signup. |
| Returning revenue | What returning people bought within the window after the ad, minus refunds, not counting renewals. Reported apart, so no sale counts twice. |
Set the attribution window and key conversion on Ads → Overview. Changing them needs an admin or the owner. Analytics → Acquisition reports people, funnels and revenue by network, campaign, ad set, ad or surface.
Projected revenue
Subscription revenue keeps arriving for months, so cohort reports also project what each group will have earned by a given day. The projection learns from your own history: how often subscribers of each plan renew, how often trials convert, and how often people pay for the first time at each age. Each projection has a range that the real revenue falls inside 8 times out of 10. When some plans have too little history to project, the report says that a few projections are likely low.
Ask how people heard about you
A podcast, a friend or a billboard leaves no click. To learn where unattributed people came from,
ask them at signup, for example in an onboarding flow with
buttons whose Set user attribute action saves the answer as $acquisition_source. Developers
can save it from the app too.
Two reports show the answers, under different rules so that free text can't identify anyone:
- What people say brought them on Ads → Overview lists the 20 most common answers of the period's unattributed people: those no touch, ad or other, gets credit for. It leaves out answers fewer than 2 people gave.
- How people say they found you on Analytics → Acquisition counts everyone who has answered, attributed or not, and groups answers fewer than 5 people gave as Other.
Check lift with a regional pause
Attribution says which ad gets credit for a sale, not whether the sale needed the ad. To test that, pause ads in some regions and see whether revenue there falls:
- Pick regions that normally behave alike. Ads → Campaigns with the Country breakdown shows spend by country for the last 28 days.
- Exclude some of them from your campaigns at Meta for a few weeks, longer than your usual time from click to purchase.
- Compare each group's total revenue before and during the pause, not attributed revenue. If paused regions fall by less than the saved spend would have earned, ads were getting credit for sales that would have happened anyway.
VoidQL can total revenue by country from the transactions table. A
promotion or seasonal change in one region can look like lift.
Things to know
- Revenue counts production purchases, minus refunds.
- Recent cohorts look smaller because their people had less time to pay. Compare cohorts at the same age, such as day 7.
- A person who used your app before signing in is dated from their first sign-in.
If something's off
- Most revenue is unattributed: your ad links lack campaign parameters, or people sign in with different IDs on web and in the app. See What you need.
- Numbers differ from Meta: expected; see Reported, measured and estimated.
Next steps
Still stuck? Check Troubleshooting, ask us on Discord, or email support@voidhash.com on a paid plan.
Something wrong or missing on this page? Tell us by email or on Discord.