Zero Copy lets you build a Target Group directly from data that lives in your own data warehouse — without copying, uploading, or ingesting that data into Optimove. Instead of moving your data to the platform, Optimove runs a SQL query against your warehouse and retrieves only the list of Customer IDs that match your criteria. Zero Copy supports Snowflake and Databricks.
This is especially useful for sensitive or frequently changing data — such as financial attributes, KYC status, or churn risk scores — that your team prefers to keep within your own systems. Only Customer IDs are returned to Optimove; no other columns or attributes leave your warehouse.
This guide will walk you through how to connect your data warehouse, create a Zero Copy list, and use it to build a Target Group in Optimove.
How to Create a Zero Copy List
Add a Data Warehouse Connection
Before creating a list, you need to connect Optimove to your data warehouse. This is a one-time setup step — once a connection is saved, it can be reused for multiple lists.
- Navigate to Settings > Access Management > Connection Hub.
- Click "Add Connection".
- Select your database type — Snowflake or Databricks.
- Enter a name for the connection and fill in the required credentials. The fields differ by database type — see Connection Credentials by Database Type below.
- Click "Test Connection" to verify access.
- Click "Save". The connection appears in your connections table with its last connection status and database type.
Connection Credentials by Database Type
Your IT team collects these values while completing the prerequisites. You only need to paste them in.
| Snowflake | Databricks |
|---|---|
Account identifier (MYORG-MYACCOUNT) |
Server hostname |
| Warehouse, database, and schema | HTTP path and catalog |
| Service username | Service principal Client ID |
| Private key (base64-encoded) | Client Secret, or a Personal Access Token |
Create a New Customer List
Customer Lists live in Data Studio. This is where you define the SQL query that Optimove will run against your warehouse to generate your customer list.
- Navigate to Customer Lists in Data Studio.
- Click "Add New List".
- Select the connection you set up in Step 1 from the dropdown.
- Optimove will display your warehouse's table structure so you can reference available tables and columns when writing your query. The objects and data visible here depend on the permissions your IT team has granted to Optimove.
- Enter a unique name for your list.
Enter and Test Your SQL Query
Write a SQL query that returns the Customer IDs you want to target. Optimove runs this query against your warehouse on the schedule you define.
-
In the SQL query field, enter a
SELECTstatement that returns only Customer IDs. For example, in Snowflake:SELECT CID FROM CUSTOMERS WHERE CHURN_RISK = 'HIGH'
In Databricks, reference the table using its full Unity Catalog path — catalog, schema, and table:
SELECT CID FROM my_catalog.my_schema.CUSTOMERS WHERE CHURN_RISK = 'HIGH'
- Click "Run Query". Optimove displays the total number of Customer IDs returned and a preview of the first 10.
- Review the results to confirm the query is returning the expected audience.
- Adjust and re-test as needed.
Important: If you need results returned in a specific order, include an
ORDER BY clause in your query. Without it, the returned records are not guaranteed to be in any particular order and may be selected randomly.Set Your Sync Schedule
Choose how often Optimove should re-run the query to refresh your list.
- Choose your sync type:
- One-time — Optimove runs the query once at the time you specify.
- Recurring — Optimove re-runs the query once per day at a time you define.
- Set the time of day for the sync to run.
- Click "Save" to create the list.
Databricks: if your SQL Warehouse has auto-stopped due to inactivity, it starts automatically when the sync runs. Classic and Pro warehouses may take 2–5 minutes to warm up, so a sync can complete slightly after its scheduled time. Serverless warehouses minimize this delay.
Open Your Target Group
When you save a Zero Copy list, Optimove automatically creates a corresponding Target Group from it — no extra steps needed.
- In the Customer Lists page, find your newly created list.
- Open the context menu and select "Open Target Group" — the auto-created Target Group opens in a new tab.
- In the Target Group Editor, add any additional criteria as needed to refine your audience.
- Save the Target Group.
How Zero Copy Works
Unlike CSV uploads or the List Sync API — where customer data is brought into Optimove — Zero Copy keeps your data exactly where it is. Optimove connects to your warehouse, runs your SQL query, and retrieves only a list of Customer IDs. Aside from the Customer IDs (CUIDs) returned by your query, no raw data or other attributes are stored in Optimove.
- Optimove executes your query against your data warehouse on the schedule you defined.
- Your warehouse returns a list of Customer IDs that match the query criteria at that point in time.
- Optimove updates the list with the fresh results. Any Target Groups referencing the list are updated automatically.
- Your raw data never moves. Only Customer IDs cross the boundary — everything else stays in your warehouse.
What about data that changes between syncs? If a customer's status changes in your warehouse after a sync has run, the list in Optimove reflects the previous sync's results until the next scheduled run.
Use Case Examples
Zero-Copy Customer Lists is the right choice when the audience you want to reach is already defined by data in your own warehouse — and that data is something you would rather not copy into Optimove. Because the query returns only Customer IDs, the attributes that define the audience never leave your warehouse. Here are two examples of how brands use it.
eCommerce: Fit guidance for frequent returners
Returns data usually lives in your order management and returns systems, and your team may already calculate return rates in your warehouse. With Zero-Copy Customer Lists, you can turn that existing logic into an audience directly: your query calculates the return rate in your warehouse and returns only the Customer IDs of customers who match. There's no need to model or sync the underlying order and returns data, and none of it leaves your warehouse.
In this example, a fashion retailer wants to send sizing tips to customers who often return items, to help them choose the right size first time. The same list can also exclude them from free-returns promotions.
- List name: Frequent Returners - Last 6 Months
- What Optimove receives: Customer IDs only, with no order history, return counts, or return reasons
SELECT o.CID FROM ORDERS o LEFT JOIN RETURNS r ON r.ORDER_ID = o.ORDER_ID WHERE o.ORDER_DATE >= DATEADD(month, -6, CURRENT_DATE) GROUP BY o.CID HAVING COUNT(DISTINCT o.ORDER_ID) >= 5 AND COUNT(DISTINCT r.ORDER_ID) / COUNT(DISTINCT o.ORDER_ID) >= 0.4
Gaming: A Responsible Gaming newsletter for elevated-risk players
Operators typically run their own player-risk model, and its inputs and scores stay in the warehouse. Zero-Copy Customer Lists lets you act on the model's output without exporting it: the query selects the players your model has flagged, and Optimove receives only their IDs.
In this example, every player the operator's model rates as high or medium risk is added to a Responsible Gaming newsletter.
- List name: Elevated-Risk Players
- What Optimove receives: Customer IDs only — no risk level, no model inputs
SELECT PLAYER_ID
FROM CUSTOMERS_DEMO_GAMING
WHERE UPPER(RISK_LEVEL) IN ('HIGH', 'MEDIUM');FAQ
Can I use Zero Copy data for personalization or AI features?
No. Because Zero Copy does not store customer attributes in Optimove, data retrieved via Zero Copy cannot be used for personalization (such as Liquid tags in templates) or to train Optimove's AI models. Zero Copy lists are available for audience targeting only.
What happens if my SQL query fails or my warehouse connection goes down?
If a sync fails, Optimove sends an email notification to users registered for Zero Copy alerts. The notification includes the list name, error type, error details, and the time of failure. You can register for these notifications via Settings > System Notifications > Add System Notification, then choose to receive Zero Copy list notifications. The last successfully synced list remains active until the next successful sync.
Is there a limit to how many Customer IDs a Zero Copy list can contain?
Yes. Each Zero Copy list can return a maximum of 500k rows per query run. Customer IDs not registered in Optimove will be excluded.
Can I use one Zero Copy list in multiple Target Groups?
Yes. A single Zero Copy list can be used across multiple Target Groups. To do this, duplicate the Target Group that was automatically created when you saved the list — the duplicated Target Group retains the list criteria and can be modified as needed. Any updates to the underlying list, such as changes to the SQL query or sync schedule, will automatically apply to all Target Groups that use it.
Which data warehouses does Zero Copy support?
Zero Copy currently supports Snowflake and Databricks. Support for BigQuery and Redshift is planned for future releases.
What does my Databricks workspace need before I can connect?
Your workspace must have Unity Catalog enabled and a provisioned SQL Warehouse. Your IT team creates a service principal for Optimove and grants it read-only access to the catalog and schema holding your customer data. Full requirements are in the Zero Copy Prerequisites: Databricks Connection article.
Can I connect both Snowflake and Databricks?
Yes. You can save more than one connection in the Connection Hub, and each connection appears in the table with its database type. When you create a Customer List, you select which connection the list queries. A single list queries one connection — to pull from both platforms, create a separate list for each.