Experience Platform · XDM data model
Where do you store the orders?
Laura has been buying for four years. Marketing needs three audiences in Real-Time CDP based on her orders. Whether they can be built depends not on the rule, but on where the orders were modelled.
Example assumptions
Customer, orders and amounts are made up. The size of an order, about 2.5 KB, is an estimate.
Option 1 · Profile record
Orders array in the profile
An XDM Individual Profile class record with the orders nested. Everything in one record and easy to query. The limit is the size.
Option 2 · ExperienceEvents
Orders as ExperienceEvents
One event per order, on the profile timeline. It reacts to what just happened. History and changing statuses are its weak spot.
Option 3 · Federated Audience Composition
Orders in the warehouse with FAC
Snowflake or BigQuery tables. History stays in the warehouse: FAC queries it without copying transactions and only the audience is stored in AEP. It follows the scheduled refresh.
The recommendation
In the profile, only attributes that do not grow. Orders as events. The full history in the warehouse
It is not about picking one of the three options. They are combined, and each audience is built in the layer that handles it best. The profile record is the same size with 30 orders or 400.
- 01
Each order, one ExperienceEvent
For recent activity: abandoned cart, this month's purchase, recommendations in Target or AJO. Streaming segmentation and computed attributes of up to 6 months.
- 02
In the profile, bounded attributes
Summaries calculated outside AEP and sent with upsert when they change: _tenant.lifetimeSpend, _tenant.orderCount, _tenant.lastOrderDate, _tenant.openReturnAmount. Always the same fields.
- 03
The history, in the warehouse with FAC
For complex or one-off audiences nobody planned for. Federated Audience Composition builds them in Snowflake or BigQuery without copying the orders into AEP.
- 04
All three audiences work
This month's purchase, in minutes with streaming segmentation. Lifetime spend, with _tenant.lifetimeSpend. Open return, with _tenant.openReturnAmount updated through upsert.
Explore this decision
- What needs to leave the warehouse?
Ingestion, Federated Audience Composition and Data Mirror solve different problems. See what moves and what to check before choosing.