Uploading files to the data warehouse
Contents
You can upload CSV, JSON, or Parquet files directly to the data warehouse without setting up your own S3 or GCS bucket. PostHog stores the file and reads it in place on every query — there's no sync pipeline or recurring import.
This is ideal for one-off data like spreadsheet exports, lookup tables, or static datasets. For files larger than 50MB or data that updates regularly, link an S3 or GCS bucket instead.
Supported file formats
CSV
- The first row is treated as the header (column names).
- Columns should not contain spaces.
- Avoid commas inside cell values unless properly quoted.
JSON
Three shapes are accepted:
- JSON array — a top-level array of objects (e.g.
[{"name": "Alice"}, {"name": "Bob"}]). - Single JSON object — one object becomes one row.
- Newline-delimited JSON (NDJSON) — one JSON object per line.
Parquet
Standard Apache Parquet files are supported.
How to upload a file
Step 1: Choose your file type
- Go to the Data pipeline sources tab.
- Click New source.
- Under self managed, select CSV, JSON, or Parquet depending on your file format.
Step 2: Upload and create the table
- Select the file from your computer. The maximum file size is 50MB.
- Enter a table name — this is the name you'll use in SQL queries.
- Click Create.
PostHog uploads the file, detects the columns, and creates a table you can query immediately.
Step 3: Query your data
Your table appears under self-managed sources on the sources page. Query it with SQL like any other table:
See querying the data warehouse for more on writing SQL queries.
Joining uploaded data to persons
When your uploaded data relates to people in PostHog, you can create a join to connect it with the persons table. This makes your uploaded data act like extended person properties.
For example, if your CSV has an email column:
- Go to the data warehouse tab, find the
personstable, click the three dots, and click Add join. - Set Source Table Key to
properties.email. - Set Joining Table to your uploaded table and Joining Table Key to
email. - Click Save.
You can then query across both tables:
Limitations
- 50MB maximum file size. For larger files, upload them to your own bucket and link it as a source.
- Static data. Uploaded files are not synced or updated automatically. To update the data, delete the table and upload a new file.
- No recurring sync. Unlike managed sources, there is no sync schedule — the file is read directly from storage on each query.
Troubleshooting
Table creation failed — could not detect columns: Check that your file is valid. For CSV files, ensure the first row contains column headers and columns don't have spaces in their names. For JSON, ensure the file contains valid JSON objects.
File too large: The upload limit is 50MB. For larger datasets, upload the file to S3, GCS, or Cloudflare R2 and link the bucket instead.
Uploaded file not found: If you see this error when creating a table, the upload may have expired. Try uploading the file again.