Amplitude event export (chart CSV / raw Export API)
Two different artifacts people conflate: the CSV you download from an Amplitude chart (a rendering of that chart's series) and the raw Export API dump (zipped, hourly, gzipped JSON), treated as interchangeable event tables when they are partitioned and defined differently.
The shape, how the file is really laid out
Chart CSV: a header plus one row per segment or date bucket, carrying the exact
numbers the chart displayed, with a summary/"Totals" line and null groups shown
as "(none)". Raw Export API: NOT a CSV, a zip containing one gzipped
newline-delimited JSON file per hour, each line an event object with nested
event_properties and user_properties, and multiple timestamps: client_event_time,
server_upload_time, server_received_time, plus event_time in the project's
timezone. Every project has a single fixed reporting timezone set at creation;
unique-user counts are computed on amplitude_id, Amplitude's merged identity,
not on the raw device_id or user_id.
The traps
The raw export is partitioned by server upload time, not by when the event occurred, so an event that happened at 11:50pm but uploaded at 12:10am lands in the next hour's, and possibly next day's, file; re-bucket on event_time or the daily counts will drift.
- Every trap in this export, worked through
- The reconciliation anchor, the total the file asserts about itself
- The refusal cases, when to stop and ask instead of guess
Reference: Amplitude Docs, "Export API" (hourly gzipped JSON, server-upload-time partitioning) · Amplitude Docs, "Export chart data / CSV" · Amplitude Docs, "Amplitude ID and identity resolution" · Amplitude Docs, "Project timezone settings" and "Sampling"