Create a Sync from MSSQL to Batch Profile Events
Before you start
To create an MSSQL → Batch Profile Events sync, you'll need:
Access to the Batch dashboard
An MSSQL-compatible database (Azure SQL Database, Azure SQL Managed Instance, Microsoft Fabric Warehouse, or SQL Server 2012+) containing one row per event
Credentials to connect: either a username/password or a Microsoft Entra ID service principal (Client ID + Client Secret)
A table (or view) that follows the Cloud Sync events input format (see below)
1) Prepare your MSSQL table or view
Cloud Sync expects your MSSQL source (table or view) to include:
A profile identifier (to know which profile the event belongs to)
An event name (the type of event being recorded)
A cursor field (to know which rows are new since the last run)
Any number of event attribute columns (sent to Batch as event properties)
1.1 One row per event
Your source must contain one row per event.
Unlike profile attribute syncs, multiple rows can share the same custom_id — each row creates a separate event on the corresponding profile.
1.2 Required columns
Your table (or view) must include the following columns:
custom_id
✅
The identifier of the profile the event belongs to
event_name
✅
The name of the event (e.g. add_to_cart, purchase)
last_updated_at
✅
Cursor used for incremental sync
last_updated_at must be set at the time the event row is inserted and must not change afterwards. It is used only to determine which rows to fetch on the next sync run, not as the event timestamp.
1.3 Optional columns
event_time
The timestamp of the event, in RFC 3339 UTC format (e.g. 2026-04-17T04:25:00Z). If omitted, Batch uses the time of reception.
1.4 Event attribute naming rules
SQL column names cannot contain characters like $, (, or ). Cloud Sync relies on prefixes in column names to represent typed event attributes.
Supported prefixes
date__
Date attribute
date__purchased_at
url__
URL attribute
url__item_url
Any column without a prefix is sent to Batch as a standard string, number, or boolean attribute.
1.5 Handling objects
Object event attributes must be stored as a JSON string in your MSSQL column. The connector parses the string and sends it in the correct format to the Profile API.
Example using FOR JSON PATH:
1.6 Example schema (e-commerce)
How this maps in Batch:
custom_ididentifies the profile the event is attached toevent_namesets the event typeevent_timesets the event timestamp (falls back to reception time if omitted)item,quantity,pricebecome standard event attributesurl__item_urlis interpreted as a URL attributedate__purchased_atis interpreted as a date attributeproduct_detailsis interpreted as an object attribute
1.7 Using a View
If your raw event table doesn't match the expected naming or format, create an MSSQL View that converts your schema into the correct conventions.
This approach lets you:
rename fields with the correct prefixes (
date__,url__)set a reliable
last_updated_atbased on insertion timeformat
event_timeto RFC 3339 UTCstringify object columns correctly
1.8 Handling nulls
If an optional column value is NULL, that attribute is simply omitted from the event. It does not affect other attributes on the same event or on the profile.
2) Set up database access
Batch connects to your MSSQL database using either username/password or Microsoft Entra ID (recommended for Azure SQL).
Option A — Username / Password
Create a dedicated read-only user in your database and grant it SELECT access on the relevant table or view:
Option B — Microsoft Entra ID (recommended for Azure SQL)
This method uses a service principal (App Registration) to authenticate without storing a password.
2.1 Create an App Registration in Entra ID
Go to entra.microsoft.com
Navigate to Entra ID → App registrations → New registration
Give it a name (e.g.
Batch Cloud Sync) and register itNote the Application (Client) ID — you'll need it later
Go to Certificates & secrets → New client secret
Note the Value of the client secret — it is only shown once
2.2 Create a database user for the service principal
In your Azure SQL Database, run the following as an admin:
The user name in brackets must match exactly the display name of your App Registration in Entra ID.
3) Create the Sync in the Batch dashboard
Cloud Sync is configured from the dashboard via a dedicated Sync module.
Open the Batch dashboard
Go to Data → Cloud Sync
Click Create Sync
Select MSSQL as the source
3.1 Configure your MSSQL connection
Enter:
Host — your server hostname (e.g.
myserver.database.windows.netfor Azure SQL, or<workspace>.datawarehouse.fabric.microsoft.comfor Microsoft Fabric Warehouse)Port — default is
1433Database — the name of your database
Schema — the schema containing your table or view
Table or View — the name of the source table or view
Then fill in your credentials:
Username / Password if using SQL authentication, or
Entra ID Client ID and Entra ID Client Secret if using Microsoft Entra ID
When using Microsoft Entra ID authentication, an encrypted connection is required. Make sure your server accepts encrypted connections.
Batch validates the connection before continuing.
3.2 Select the destination
In the Destination dropdown, select Batch > Profile events.
3.3 Configure event mapping
Cloud Sync applies a simple mapping model:
custom_id→ identifies which Batch profile to attach the event toevent_name→ sets the event typelast_updated_at→ used only for incremental sync logicall other columns → mapped to event attributes
4) How incremental sync works
Cloud Sync uses incremental processing, which means it does not re-import your full dataset at every run. Instead, it fetches only the rows that are new since the last successful sync.
4.1 The last_updated_at cursor
last_updated_at cursorBatch stores the last successful cursor value internally.
At each run, Batch fetches only rows where:
last_updated_atis greater than the last stored cursor
This makes sync runs faster, more scalable, and more cost-efficient.
For events, last_updated_at should reflect when the row was inserted into the table, not when the event occurred (event_time). Do not backfill or modify last_updated_at after insertion.
4.2 Inserts and deletes
Incremental syncs capture:
✅ new event rows (inserts)
They do not capture:
❌ deletions — events sent to Batch are immutable; they cannot be removed via Cloud Sync
4.3 Best practices for reliable incremental syncs
To avoid missing events:
Set
last_updated_atat insertion time and never modify it afterwardsUse a View if you need to rename columns or apply type conversions
Index on
last_updated_atfor large tables
5) Test and enable your Sync
Before enabling the schedule:
Run a test sync
Verify:
Events are created on the correct profiles
event_timeis set correctly (or defaults to reception time as expected)date__andurl__fields are interpreted correctlyObject attributes are correctly stringified
Once enabled, Batch automatically handles batching and retries.
Last updated

