Which page on your site led to an app install, a sign-up and a payment

Someone reads your site, taps the App Store, Mac App Store or Google Play button, installs and later pays in the app. Sumly ties that app user to the visit: exactly on Android, as an estimate on iOS and the Mac. Their payments then count for the source they first came from.

Drawn with example numbers.

Three short paths

Pick the one that matches your app. The website part is the same for all three.

  1. 1

    Just the website: keep Sumly's site script on the pages with your store buttons. It adds the visit to each Google Play link and counts every tap on Google Play, App Store and Mac App Store links (mt=12 or macappstore://). Nothing else to change on the site.

  2. 2

    App with the Sumly SDK: on its first launch the SDK sends app_installed by itself. On Android, add react-native-play-install-referrer and pass installReferrer to Sumly.init (Kotlin: the official com.android.installreferrer client). On iOS nothing more: the SDK calls Sumly from the phone.

  3. 3

    App without the SDK: your server sends app_installed once per new user with the secret key: on Android the install referrer the app read, on iOS and the Mac (platform: mac) the device's IP and country from the sign-up request.

Step by step for your platform:

The line you already have. Store links are found by themselves, also ones added later.

<script defer src="https://sumly.dev/s.js" data-site="sl_your_key"></script>\n\n<!-- Your store buttons, as they are. The script adds the visit to the Google Play one and counts taps on both: -->\n<a href="https://play.google.com/store/apps/details?id=com.example.app">Google Play</a>\n<a href="https://apps.apple.com/app/example/id1234567890">App Store</a>

Or let your coding assistant do it

Paste this into Claude Code, Cursor or Codex in your project. It fits the code to how your project is built, asks you for the dashboard steps and leaves the keys to you.

See what it says
Set up Web to app for Sumly in this project.

Sumly (https://sumly.dev) shows revenue next to the visits and app users it came from. The full guide is https://sumly.dev/integrations/web-to-app; read it if anything below is unclear.

Steps:
1. Just the website: keep Sumly's site script on the pages with your store buttons. It adds the visit to each Google Play link and counts every tap on Google Play, App Store and Mac App Store links (`mt=12` or `macappstore://`). Nothing else to change on the site.
2. App with the Sumly SDK: on its first launch the SDK sends `app_installed` by itself. On Android, add `react-native-play-install-referrer` and pass `installReferrer` to `Sumly.init` (Kotlin: the official `com.android.installreferrer` client). On iOS nothing more: the SDK calls Sumly from the phone.
3. App without the SDK: your server sends `app_installed` once per new user with the secret key: on Android the install referrer the app read, on iOS and the Mac (`platform: mac`) the device's IP and country from the sign-up request.

Website: The line you already have. Store links are found by themselves, also ones added later.
```
<script defer src="https://sumly.dev/s.js" data-site="sl_your_key"></script>\n\n<!-- Your store buttons, as they are. The script adds the visit to the Google Play one and counts taps on both: -->\n<a href="https://play.google.com/store/apps/details?id=com.example.app">Google Play</a>\n<a href="https://apps.apple.com/app/example/id1234567890">App Store</a>
```

React Native: One-time app_installed on the first launch. installReferrer is Android only and optional; it needs a development build, not Expo Go.
```
import AsyncStorage from '@react-native-async-storage/async-storage';
import { PlayInstallReferrer } from 'react-native-play-install-referrer';   // Android, optional
import { Sumly } from './sumly';

Sumly.init({
  siteKey: 'sl_your_key',
  storage: AsyncStorage,
  // Android: Google Play's referrer, read once for the first launch's app_installed
  installReferrer: () => new Promise((ok) =>
    PlayInstallReferrer.getInstallReferrerInfo((info, error) => ok(error ? null : info?.installReferrer ?? null))),
});
Sumly.identify(await Purchases.getAppUserID());
```

Kotlin: The same with Google's own install referrer client.
```
// build.gradle: implementation("com.android.installreferrer:installreferrer:2.2")
Sumly.init(this, "sl_your_key", installReferrer = { done ->
    val client = InstallReferrerClient.newBuilder(this).build()
    client.startConnection(object : InstallReferrerStateListener {
        override fun onInstallReferrerSetupFinished(code: Int) {
            done(if (code == InstallReferrerClient.InstallReferrerResponse.OK) client.installReferrer.installReferrer else null)
            client.endConnection()
        }
        override fun onInstallReferrerServiceDisconnected() {}
    })
})
```

Server: Without the SDK, once per new app user, with the user id RevenueCat knows. Neither the referrer nor the IP is kept.
```
POST https://sumly.dev/api/v1/events
Authorization: Bearer sk_sumly_…

{ "events": [
  { "type": "track", "name": "app_installed", "user_id": "tl-48213", "platform": "android",
    "props": { "install_referrer": "utm_source=reddit&utm_medium=referral&sumly_vid=8f1c…" } },
  { "type": "track", "name": "app_installed", "user_id": "tl-48214", "platform": "ios",
    "country": "US", "ip": "203.0.113.7" }
] }
```

So each payment shows which visit it came from: A payment in the app (RevenueCat) by someone who came from your site counts for the source of their first visit, as a web payment does. On Android the link is exact; on iOS it is an estimate, and the page says so.

Keep in mind: Someone who never visited your site cannot be traced to it. On iOS that holds for every install without a tap on your site. Two people tapping on the same network within the hour (an office, a family) tie nothing on iOS: no guess between them. The iOS estimate needs the install within an hour of the tap.

How to work:
- Look at how this project is built first, and fit the code to its framework and its way of doing things; the examples above are a starting point, not something to paste as is.
- Steps that happen in a dashboard (Sumly, or Web to app's own) are mine: tell me exactly what to click, then wait for me.
- Keys the code needs belong in environment variables, never in the code or the repository. Never ask me to paste a secret key into this chat; tell me which variable to set.
- Change only what this needs, show me the changes before you commit, and tell me how to check that it works.
- sl_your_key stands for the project's public key; it is on the Visitors page in Sumly. Ask me for it.

What you see after connecting

Web to app next to every other project and provider, on the same pages.

The Web → app funnel on Visitors, per platform.

Came from on each app user, exact or estimated.

App revenue in Revenue by source.

From visit to install to payment

A payment in the app (RevenueCat) by someone who came from your site counts for the source of their first visit, as a web payment does. On Android the link is exact; on iOS it is an estimate, and the page says so.

How attribution works →

Counts toward your plan

Store taps and app_installed are events: they do not count toward your plan's visits. Plans →

What you don't get

No advertising id, no device fingerprint, nothing shared with another company, so no App Tracking Transparency prompt. Nobody is traced who never visited your site.

The details

What ties an install to a visit
  • Android, exact: Google Play hands your app the referrer of the store link it was installed from. The site script puts the visitor id there (with consent where it is needed) and the utm values.
  • Android without a site visit (an ad, a store link elsewhere, the store itself): the referrer's campaign is kept as a store referrer, a weaker kind.
  • iOS, estimated: an App Store tap on your site and an install from the same network within the hour, when exactly one visitor fits. Sumly keeps only a hash of the IP with a salt that changes daily, for one hour.
  • iOS without consent on the site: the install gets only that visit's source, campaign and landing page, never the rest of the visitor's pages. Global Privacy Control turns it off.
What you see
  • Visitors › Overview: a Web → app funnel per platform, store taps, installs from the web, sign-ups and paid, with exact and estimated apart.
  • People: where each app user came from, marked exact, estimated or store referrer.
  • Revenue by source: what app users paid, counted for the source of their first visit.
Good to know
  • Someone who never visited your site cannot be traced to it. On iOS that holds for every install without a tap on your site.
  • Two people tapping on the same network within the hour (an office, a family) tie nothing on iOS: no guess between them.
  • The iOS estimate needs the install within an hour of the tap.

Web to app questions

Does it work for a Mac app?

Yes, like iOS: a tap on a Mac App Store link (or an App Store link opened on a Mac) and an install from the same network within the hour, sent as app_installed with platform mac (the Swift SDK does it on macOS). The Web → app funnel shows the Mac as its own platform once it has any.

My web app signs people in on app.example.com. Are their visits on example.com joined?

Yes, when both load the site script with the same project key and live under the same domain: the script keeps its cookie on the parent domain (.example.com), so www, the marketing site and app.example.com share one visitor, and sumly.identify after sign-in names it, earlier marketing visits included. To tie that browser to the user your app and RevenueCat know (so their payments count for its source), your server sends app_installed with platform web, the user id and visitor_id, the sumly_vid cookie it read at sign-in: exact. A subdomain counts as the project's own site by itself. A web app on a different domain (example-app.com) needs data-domains on the site line, so the visitor rides along on links between them; a two-part ending such as .co.uk keeps the cookie per host, which data-domains also covers.

Is this Apple's tracking?

No. Tracking in Apple's sense links your app's data with other companies' apps or sites, or shares it with data brokers. Here the site and the app are yours, nothing leaves you and Sumly, and no advertising id or fingerprint is used.

What goes in my privacy policy?

That store buttons carry the visit's source, that installs are tied to visits (exact on Android, estimated on iOS) and that the IP is used only as a short-lived hash. Visitors › App users has a paragraph to adapt.

Does it work in the EU without consent?

Android's referrer carries only campaign values then, never the visitor. On iOS the install gets only the source, campaign and landing page of that visit. Have your counsel confirm the legitimate-interest basis for your case.

What if someone installs on a second phone?

The first install says where they came from. A later one changes nothing, except that an Android one from your site's button adds the visit to a link that had none.

Other integrations

Try it with your own projects

Sign in with Google or a code by e-mail and connect your first project. Free for one project, and 14 days of a paid plan with no card.

Start free

Or look around first: open the live demo.