> ## Documentation Index
> Fetch the complete documentation index at: https://www.dataframer.ai/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Import Events from Warehouse

> Use the events your analytics tool already records, without the browser SDK

If you already send product events to Segment, PostHog or Amplitude, DataFramer can use those instead of the [browser SDK](/docs/user-signals/browser-events). There are two ways in: a Databricks or Amazon Redshift table your tool already writes to, or Segment's webhook. Neither needs a code change in your app, and you can add as many as you need. To place imported events on the right journeys, set the [linking rule](/docs/user-signals/fields-and-linking#linking-rule). When imported events carry a value at another path than your other events, add that path to the [field](/docs/user-signals/fields-and-linking#fields).

## From a warehouse table

Segment, PostHog and Amplitude can each copy every event into a table in Databricks or Amazon Redshift:

* **Segment**: add the [Databricks destination](https://www.twilio.com/docs/segment/connections/storage/catalog/databricks), with the workspace host starting `https://`, or the [Redshift destination](https://www.twilio.com/docs/segment/connections/storage/catalog/redshift), which needs a provisioned cluster, not Redshift Serverless. It writes one table per event name, plus `identifies` for user traits, on Segment's sync schedule (once a day on the free plan).
* **PostHog**: create a [Databricks batch export](https://posthog.com/docs/cdp/batch-exports/databricks), with the workspace host without `https://`, or a [Redshift batch export](https://posthog.com/docs/cdp/batch-exports/redshift). It writes one events table.
* **Amplitude**: add the [Databricks destination](https://amplitude.com/docs/data/destination-catalog/databricks) or the [Redshift destination](https://amplitude.com/docs/data/destination-catalog/amazon-redshift). It writes one events table.

DataFramer reads that table:

* **Databricks**: with a service principal. Give the principal `USE CATALOG`, `USE SCHEMA` and `SELECT` on the tables, and **Can use** on a SQL warehouse.
* **Amazon Redshift**: with a database user that has `USAGE` on the schema and `SELECT` on the tables. The tool creates its tables itself, Segment one per new event name, so grant `SELECT` on future tables too, with `ALTER DEFAULT PRIVILEGES` for the tool's user. As for the tools' own Redshift exports, the endpoint must be publicly accessible, and its security group must allow DataFramer's address `35.83.1.227` on the port. In a [customer-hosted deployment](/docs/deployment#user-signals-in-a-customer-hosted-deployment) your data plane connects instead: allow your data plane's network, and the endpoint need not be public.

Then, in DataFramer, open **Settings → Events**, select **Add a warehouse table**, and follow its steps. Four things to know:

* Choose **Other table** for an events table of your own; you then name its columns.
* One login has one secret: a new secret saved on one import is also saved on every import that uses the same login.
* For Segment, list the event tables, not `tracks`, which has no properties.
* An empty **Only these events** imports every event, which for PostHog includes its automatic events such as `$pageview` and `$autocapture`.

When the preview looks right, select **Start importing**. DataFramer then imports new rows every few minutes, each event once, so a table you re-export does not create duplicates. From a table that does not record when each row arrived, such as PostHog's Redshift table, an event that arrives more than 7 days late is not imported. Edit an import to read more, with an earlier or empty **Import events from** or more events in **Only these events**, and its next runs read its tables again from the start, so the events the old settings left out arrive too. **Delete** stops an import; the events it imported stay, with its name.

## From Segment's webhook

Segment can also send DataFramer a copy of each event as it arrives. This needs no warehouse, but only events from then on arrive. Add one webhook for each Segment source:

1. In **Settings → Events**, select **Add Segment webhook**, give it a name, such as the name of the Segment source, and copy its address and shared secret. The name shows as the source of its events, such as "Segment webhook · web app".
2. In Segment, add a **Webhooks (Actions)** destination to your source. In its **Settings**, paste the secret into **Shared Secret** and turn on **Enable Destination**.
3. In its **Mappings**, add a **Send** mapping for the event types you want, with the address as **URL** and **POST** as **Method**. Keep the default **Data**, the whole event. Batching can be on.

## Next steps

> **[Fields and Linking](/docs/user-signals/fields-and-linking)**
>
> Choose how imported events link to your AI traces.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.