Omnibus
Skill 82 of 200
Move existing mobile push devices from another platform (OneSignal, Braze, Customer.io, Airship, or your own Firebase backend) into a PostHog workflows push channel, so people who…
3 minutes · 586 words · 4 sections
Install
npx skills add PostHog/skills --skill importing-push-tokensnpx skills add PostHog/skills/plugin marketplace add PostHog/skillsThe first command installs just this skill, by the name in its SKILL.md; the second installs the whole repository.
A push notification reaches a device only when PostHog knows that device’s token and which person it belongs to. The mobile SDK registers new devices by itself. Devices that installed the app before the switch stay unknown until their token is imported.
The import pairs each device token with a distinct ID.
The distinct ID has to be the ID the app passes to identify, so the device lands on the person a workflow targets.
A pairing that is off by one prefix or uses another platform’s internal ID imports fine but never receives a push. Getting the pairing right is most of the job.
integrations-list: find the push channel. kind is apns for iOS and firebase for Android (and for iOS apps that send through FCM).integrations-push-tokens-create: import up to 1000 rows per call, with dry_run to check without storing anything.The same import is in the app under Workflows → Channels → Import devices, for a person who has a CSV.
| Channel kind | Token it takes | Looks like |
|---|---|---|
apns | The APNs device token, hex encoded | 64 hex characters, for example 9f2c…e1a0 |
firebase | The FCM registration token | Around 150 characters of letters, digits, -, _, often with a : |
ExponentPushToken[...]) can’t be imported. They address Expo’s own push service, not Apple or Google. Ask for the native APNs or FCM token instead: Expo apps can read it with getDevicePushTokenAsync, so the app has to start sending it to PostHog first.firebase channel, not apns.token_mismatch. The check rejects only shapes that cannot work, so passing it does not prove the token is live.integrations-list and pick the apns or firebase entry for the app. If there is none, the push channel has to be set up first.identify. Confirm it with the user, because some apps prefix IDs or identify by email in one tool and by database ID in the other. Drop devices with no user ID: an anonymous device has no person to land on.dry_run: true. Read failed:
unknown_person rows mean the mapping is wrong. Stop and fix the mapping. Don’t switch on create_missing_persons to make them pass, because that creates people nobody’s app identifies.token_mismatch rows are on the wrong channel or are Expo tokens. Split iOS and Android rows, and drop Expo tokens.dry_run: true in batches of 1000, then again without it. Keep to 60 calls per minute per project. On HTTP 429, wait a minute and send the same batch again.not_stored and person_processing_disabled rows were not saved by ingestion. Send not_stored rows again later. Use create_missing_persons: true only for unknown_person rows the user confirms are real people who haven’t opened the new app yet.$device_push_subscription_<app>:<hash> property. A test push from a workflow to that person is the real proof.Importing the same row twice stores it once, so a batch can be sent again safely. Each stored device is one event, so a large import counts toward event usage.
Move existing mobile push devices from another platform (OneSignal, Braze, Customer.io, Airship, or your own Firebase backend) into a PostHog workflows push channel, so people who installed the app before the switch still get push notifications. Covers exporting device tokens and user IDs, mapping the old user ID to the PostHog distinct ID, checking the pairing with a dry run, and importing in batches. Use when asked to import, migrate, or backfill push tokens, device tokens, FCM tokens, APNs tokens, or push subscribers.
The verbatim description from this skill’s front matter — the string an agent matches on to decide whether to load it.
main, last pushed 8 November 2026.SKILL.md, not by matching a directory convention. 2 distinct layouts observed: skills/omnibus/*/SKILL.md, skills/posthog/all/skills/*/SKILL.md.h1 and no skipped levels:.claude-plugin/marketplace.json by PostHog, declaring 6 plugins. It is read for editorial metadata only — never as the skill index, which is always the repository tree./PostHog/skills.md, and each skill at its own .md URL.1 file · 3 KB
Everything this skill ships beside its prose. All of it is set here, as a subchapter of skill 82.
Documentation the agent loads on demand, rather than up front.