docs(push): mobile push open docs for the pending SDK releases - #20114
Draft
turnipdabeets wants to merge 4 commits into
Draft
docs(push): mobile push open docs for the pending SDK releases#20114turnipdabeets wants to merge 4 commits into
turnipdabeets wants to merge 4 commits into
Conversation
- React Native: iOS taps that cold-launch the app are not captured, and automatic capture needs iOS 14 or newer - React Native: Android captures warm-start taps since plugin 2.6.0, except when the process was killed with its task still in the recent apps list - React Native: promote the notification-delegate requirement to a callout, and add the missing $push_notification_opened troubleshooting row - iOS and Flutter: state the iOS 14 floor for the automatic hooks - Flutter: name the plugin version instead of native floors the plugin no longer declares
Contributor
Deploy preview
Changed pages
|
Contributor
|
Vale prose linter → found 0 errors, 32 warnings, 11 suggestions in your markdown Full report → Copy the linter results into an LLM to batch-fix issues. Linter being weird? Update the rules!
|
| Line | Severity | Message | Rule |
|---|---|---|---|
| 12:94 | suggestion | Address the reader directly. Use 'you' instead of 'the user'. | PostHogDocs.DirectAddress |
| 16:72 | warning | 'classpath' is a possible misspelling. | PostHogBase.Spelling |
| 48:37 | warning | 'unregisters' is a possible misspelling. | PostHogBase.Spelling |
| 48:127 | warning | Use 'ID' instead of 'id'. | Vale.Terms |
| 50:18 | warning | 'unregistration' is a possible misspelling. | PostHogBase.Spelling |
| 94:66 | warning | 'classpath' is a possible misspelling. | PostHogBase.Spelling |
| 95:102 | suggestion | Address the reader directly. Use 'you' instead of 'the user'. | PostHogDocs.DirectAddress |
contents/docs/workflows/push-notifications/flutter.mdx — 0 errors, 8 warnings, 3 suggestions
| Line | Severity | Message | Rule |
|---|---|---|---|
| 12:118 | suggestion | Address the reader directly. Use 'you' instead of 'the user'. | PostHogDocs.DirectAddress |
| 26:110 | warning | 'APNs' is a possible misspelling. | PostHogBase.Spelling |
| 26:254 | warning | 'classpath' is a possible misspelling. | PostHogBase.Spelling |
| 26:334 | suggestion | Address the reader directly. Use 'you' instead of 'the user'. | PostHogDocs.DirectAddress |
| 54:9 | warning | Capitalize 'Logs' for PostHog's product. Use 'logs' for the general industry concept. | PostHogBase.ProductNames |
| 78:1 | warning | 'Unregister' is a possible misspelling. | PostHogBase.Spelling |
| 86:18 | warning | 'unregistration' is a possible misspelling. | PostHogBase.Spelling |
| 127:66 | suggestion | Address the reader directly. Use 'you' instead of 'the user'. | PostHogDocs.DirectAddress |
| 127:159 | warning | 'classpath' is a possible misspelling. | PostHogBase.Spelling |
| 128:77 | warning | 'APNs' is a possible misspelling. | PostHogBase.Spelling |
| 128:105 | warning | Use 'ID' instead of 'id'. | Vale.Terms |
contents/docs/workflows/push-notifications/ios.mdx — 0 errors, 10 warnings, 3 suggestions
| Line | Severity | Message | Rule |
|---|---|---|---|
| 12:192 | suggestion | Address the reader directly. Use 'you' instead of 'the user'. | PostHogDocs.DirectAddress |
| 13:28 | warning | 'APNs' is a possible misspelling. | PostHogBase.Spelling |
| 13:79 | warning | 'APNs' is a possible misspelling. | PostHogBase.Spelling |
| 13:98 | warning | Use 'ID' instead of 'id'. | Vale.Terms |
| 28:199 | suggestion | Address the reader directly. Use 'you' instead of 'the user'. | PostHogDocs.DirectAddress |
| 52:9 | warning | Capitalize 'Logs' for PostHog's product. Use 'logs' for the general industry concept. | PostHogBase.ProductNames |
| 72:1 | warning | 'Unregister' is a possible misspelling. | PostHogBase.Spelling |
| 78:52 | warning | 'unregisters' is a possible misspelling. | PostHogBase.Spelling |
| 78:142 | warning | Use 'ID' instead of 'id'. | Vale.Terms |
| 80:18 | warning | 'unregistration' is a possible misspelling. | PostHogBase.Spelling |
| 120:83 | suggestion | Address the reader directly. Use 'you' instead of 'the user'. | PostHogDocs.DirectAddress |
| 121:47 | warning | 'APNs' is a possible misspelling. | PostHogBase.Spelling |
| 121:120 | warning | Use 'ID' instead of 'id'. | Vale.Terms |
contents/docs/workflows/push-notifications/react-native.mdx — 0 errors, 9 warnings, 3 suggestions
| Line | Severity | Message | Rule |
|---|---|---|---|
| 12:132 | suggestion | Address the reader directly. Use 'you' instead of 'the user'. | PostHogDocs.DirectAddress |
| 32:110 | warning | 'APNs' is a possible misspelling. | PostHogBase.Spelling |
| 32:252 | warning | 'classpath' is a possible misspelling. | PostHogBase.Spelling |
| 32:382 | suggestion | Address the reader directly. Use 'you' instead of 'the user'. | PostHogDocs.DirectAddress |
| 96:54 | warning | 'APNs' is a possible misspelling. | PostHogBase.Spelling |
| 96:83 | warning | Use 'ID' instead of 'id'. | Vale.Terms |
| 98:1 | warning | 'Unregister' is a possible misspelling. | PostHogBase.Spelling |
| 106:18 | warning | 'unregistration' is a possible misspelling. | PostHogBase.Spelling |
| 167:112 | suggestion | Address the reader directly. Use 'you' instead of 'the user'. | PostHogDocs.DirectAddress |
| 167:203 | warning | 'classpath' is a possible misspelling. | PostHogBase.Spelling |
| 168:77 | warning | 'APNs' is a possible misspelling. | PostHogBase.Spelling |
| 168:105 | warning | Use 'ID' instead of 'id'. | Vale.Terms |
turnipdabeets
added a commit
that referenced
this pull request
Sep 12, 2026
Release-dependent half of the push open docs update. The corrections that are true today moved to #20114.
This was referenced Sep 12, 2026
Open
Contributor
Bundle reportTotal JS (gzip)8.78 MiB (+0.4 KiB / +0.0%) Eager graph (modules shipped in each entrypoint's initial chunks)
Largest modules in the
|
| Module | Size |
|---|---|
./src/data/mcp-tools.json |
1131.9 KiB |
css ./node_modules/.pnpm/css-loader@5.2.7_webpack@5.101.3/node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[8].oneOf[1].use[1]!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.5.6_webpack@5.101.3/node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[8].oneOf[1].use[2]!./src/styles/global.css |
773.9 KiB |
./src/components/Stickers/Stickers.tsx |
696.4 KiB |
./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.3.1/node_modules/@radix-ui/react-icons/dist/react-icons.esm.js |
481.4 KiB |
./node_modules/.pnpm/@posthog+brand@0.8.0_react@18.3.1/node_modules/@posthog/brand/dist/generated/hoggies/svg/x-ray.mjs |
480.8 KiB |
./node_modules/.pnpm/rehype-raw@7.0.0/node_modules/rehype-raw/lib/index.js + 29 modules |
395.1 KiB |
./node_modules/.pnpm/@posthog+brand@0.8.0_react@18.3.1/node_modules/@posthog/brand/dist/generated/hoggies/svg/im-the-driver.mjs |
385.7 KiB |
./src/hooks/useCustomers.tsx + 55 modules |
370.0 KiB |
./node_modules/.pnpm/@posthog+icons@0.36.6_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@posthog/icons/dist/posthog-icons.es.js |
354.8 KiB |
./node_modules/.pnpm/react-markdown@8.0.7_@types+react@16.14.66_react@18.3.1/node_modules/react-markdown/lib/react-markdown.js + 88 modules |
351.4 KiB |
./src/components/ProductComparisonTable/index.tsx + 126 modules |
305.7 KiB |
./node_modules/.pnpm/cloudinary-core@2.14.0_lodash@4.17.21/node_modules/cloudinary-core/cloudinary-core.js |
281.9 KiB |
./node_modules/.pnpm/@posthog+brand@0.8.0_react@18.3.1/node_modules/@posthog/brand/dist/generated/hoggies/svg/doll-house.mjs |
281.7 KiB |
./node_modules/.pnpm/@posthog+brand@0.8.0_react@18.3.1/node_modules/@posthog/brand/dist/generated/hoggies/svg/director.mjs |
275.6 KiB |
./src/components/SearchUI/index.tsx + 87 modules |
273.7 KiB |
Eager-graph budgets are report-only until a baseline is established. Sizes are gzip of public/**/*.js; eager size is webpack module source bytes for the modules actually shipped in the entrypoint's initial chunks (post-tree-shake).
- Android, Flutter, iOS: a repeat of a PostHog-sent notification captured in the last 5 minutes is skipped, so one tap counts once - React Native: iOS captures a tap that cold-launches the app, and capturePushNotificationOpened: false no longer stops that launch hook - document the Info.plist key that does - React Native: document the MainActivity onNewIntent override for taps that arrive after the process was killed, via the Expo config plugin or by hand - React Native: replace the manual open guidance with the dedupe rule - Flutter: a tap that lands before setup() is replayed once setup completes - iOS: the React Native plugin now prewarms open capture too
turnipdabeets
marked this pull request as draft
September 12, 2026 16:20
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Changes
Every push notification docs change for this effort, in one PR, written as true after the SDK releases land. This replaces #20102, which is closed.
Draft until the releases are published. posthog.com deploys on merge, so merging early would publish claims about versions nobody can install yet.
Two kinds of change are mixed here on purpose, because they touch the same paragraphs:
What changed, per page
react-native.mdxsetup().@posthog/react-native-plugin2.8.2 (#4921)### Android taps after the process is killedsection: theposthog-react-native/expoconfig plugin writes theMainActivity.onNewIntentoverride onexpo prebuild,patchMainActivityNewIntent: falseopts out, and a bare React Native app addssetIntent(intent)beforesuper.onNewIntent(intent)by hand. Snippet taken verbatim from the block the config plugin generates.posthog-react-native4.72.0 (#4929)CalloutBox, matchingios.mdxandflutter.mdx.onNotificationOpenedAppsnippet is gone (following it double-counts every Android tap since 2.6.0), replaced by the plain manual call plus a "don't wire this toonNotificationOpenedApp/getInitialNotification()" warning and the dedupe rule.@posthog/react-native-plugin2.8.2 (#4919)capturePushNotificationOpened: falsestops the event but not the launch hook, which is installed before any JavaScript runs and only released atsetup(). The section now documentscom.posthog.posthog.CAPTURE_PUSH_NOTIFICATION_OPENED=falseinInfo.plist(Expo:ios.infoPlist) as the way to skip the hook entirely, with a JSON example.@posthog/react-native-plugin2.8.2 (#4921)$push_notification_openednever fires troubleshooting row, which the iOS and Flutter pages already had, covering all three causes above.android.mdxPostHog.capturePushNotificationOpenedis no longer described as never deduplicated. A repeat of a PostHog-sent notification captured in the last 5 minutes is skipped, so one tap counts once whichever path reports it. Notifications PostHog didn't send are still never deduplicated.flutter.mdxposthog_flutter5.41.1 (posthog-flutter#578)Posthog().setup()runs is held and captured once setup completes, so coverage no longer depends on the FCM package refreshing the activity's intent.posthog_flutter5.41.1 (posthog-flutter#579)ios.mdx@posthog/react-native-plugin2.8.2 (#4921)getIntegrations()installs both push integrations insideif #available(iOS 14.0, macOS 11.0, *)while the deployment target is iOS 13, so an iOS 13 device silently captures nothing. Added as a requirement and to the "Opens are never captured" row.Versions this PR names, and where they come from
Every number below is the next release, derived from the version on
mainplus the changeset on the PR branch. None is cut yet, so all of them need re-checking on Monday.maintodaycom.posthog:posthog-androidminorPostHog(posthog-ios)minor@posthog/react-native-pluginpatchposthog-react-nativeminor(#4921, #4919 arepatch)posthog_flutterpatchNo other changesets are pending on any of those
mainbranches, so nothing else should move the numbers – unless something merges between now and the releases.Caveat worth deciding before merge
The React Native plugin cannot resolve posthog-ios 3.75.0.
posthog-react-native-plugin.podspecpinsPostHogas~> 3.73.3(upToNextMinorVersion), which resolves 3.73.x only, and none of #4919, #4921 or #4929 raises it. So after the releases, React Native gets the dedupe on Android (#4919 raises the Android pin to 3.65.0) but not on iOS.react-native.mdxis written to match: Android dedupes, iOS still double-counts a manual call. If #4919 is extended to bumpposthog_ios_versionto 3.75.0 before it merges, that sentence should be simplified.Flutter is the softer version of the same thing:
posthog_flutter.podspecdeclaresPostHog >= 3.74.0, < 4.0.0, and #578 raises only the Android floor. A freshpod installresolves 3.75.0 and gets the dedupe, but aPodfile.lockpinned to 3.74.0 does not, which is whyflutter.mdxsays "once your build resolves posthog-ios 3.75.0 or newer" rather than stating it flatly.Monday re-verification checklist
Before taking this out of draft:
@posthog/react-native-plugin2.8.2 is on npm and contains Build fix / GitHub tooltip body update #4921 (iOS launch hook + theInfo.plistkey) and added link to developing with an enterprise license #4919 (posthog-androidpinned to 3.65.0). If the published version is not 2.8.2, update all four mentions onreact-native.mdxand the one onios.mdx.posthog-react-native4.72.0 is on npm and contains Improve Community dropdown menu #4929. If the published version differs, update the one mention in the "Android taps after the process is killed" section.posthog_flutter5.41.1 is on pub.dev and contains Add Actions + Custom Events Tutorial #578 and added disclaimer to docker deployment #579. If the published version differs, update the two mentions onflutter.mdx.posthog_ios_versionto 3.75.0, rewrite the React Native dedupe sentence to cover iOS too.patchMainActivityNewIntentand still defaults to on in the publishedposthog-react-native.Info.plistkey is still spelledcom.posthog.posthog.CAPTURE_PUSH_NOTIFICATION_OPENEDin the published plugin.Verification behind the claims
Read against
origin/mainand the open PR branches of posthog-android, posthog-ios, posthog-js and posthog-flutter, not against the old docs:PostHog.recordPushOpeninposthog/src/main/java/com/posthog/PostHog.ktandPostHogSDK.recordPushOpeninPostHog/PostHogSDK.swift. Keyed onposthog.invocation_id+action_id, 5 minute window, at most 20 remembered opens, skipped in either direction (manual after automatic and automatic after manual). A payload with noposthog.invocation_idis always captured, which is why every page says notifications PostHog didn't send are never deduplicated.PosthogReactNativePlugin.mmregisters aUIApplicationDidFinishLaunchingNotificationobserver at image load, which callsprewarmPushNotificationOpenCapture()unlesscom.posthog.posthog.CAPTURE_PUSH_NOTIFICATION_OPENEDisfalse, guarded byif #available(iOS 14.0, *).PostHogSDK.prewarmPushNotificationOpenCapture()'s own doc says the swizzles are "released again … atsetup()when the config disables push-open capture", which is exactly why the JS flag stops the event but not the hook.NEW_INTENT_KOTLIN_BODYinpackages/react-native/src/tooling/expoconfig.tson the Improve Community dropdown menu #4929 branch, so the hand-written override and the generated one are the same code.pendingPushIntentinPosthogFlutterPlugin.kton the added disclaimer to docker deployment #579 branch remembers a tray tap (an intent carryinggoogle.message_id) and replays it fromcapturePushNotificationOpenedFromLaunchIntent().PostHogConfig.getIntegrations()installs both push integrations insideif #available(iOS 14.0, macOS 11.0, *).pnpm vale:stagedreports 0 errors. The remaining warnings are the pre-existingAPNs/classpath/unregisterspelling entries already on these pages.Checklist
vercel.json(no pages moved)Related PRs
One push-open capture effort across the mobile SDKs: count every notification tap exactly once, and stop losing taps the SDK starts too late to see.
firebase_messagingMerge order: posthog-android#783 and posthog-ios#828 first, then their releases. #4921, #4929 and #579 are independent and can go any time. #4919 and #578 go green once posthog-android 3.65.0 is published. This PR merges last, after every release above is out.
Earlier work this builds on: PostHog/posthog-android#753, PostHog/posthog-ios#792, PostHog/posthog-js#4858, PostHog/posthog-flutter#556, PostHog/posthog-flutter#557, #19905.
🤖 Generated with Claude Code
https://claude.ai/code/session_01UJgnRvz58rzgFVCiUfjxkL