Migrate to PostHog from Amplitude

Last updated:

|Edit this page

If you're running close to Amplitude's 10 million free events limit, migrating to PostHog could be a good idea, especially since the PostHog event schema is quite similar to Amplitude's.


  1. Export your data from Amplitude using the Amplitude Export API
  2. Import data into PostHog using any of PostHog's SDKs or capture API.

Translating the data schema

Roughly, for every Amplitude event, you'll need to:

  • Capture the event: this involves calling the Capture events with the event name, timestamp, event properties, and user properties
  • Alias the user: if this is a logged-in user, you'll want to Alias the device ID to the user

Capture the event

For reference, as of writing, Amplitude's event structure is (according to their Export API documentation:

"event_time": UTC ISO-8601 formatted timestamp,
"event_name": string,
"device_id": string,
"user_id": string | null,
"event_properties": dict,
"group_properties": dict,
"user_properties": dict,
// A bunch of other fields that include things like
// device_carrier, city, etc.

When capturing the event, roughly, the schema you'll want to use is:

const distinctId = user_id || device_id;
const eventMessage = {
properties: {
$set: { ...user_properties, ...group_properties },
$geoip_disable: true,
event: event_type,
distinct_id: distinctId,
timestamp: event_time,

In short:

  • We want to track the event with the same:
    • Event name
    • Timestamp
  • For the distinct ID, we either want to use the User ID if present, or the Device ID (a UUID string) if not
  • We want to track both User and Group properties as User Properties using properties: {$set}
  • We want to track Event properties using properties

Aliasing device IDs to user IDs

In addition to tracking the events themselves, we want to tie users' events both before and after login. For Amplitude, events before and after login look a bit like this:

EventUser IDDevice ID
Application installednull551dc114-7604-430c-a42f-cf81a3059d2b

We'd ideally like to be able to attribute "Application installed" to the user with ID 123, so we need to also call alias with:

const aliasMessage = {
distinct_id: user_id, // 123
aliasId: device_id, // 551dc114-7604-430c-a42f-cf81a3059d2b

Since you only need to do this once per event, ideally you'd store somewhere (e.g., in a SQL table outside of PostHog) a record of which aliases you'd already sent to PostHog, so that you don't end up sending the same Alias events twice.


Was this page useful?

Next article

Export events

At PostHog we believe in your right to own your data - this means being able to export the raw events whenever you want. There are several ways to export your events depending on your use case: Method When? Limitations PostHog UI - click "Export" on the events table You need to export a small number of events 3,500 events Events API Great for one-off smaller exports 1 day date range and 3,500 events Batch exports You need to export a large number of events, can be used for continuous exports No…

Read next article