How migrated subscribers are matched to the right account and access record.
Identity continuity connects the web billing action to the right app subscriber.Without identity continuity, a subscriber can pay on web but still be unknown to the app.
Some subscribers use Apple private relay or Google-based identity. These are not automatically blockers, but the migration needs to confirm reachability and account matching before scale.Apple private relay requires the customer’s outbound email source to be registered and authenticated for Sign in with Apple communication. Google identity is different: if the app has consented access to the user’s email, that email can be part of the identity path, but Google Play Billing is not a reliable contact source by itself.
The subscriber opens a branded migration path, completes web billing, and returns to the app already recognized as paid.Support should also be able to trace the subscriber’s path if something goes wrong.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Recurr","description":"Customer-facing documentation for Recurr: the Nostos migration program, the Oikos growth platform, Kairos decisioning, and the customer-owned payment rail model for mobile subscription apps.","colors":{"primary":"#18D6C0","light":"#18D6C0","dark":"#0A0F1F"},"logo":{"light":"https://mintcdn.com/recurr/Wxd642WVdUa3xINo/logo/recurr-lockup.svg?fit=max\u0026auto=format\u0026n=Wxd642WVdUa3xINo\u0026q=85\u0026s=0f7958b9413908c7361335fb29eb11e9","dark":"https://mintcdn.com/recurr/Wxd642WVdUa3xINo/logo/recurr-lockup.svg?fit=max\u0026auto=format\u0026n=Wxd642WVdUa3xINo\u0026q=85\u0026s=0f7958b9413908c7361335fb29eb11e9"},"favicon":"https://mintcdn.com/recurr/oLSxWXBxZqTIa8SB/favicon.png?fit=max\u0026auto=format\u0026n=oLSxWXBxZqTIa8SB\u0026q=85\u0026s=baabda13adfc44582b5290bff85e083f","navbar":{"links":[{"href":"https://recurr.dev","label":"Website"},{"href":"https://recurr.dev/pricing","label":"Pricing"},{"href":"https://recurr.dev/audit","label":"Run the audit"}]},"footer":{"socials":{"linkedin":"https://www.linkedin.com/company/recurr-dev","x":"https://x.com/recurr_dev"},"links":[{"header":"Products","items":[{"label":"Nostos","href":"https://recurr.dev/nostos"},{"label":"Oikos","href":"https://recurr.dev/oikos"},{"label":"Kairos","href":"https://recurr.dev/kairos"},{"label":"Pricing","href":"https://recurr.dev/pricing"}]},{"header":"Resources","items":[{"label":"Playbook","href":"https://recurr.dev/playbook"},{"label":"Blog","href":"https://recurr.dev/blog"},{"label":"Security","href":"https://recurr.dev/security"},{"label":"Contact","href":"https://recurr.dev/contact"}]},{"header":"Company","items":[{"label":"About","href":"https://recurr.dev/about"},{"label":"Careers","href":"https://recurr.dev/careers"},{"label":"Status","href":"https://status.recurr.dev"}]}]},"integrations":{"posthog":{"apiKey":"phc_Te5OSrSG2rQAMQl0UFkAW6o9iWQcxx5LlWjXf8vBdoT","apiHost":"https://us.i.posthog.com"}},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"recurr","hasAudioNarration":false,"actualSubdomain":"recurr","customDomains":["recurr.dev"],"gitSource":{"type":"github","owner":"untropy1","repo":"recurr-mono","deployBranch":"main","contentDirectory":"docs-public","isPrivate":true,"mountPath":"","label":""},"feedback":{"agentFeedback":false},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6ae956d534ab80277e3c7d54:success","clientVersion":"0.0.4102","searchFilterCounts":[{"language":"default","tag":"Documentation","count":66},{"language":"default","tag":"Start here","count":9},{"language":"default","tag":"Oikos growth platform","count":8},{"language":"default","tag":"For your team","count":8},{"language":"default","tag":"Nostos migration program","count":8},{"language":"default","tag":"Integration","count":8},{"language":"default","tag":"Trust and security","count":7},{"language":"default","tag":"API Reference","count":6},{"language":"default","tag":"Event and export contracts","count":6},{"language":"default","tag":"Payment rail","count":6}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"/docs","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"integration/identity-continuity","slug":"/integration/identity-continuity","pageMetadata":{"title":"Identity continuity","description":"How migrated subscribers are matched to the right account and access record.","href":"/integration/identity-continuity"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"How migrated subscribers are matched to the right account and access record.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={li:`li`,p:`p`,ul:`ul`,..._provideComponents(),...props.components},{Heading}=_components;if(!Heading)_missingMdxReference(`Heading`,true);return _jsxs(_Fragment,{children:[_jsx(_components.p,{children:`Identity continuity connects the web billing action to the right app subscriber.`}),`\n`,_jsx(_components.p,{children:`Without identity continuity, a subscriber can pay on web but still be unknown to the app.`}),`\n`,_jsx(Heading,{level:`2`,id:`identity-inputs`,children:`Identity inputs`}),`\n`,_jsx(_components.p,{children:`Recurr may use:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Email address`}),`\n`,_jsx(_components.li,{children:`Account identifier`}),`\n`,_jsx(_components.li,{children:`RevenueCat or Adapty app user ID`}),`\n`,_jsx(_components.li,{children:`Stripe or Paddle customer ID`}),`\n`,_jsx(_components.li,{children:`Magic link or signed token`}),`\n`,_jsx(_components.li,{children:`OAuth identity where appropriate`}),`\n`,_jsx(_components.li,{children:`Custom backend identifier`}),`\n`]}),`\n`,_jsx(_components.p,{children:`The exact path is scoped during technical readiness.`}),`\n`,_jsx(Heading,{level:`2`,id:`apple-private-relay-and-google-identities`,children:`Apple private relay and Google identities`}),`\n`,_jsx(_components.p,{children:`Some subscribers use Apple private relay or Google-based identity. These are not automatically blockers, but the migration needs to confirm reachability and account matching before scale.`}),`\n`,_jsx(_components.p,{children:`Apple private relay requires the customer’s outbound email source to be registered and authenticated for Sign in with Apple communication. Google identity is different: if the app has consented access to the user’s email, that email can be part of the identity path, but Google Play Billing is not a reliable contact source by itself.`}),`\n`,_jsx(Heading,{level:`2`,id:`what-good-looks-like`,children:`What good looks like`}),`\n`,_jsx(_components.p,{children:`The subscriber opens a branded migration path, completes web billing, and returns to the app already recognized as paid.`}),`\n`,_jsx(_components.p,{children:`Support should also be able to trace the subscriber’s path if something goes wrong.`})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Identity continuity","description":"How migrated subscribers are matched to the right account and access record.","href":"/integration/identity-continuity"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Identity inputs","slug":"identity-inputs","depth":2,"children":[]},{"title":"Apple private relay and Google identities","slug":"apple-private-relay-and-google-identities","depth":2,"children":[]},{"title":"What good looks like","slug":"what-good-looks-like","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"recurr","siteName":"Recurr","title":"Identity continuity - Recurr","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-07-28T23:06:41.998Z","originalFileLocation":"integration/identity-continuity.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"How migrated subscribers are matched to the right account and access record.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Recurr\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/docs/mintlify-assets/_mintlify/favicons/recurr/MQUmzlx3oYvVt-NP/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/docs/mintlify-assets/_mintlify/favicons/recurr/MQUmzlx3oYvVt-NP/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/docs/mintlify-assets/_mintlify/favicons/recurr/MQUmzlx3oYvVt-NP/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/docs/mintlify-assets/_mintlify/favicons/recurr/MQUmzlx3oYvVt-NP/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/docs/mintlify-assets/_mintlify/favicons/recurr/MQUmzlx3oYvVt-NP/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/docs/mintlify-assets/_mintlify/favicons/recurr/MQUmzlx3oYvVt-NP/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/docs/mintlify-assets/_mintlify/favicons/recurr/MQUmzlx3oYvVt-NP/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/docs/mintlify-assets/_mintlify/favicons/recurr/MQUmzlx3oYvVt-NP/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/docs/mintlify-assets/_mintlify/favicons/recurr/MQUmzlx3oYvVt-NP/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Identity continuity - Recurr\">\u003cmeta data-mint-head property=\"og:description\" content=\"How migrated subscribers are matched to the right account and access record.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Recurr\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://recurr.dev/docs/integration/identity-continuity\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://recurr.mintlify.site/docs/_mintlify/api/og/v2?division=Integration\u0026amp;title=Identity+continuity\u0026amp;description=How+migrated+subscribers+are+matched+to+the+right+account+and+access+record.\u0026amp;theme=717ebe5be97253a47c46a2a8\u0026amp;signature=664913ef3a84792f4516ee34ec8013ac68c6ea68ee41b3662f96f7ff569a7a31\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Identity continuity - Recurr\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"How migrated subscribers are matched to the right account and access record.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://recurr.mintlify.site/docs/_mintlify/api/og/v2?division=Integration\u0026amp;title=Identity+continuity\u0026amp;description=How+migrated+subscribers+are+matched+to+the+right+account+and+access+record.\u0026amp;theme=717ebe5be97253a47c46a2a8\u0026amp;signature=664913ef3a84792f4516ee34ec8013ac68c6ea68ee41b3662f96f7ff569a7a31\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/docs/mintlify-assets/_mintlify/favicons/recurr/MQUmzlx3oYvVt-NP/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Recurr\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#18D6C0\">\u003clink data-mint-head rel=\"canonical\" href=\"https://recurr.dev/docs/integration/identity-continuity\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/docs/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/docs/integration/identity-continuity.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://recurr.dev/#organization\",\"name\":\"Recurr\",\"url\":\"https://recurr.dev\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/recurr/Wxd642WVdUa3xINo/logo/recurr-lockup.svg?fit=max\u0026auto=format\u0026n=Wxd642WVdUa3xINo\u0026q=85\u0026s=0f7958b9413908c7361335fb29eb11e9\"}},{\"@type\":\"WebSite\",\"@id\":\"https://recurr.dev/docs#website\",\"name\":\"Recurr\",\"url\":\"https://recurr.dev/docs\",\"publisher\":{\"@id\":\"https://recurr.dev/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://recurr.dev/docs/integration/identity-continuity#webpage\",\"url\":\"https://recurr.dev/docs/integration/identity-continuity\",\"name\":\"Identity continuity\",\"description\":\"How migrated subscribers are matched to the right account and access record.\",\"dateModified\":\"2026-07-28T23:06:41.998Z\",\"isPartOf\":{\"@id\":\"https://recurr.dev/docs#website\"},\"breadcrumb\":{\"@id\":\"https://recurr.dev/docs/integration/identity-continuity#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://recurr.dev/docs/integration/identity-continuity#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Integration\",\"item\":\"https://recurr.dev/docs/integration/no-sdk\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Identity continuity\",\"item\":\"https://recurr.dev/docs/integration/identity-continuity\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://recurr.dev/docs/integration/identity-continuity#article\",\"headline\":\"Identity continuity\",\"name\":\"Identity continuity\",\"description\":\"How migrated subscribers are matched to the right account and access record.\",\"url\":\"https://recurr.dev/docs/integration/identity-continuity\",\"mainEntityOfPage\":{\"@id\":\"https://recurr.dev/docs/integration/identity-continuity#webpage\"},\"dateModified\":\"2026-07-28T23:06:41.998Z\",\"publisher\":{\"@id\":\"https://recurr.dev/#organization\"},\"isPartOf\":{\"@id\":\"https://recurr.dev/docs#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Recurr\",\"publisher\":{\"@type\":\"Organization\",\"name\":\"Recurr\"},\"provider\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","agentPointerHref":"/docs/integration/identity-continuity.md","siteName":"Recurr","nav":{"global":null,"tabs":[{"tab":"Documentation","groups":[{"group":"Start here","pages":[{"title":"Welcome to Recurr","href":"/introduction"},{"title":"What is store-to-web subscriber migration?","href":"/getting-started/store-to-web-subscriber-migration"},{"title":"Who it's for","href":"/getting-started/who-its-for"},{"title":"How it works","href":"/getting-started/how-it-works"},{"title":"Why Recurr","href":"/getting-started/why-recurr"},{"title":"Kairos decisioning","href":"/getting-started/kairos-decisioning"},{"title":"Model assumptions","href":"/getting-started/model-assumptions"},{"title":"Recurr vs alternatives","href":"/getting-started/comparison"},{"title":"Glossary","href":"/getting-started/glossary"}]},{"group":"Nostos migration program","pages":[{"title":"The Controlled Migration Framework","href":"/framework/controlled-migration-framework"},{"title":"Pilot fee and reservation","href":"/working-with/pilot-reservation"},{"title":"Onboarding and pilot kickoff","href":"/working-with/pilot-onboarding"},{"title":"Program Go-live","href":"/working-with/go-live"},{"title":"Cohort selection","href":"/framework/cohort-selection"},{"title":"Offer strategy","href":"/framework/offer-strategy"},{"title":"Store-billing holdouts and churn monitoring","href":"/framework/matched-store-billing-holdouts"},{"title":"Operational safeguards","href":"/framework/operational-safeguards"}]},{"group":"Oikos growth platform","pages":[{"title":"How Oikos grows the book","href":"/product/how-oikos-grows"},{"title":"Subscriber surfaces","href":"/product/subscribers"},{"title":"Lifecycle motions","href":"/product/lifecycle-motions"},{"title":"Measurement and reporting","href":"/product/measurement"},{"title":"Brand and configuration","href":"/experience/configuration"},{"title":"Subscriber experience performance","href":"/experience/performance"},{"title":"How the gains compound","href":"/opportunity/margin-compounding"},{"title":"Subscriber continuity","href":"/experience/continuity"}]},{"group":"Payment rail","pages":[{"title":"What changes when you bill on web","href":"/getting-started/being-merchant-of-record"},{"title":"If you already have web billing","href":"/getting-started/consolidating-web-billing"},{"title":"Customer-owned payment rail","href":"/integration/payment-rail"},{"title":"Billing, tax, refunds, and disputes","href":"/working-with/billing-and-tax"},{"title":"Tax on web billing","href":"/working-with/tax-and-jurisdictions"},{"title":"Exit and portability","href":"/working-with/exit-and-portability"}]},{"group":"Economics","pages":[{"title":"App-store fees, in plain terms","href":"/opportunity/app-store-fees"},{"title":"Where recovery comes from","href":"/opportunity/where-recovery-comes-from"},{"title":"The cash-flow release","href":"/opportunity/cash-flow-release"}]},{"group":"Working with Recurr","pages":[{"title":"Pricing model","href":"/working-with/pricing-model"},{"title":"Your Migration Hub","href":"/working-with/migration-hub"},{"title":"Migration Dashboard","href":"/working-with/migration-dashboard"},{"title":"Founder-led delivery","href":"/working-with/founder-led-delivery"},{"title":"Design Partner Program","href":"/working-with/design-partner-program"}]},{"group":"Integration","pages":[{"title":"Integration overview","href":"/integration/no-sdk"},{"title":"Analytics and subscriber signals","href":"/integration/analytics-signals"},{"title":"End-to-end migration flow","href":"/integration/migration-flow"},{"title":"Access continuity","href":"/integration/entitlements-sync"},{"title":"Branded checkout","description":"Why migration checkout should feel like the customer's product, not a third-party detour.","href":"/integration/branded-checkout"},{"title":"Identity continuity","href":"/integration/identity-continuity"},{"title":"Anonymous and hard-to-reach subscribers","description":"How Recurr thinks about subscribers without clean email reachability or account identity.","href":"/integration/anonymous-subscribers"},{"title":"Technical readiness","href":"/working-with/technical-readiness"}]},{"group":"Store-policy compliance","pages":[{"title":"Apple policy posture","href":"/compliance/apple"},{"title":"Google Play policy posture","href":"/compliance/google-play"},{"title":"EU Digital Markets Act","href":"/compliance/eu-dma"}]},{"group":"For your team","pages":[{"title":"For founders and CEOs","href":"/for-your-role/founders"},{"title":"For finance","href":"/for-your-role/finance"},{"title":"For engineering","href":"/for-your-role/tech"},{"title":"For growth","href":"/for-your-role/growth"},{"title":"For product","href":"/for-your-role/product"},{"title":"For customer support","href":"/for-your-role/customer-support"},{"title":"For data and analytics","href":"/for-your-role/data-lead"},{"title":"For legal and procurement","href":"/for-your-role/legal"}]},{"group":"Trust and security","pages":[{"title":"Reliability","href":"/trust/reliability"},{"title":"Risk register","href":"/trust/risk-register"},{"title":"Infrastructure","href":"/trust/infrastructure"},{"title":"Data handling","href":"/trust/data-handling"},{"title":"Data Processing Addendum","href":"/trust/data-processing-addendum"},{"title":"Compliance posture","href":"/trust/compliance-posture"},{"title":"Portability and reversibility","href":"/trust/portability-and-reversibility"}]},{"group":"FAQs","pages":[{"title":"FAQs","href":"/faqs"}]}]},{"tab":"API Reference","pages":[{"title":"API Reference","href":"/api-reference/overview"}]}]},"basePath":"","title":"Identity continuity - Recurr","buildId":"dpl_2AK98Hxhwu4fUXpx9atbv41cC328","deploymentId":"dpl_2AK98Hxhwu4fUXpx9atbv41cC328","dynamics":[],"chunks":[]}