Appearance
Integration Overview
The web funnel sells the subscription. Your app connects that purchase to an authenticated account through verified email, while an optional iOS Universal Link preserves deterministic click attribution.
The Flow
text
Visitor completes the web funnel and checkout
-> opens a FunnelsGrove Universal Link
-> installed app records the open and receives clickId + destination
-> user signs in and verifies email ownership
-> customer backend binds clickId with verifiedEmail
-> backend verifies subscription with that same email
-> active user is returned with stable user.user_id
-> backend tracks the login and saves user.user_id on the account
-> later app opens verify access again with the saved IDWith the app installed, iOS delivers the Universal Link directly to the app, which records the open through the public app-open endpoint. Without the app installed, the HTTP request reaches the resolver, which records the click and returns a direct 302 to the configured App Store URL.
The app link is optional for access. A direct install can still resolve an active subscription after verified login, but it remains unattributed when no deterministic click handoff exists.
The Trust Rule
Verify email ownership before looking up a subscription by email. A typed, prefilled, or link-provided value is not proof of ownership.
The link and returned clickId are attribution signals only. They never contain user identity, prove ownership, or grant paid access. The authenticated customer backend performs exact click binding and identity calls; neither the project SDK secret nor an attribution admin credential belongs in the app or browser.
Identity And Access
- Call
POST /sdk/public/users/verify_subscriptionwith the verified email. It returnsactive, thetestmode flag, and, when a user matches,user.user_idwithout changing state. - If access is active, call
POST /sdk/public/users/track_loginwith thatuser_id. - Save the exact returned ID on the authenticated app account.
- On later app opens, verify access again with the saved ID.
Verification is read-only. Login tracking records App Login only after ownership and active access have been proven.
Responsibilities
| Area | Responsibility |
|---|---|
| Web funnel | Capture email, show the paywall, and complete checkout. |
| Billing system | Create and track the subscription. |
| Link resolver | Handle uninstalled-device HTTP requests, record the click, and redirect to the configured store. |
| App | Receive the Universal Link, record the app open, persist clickId, and route the returned destination. |
| Customer backend | Verify login email, bind clickId, verify access, track login, and save the stable FunnelsGrove user ID. |
| FunnelsGrove SDK API | Resolve project-scoped subscription state and record App Login. |
| App backend webhook receiver | Optionally receive signed funnel user, payment, and subscription updates. |
FAQ
How is the link attributed?
The app records the link open and receives a clickId. The customer backend binds that exact click only after it verifies the signed-in user's email.
What if the user installs the app without clicking the link?
Use the account's verified email after login. If it matches an active funnel user, track the login with the returned user.user_id; the install remains unattributed.
What if the user paid but has not logged in to the app?
Wait until the user signs in and proves email ownership. Do not infer identity from the URL, device, IP address, or User-Agent.
Which platforms fit this flow?
Version 1 provides native iOS Universal Links. Android App Links, install referrer, deferred attribution, fingerprinting, and probabilistic attribution are outside this version.