On this page: Use the Decisioning Migration Service API to move Decision management objects between sandboxes with automated dependency analysis and rollback support, so you can transition decisioning content across environments while preserving data integrity.
The Decisioning Migration Service API enables you to migrate Decision management objects from one sandbox to another. The migration process runs as asynchronous workflows that include dependency analysis, execution, and optional rollback capabilities.
This API allows you to seamlessly transition your decisioning content between environments while maintaining data integrity and relationships.
To learn about the benefits and capabilities of Decisioning compared to Decision management, refer to this page.
Capabilities capabilities
The Decisioning Migration Service API provides the following capabilities:
- Dependency analysis - Identify all required dependencies between source and target sandboxes, including attributes, segments, and dataset requirements.
- Flexible migration scope - Run migrations at sandbox, offer, or decision level based on your needs.
- Rollback support - Revert a completed migration if issues are discovered during validation.
Prerequisites prerequisites
Required permissions permissions
To use the Migration API, you need appropriate permissions in both the source and target sandboxes:
Source sandbox - Read access to Decision management objects
Target sandbox - Create and edit access to Decisioning objects
Typical permissions include:
- Manage / View Decisioning
- Manage / View Decisions
- Manage Offers
- Manage Ranking Strategies
- Manage Campaigns (if migrating campaign-related artifacts)
- Manage / View Datastreams (if creating a datastream)
- Manage / View Schemas
Prepare your target sandbox target-sandbox-preparation
Before running a migration, ensure your target sandbox is properly configured:
- Attributes - Verify that required profile attributes and context attributes exist in the target sandbox, or prepare mappings for them.
- Segments - Ensure required segments exist in the target sandbox, or plan to map them using namespace and ID.
- Dataset - Identify a dataset name to use for the migration (
dependency.datasetName). - Datastream - Decide whether the migration should create a datastream (
createDataStream).
For more information about sandbox management, refer to Use and assign sandboxes.
Cross-Sandbox Migration Prerequisites cross-sandbox-prerequisites
When source sandbox ≠ target sandbox, the following items are required:
- Profile Attributes - Must exist in target sandbox or have pre-defined mappings
- Segment IDs - Must be pre-created in target sandbox with old→new ID mappings
- Identity Mapping - Must be configured for consistent identity resolution
API basics api-basics
Base URL base-url
Use the following base URL:
- Production:
https://decisioning-migration.adobe.io
Authentication authentication
All API requests require the following headers:
Authorization: Bearer <IMS_ACCESS_TOKEN>x-gw-ims-org-id: <IMS_ORG_ID>Content-Type: application/json
For detailed instructions on setting up authentication, refer to the Journey Optimizer authentication guide.
Migration workflow migration-workflow
The migration process consists of two main steps: analyzing dependencies and executing the migration. Follow these steps to ensure a successful migration.
Step 1: Analyze dependencies analyze-dependencies
Before migrating, use the dependency workflow to identify what needs to be mapped from Decision management to Decisioning in your target sandbox. This analysis helps you understand the relationships between objects and prepare the necessary mappings.
Create a dependency workflow create-dependency-workflow
Use the following API call to create a dependency analysis workflow.
API format
POST /workflows/generate-dependencies
Sandbox-level dependency (recommended first)
Start with a sandbox-level analysis to get a complete view of all dependencies:
curl --request POST \
--url "https://decisioning-migration.adobe.io/workflows/generate-dependencies?request-level=sandbox" \
--header "Authorization: Bearer <IMS_ACCESS_TOKEN>" \
--header "x-gw-ims-org-id: <IMS_ORG_ID>" \
--header "Content-Type: application/json" \
--data '{
"imsOrgId": "<IMS_ORG_ID>",
"sourceSandboxDetails": { "sandboxName": "<SOURCE_SANDBOX_NAME>" },
"targetSandboxDetails": { "sandboxName": "<TARGET_SANDBOX_NAME>" }
}'
Offer-level dependency
To analyze dependencies for specific offers only, call the same endpoint with request-level=offer in the query string and provide an offersList array in the body with the offer IDs you want to analyze.
Decision-level dependency
To analyze dependencies for specific decisions only, use request-level=decision in the query string and provide a decisionsList array in the body with the decision IDs you want to analyze.
Check dependency workflow status poll-dependency-status
Poll the dependency workflow to check when the analysis is complete.
API format
GET /workflows/generate-dependencies/{id}
Request
curl --request GET \
--url "https://decisioning-migration.adobe.io/workflows/generate-dependencies/<WORKFLOW_ID>" \
--header "Authorization: Bearer <IMS_ACCESS_TOKEN>" \
--header "x-gw-ims-org-id: <IMS_ORG_ID>"
When the status field shows Completed, the dependency analysis is ready. Use the workflow output to build your migration dependency mappings:
- profileAttributes - Maps source profile attributes to target profile attributes
- contextAttributes - Maps source context attributes to target context attributes
- segments - Maps each source segment key to a target segment identifier (
{namespace, id}) - datasetName - The target Experience Event dataset used for the migration. It must be attached to a datastream that is enabled for Journey Optimizer Edge (Web SDK) calls; its schema is used to add the migrated context attributes.
You supply these mappings in the dependency object of the migration request in Step 2.
Step 2: Execute the migration execute-migration
Once you have analyzed the dependencies and prepared your mappings, you can execute the migration.
Create a migration workflow create-migration-workflow
Use the dependency mappings from Step 1 to configure and execute your migration.
API format
POST /workflows/migration
Sandbox-level migration
To migrate all decisioning objects from one sandbox to another:
curl --request POST \
--url 'https://decisioning-migration.adobe.io/workflows/migration?request-level=sandbox' \
--header 'Authorization: Bearer <IMS_ACCESS_TOKEN>' \
--header 'Content-Type: application/json' \
--header 'x-gw-ims-org-id: <IMS_ORG_ID>' \
--data '{
"imsOrgId": "<IMS_ORG_ID>",
"sourceSandboxDetails": { "sandboxName": "<SOURCE_SANDBOX_NAME>" },
"targetSandboxDetails": { "sandboxName": "<TARGET_SANDBOX_NAME>" },
"createDataStream": true,
"dependency": {
"profileAttributes": {
"sourceAttr1": "targetAttr1"
},
"segments": {
"sourceSegmentKey1": {
"namespace": "<TARGET_SEGMENT_NAMESPACE>",
"id": "<TARGET_SEGMENT_ID>"
}
},
"contextAttributes": {
"sourceCtx1": "targetCtx1"
},
"datasetName": "<TARGET_DATASET_NAME>"
}
}'
Offer-level migration
To migrate specific offers only, use request-level=offer in the query string and add an offersList array to the body:
"offersList": ["offer-id-1", "offer-id-2"]
Decision-level migration
To migrate specific decisions only, use request-level=decision in the query string and add a decisionsList array to the body:
"decisionsList": ["decision-id-1", "decision-id-2"]
Request fields
- request-level (query) - Migration scope:
sandbox,offer, ordecision. - imsOrgId (required) - Your IMS Org ID.
- sourceSandboxDetails.sandboxName (required) - Source sandbox that holds the Decision management entities.
- targetSandboxDetails.sandboxName (required) - Target sandbox where the Decisioning entities are created.
- dependency.datasetName (required) - Target Experience Event dataset. It must be attached to a datastream enabled for Journey Optimizer Edge (Web SDK) calls; its schema is used to add the migrated context attributes.
- createDataStream -
truecreates a new Journey Optimizer-enabled datastream;falsereuses the one already attached to the dataset independency.datasetName. - dependency.profileAttributes - Map of source → target profile attributes.
- dependency.contextAttributes - Map of source → target context attributes.
- dependency.segments - Map of source segment key → target segment (
{namespace, id}). - offersList[] / decisionsList[] - The offer or decision IDs to migrate; required when
request-levelisofferordecisionrespectively.
Monitor migration status poll-migration-status
Poll the migration workflow to track its progress.
API format
GET /workflows/migration/{id}
Request
curl --request GET \
--url "https://decisioning-migration.adobe.io/workflows/migration/<WORKFLOW_ID>" \
--header "Authorization: Bearer <IMS_ACCESS_TOKEN>" \
--header "x-gw-ims-org-id: <IMS_ORG_ID>"
Migration results
When the status field shows Completed, the migration was successful. The workflow result includes:
- Mappings of migrated objects
- Any warnings encountered during migration
When the status field shows Failed, review the errors[] array and result.error field for details about what went wrong.
Every workflow (dependency, migration, and rollback) returns the same resource fields:
- id - Workflow identifier (UUID); poll its status with the matching
GET /{id}. - status - Lifecycle state:
New,Running,Completed, orFailed. - result - Present on
Completed; the workflow output (for example, mappings of migrated objects and any warnings). - errors[] - Present on
Failed; structured error details (see alsoresult.error). - _links.self - URL of the workflow resource.
Validate your migration validate-migration
After the migration completes successfully, verify that all objects were migrated correctly.
Validation checklist validation-checklist
-
Segments - Verify that all referenced segments resolve correctly in the target sandbox according to your mappings.
-
Attributes - Confirm that all profile attributes and context attributes exist in the target sandbox and are mapped correctly.
-
Decisioning objects - Review migrated objects in the Journey Optimizer user interface:
- Offers (decision items)
- Eligibility rules
- Ranking formulas
- Selection strategies
- Decision policies
-
Datastream testing - If a datastream was created, test runtime delivery using the Edge Interact API.
Example test-runtime-delivery
If your migration created a datastream, you can test offer delivery using the following example:
curl --request POST \
--url "https://edge.adobedc.net/ee/or2/v1/interact?configId=<DATASTREAM_ID>" \
--header "Content-Type: application/json" \
--header "x-request-id: <uuid>" \
--data '{ "events": [ ... ] }'
Rollback a migration rollback
If you discover issues during validation, you can roll back a completed migration to restore the target sandbox to its previous state.
Create a rollback workflow create-rollback-workflow
Initiate a rollback by creating a rollback workflow that references the migration you want to revert.
API format
POST /workflows/rollback
Request
curl --request POST \
--url "https://decisioning-migration.adobe.io/workflows/rollback" \
--header "Authorization: Bearer <IMS_ACCESS_TOKEN>" \
--header "x-gw-ims-org-id: <IMS_ORG_ID>" \
--header "Content-Type: application/json" \
--data '{ "rollbackWorkflowId": "<MIGRATION_WORKFLOW_ID>" }'
Replace <MIGRATION_WORKFLOW_ID> with the ID of the migration workflow you want to roll back.
Monitor rollback status poll-rollback-status
Poll the rollback workflow to track its progress.
API format
GET /workflows/rollback/{rollbackWorkflowId}
Request
curl --request GET \
--url "https://decisioning-migration.adobe.io/workflows/rollback/<ROLLBACK_WORKFLOW_ID>" \
--header "Authorization: Bearer <IMS_ACCESS_TOKEN>" \
--header "x-gw-ims-org-id: <IMS_ORG_ID>"
Handle concurrent workflows handle-concurrency
The Migration API allows only one workflow to run at a time per organization. If you attempt to create a new workflow while another is in progress, you will receive a 409 Conflict error response (“A workflow is already in progress…”).
In this case, wait for the in-progress workflow to complete, or retrieve the workflow ID and poll its status. Once the current workflow finishes, you can create a new one.
Migration scope and coverage migration-scope
Understanding the scope of the migration helps you plan and validate your transition from Decision management to Decisioning. This section outlines what is covered by the migration process and what requires manual action.
In-Scope: What is covered in-scope
The Migration API handles the following items and capabilities:
- Use cases - Only inbound/Edge decisioning use cases are in scope. Outbound or OD in Journey Optimizer Email channel migration are supported but require manual updates.
- Code-Based Experience Campaigns - Automatically created during migration, one Campaign per migrated decision scope in your target sandbox.
- Channel Configuration/Surface - Channel configurations/surfaces created per Decision management placement, ensuring proper routing of decisioning responses.
- Offer content types - Offers are migrated only if their content type is JSON or Text. Other content types require manual recreation.
- Offer characteristics - Preserved in the
offer_item_custom_attributesfield group on the “Personalized Offer Items – Experience Decisioning” schema, maintaining custom metadata. - Context attributes - Added to the Experience Event schema in the
custom_context_attributesfield group for tracking and personalization. - Decision scopes - One Decision management Decision Scope maps to one Selection Strategy + one Decision Policy + one Campaign in Decisioning, ensuring proper entity hierarchy.
- API-only eligibility rules - Eligibility rules created via API only (not in Decision management UI) are migrated and remain API-only in Decisioning. UI-created rules are also migrated.
Out-of-Scope: What is not covered or requires manual action out-of-scope
The following items require manual action or are not supported by the migration tooling:
- Decisioning Placements - No Placements are created by the migration tooling. You must create these manually in Decisioning before or after migration based on your architecture.
- Placement-level capping - Placement-level frequency capping is not migrated.
- Non-JSON/Text offer content - Offers with content types other than JSON or Text (e.g., HTML, images) are NOT migrated and require manual recreation in Decisioning.
- Profile attributes and segments - Profile attributes and segment memberships are NEVER created or edited by migration tooling. These must already exist in your target sandbox before running the migration.
- Segment ID mapping - Segment IDs must be pre-created in the target sandbox. You must supply an old→new ID mapping in the Migration API request for segment resolution.
- Data collection code changes - Client-side and server-side event tracking code changes are NOT automated. Your implementation team must update event collection to use Decisioning request/response formats and decisioning event schemas.
Entity mapping reference entity-mapping
When migrating from Decision management to Decisioning, entities are mapped according to the following table. The mappings include the primary Decisioning entities and additional associated entities created or used during migration.
Decision management to Decisioning Entity Mapping
Naming Conventions
The migration process applies naming conventions using the ExD_ prefix to ensure consistency and prevent naming conflicts.
<offerName>ExD_<offerName><ruleName>ExD_<ruleName><formulaName>ExD_<formulaName><collectionName>ExD_<collectionName>_<placementName><decisionName>ExD_<decisionName>_selection_strategy_<index><decisionName>ExD_<decisionName>_<placementName><offerName>ExD_<offerName>_<placementName>_<index><placementName>ExD_<placementName> (spaces/dots converted to underscores)<sourceName>, <targetName>ExDMigration_<sourceName>_<targetName><decisionName>, <placementName>Campaign for <decisionName> : <placementName>Additional Attributes
Request and response model request-response-model
When migrating from Decision management to Decisioning, your application code must be updated to use the new request and response formats. Both systems use the Edge Network endpoint, but with different payload structures and field names.
Decision management Edge Request (Current) dm-request
The current Decision management Edge request follows this structure:
Endpoint:
POST https://edge.adobedc.net/ee/v2/interact
Headers:
Authorization: Bearer <IMS_ACCESS_TOKEN>x-api-key: <API_KEY>(from Developer Console)x-gw-ims-org-id: <IMS_ORG_ID>(format:{ORG_ID}@AdobeOrg)x-request-id: <UNIQUE_REQUEST_ID>(for tracing and deduplication)Content-Type: application/vnd.adobe.xdm+json; schema="…/decision-request;version=1.0"Accept: application/vnd.adobe.xdm+json; schema="…/decision-response;version=1.0"x-sandbox-name: <SANDBOX_NAME>(e.g., prod, dev)
Request Body Parameters:
-
xdm:dryRun(true/false) - Test requests without polluting reporting -
xdm:propositionRequests[]- Array of decision requests:activityId- Decision activity identifierplacementId- Placement identifieritemCount- Maximum number of offers to return
-
xdm:profiles[].xdm:identityMap- Identity mapping (email, ECID, etc.) -
xdm:validateContextData- Strict context data validation flag -
xdm:responseFormat.xdm:includeContent- Include actual content vs. IDs only
Example request body:
{
"xdm": {
"dryRun": false,
"propositionRequests": [
{ "activityId": "<ACTIVITY_ID>", "placementId": "<PLACEMENT_ID>", "itemCount": 3 }
],
"profiles": [
{ "identityMap": { "ECID": [ { "id": "<ECID>", "primary": true } ] } }
],
"validateContextData": true,
"responseFormat": { "includeContent": true }
}
}
decisionScopes carrying activityId and placementId).Decisioning Edge Request (After Migration) decisioning-request
After migration, use the Decisioning request format via the same Edge Network endpoint.
Endpoint:
POST https://edge.adobedc.net/ee/v2/interact
Key Request Fields:
query.identity.fetch- Array of identity types to resolve (e.g.,["ECID"])event.xdm.environment.type- Environment type:"browser","app", or"server"event.xdm.environment.browserDetails- Browser metadata (viewportWidth,viewportHeight,userAgent)event.xdm.identityMap- Same identity mapping as Decision managementevent.xdm.timestamp- ISO 8601 timestampquery.personalization.surfaces- Array of target surfaces (e.g.,["web://site.com/homepage"]) — replacesdecisionScopequery.personalization.schemas- Content schemas to return (e.g.,["json-content-item", "html-content-item"])data.__adobe.ajo.allowDuplicateDecisionItems- Deduplication control (defaults totrue; setfalseso an item that qualifies for multiple surfaces is returned only once, with the other surfaces receiving a fallback/empty item). Replaces the Decision managementallowDuplicatePropositions.data.__adobe.ajo.dryRun- Test flag; suppresses feedback events for both reporting and capping counters. Replaces the Decision managementxdm:dryRun. Remove before production.
Example request body (server-side):
{
"events": [
{
"query": {
"identity": { "fetch": ["ECID"] },
"personalization": {
"surfaces": ["web://my-web/IP_NLI_HP_GET_LOAN_WIDGET"],
"schemas": [
"https://ns.adobe.com/personalization/json-content-item",
"https://ns.adobe.com/personalization/html-content-item"
]
}
},
"xdm": {
"eventType": "decisioning.propositionFetch",
"environment": {
"type": "browser",
"browserDetails": { "viewportWidth": 1280, "viewportHeight": 900, "userAgent": "<USER_AGENT>" }
},
"identityMap": {
"ECID": [ { "id": "<ECID>", "authenticatedState": "ambiguous", "primary": true } ]
},
"timestamp": "2025-09-08T12:00:00.000Z"
},
"data": {
"__adobe": { "ajo": { "allowDuplicateDecisionItems": false } }
}
}
],
"meta": {
"state": {
"domain": "my-web",
"cookiesEnabled": true,
"entries": [
{ "key": "kndctr_<ORG>_AdobeOrg_identity", "value": "<identity-cookie>" },
{ "key": "kndctr_<ORG>_AdobeOrg_cluster", "value": "<cluster-cookie>" }
]
}
}
}
Decisioning Edge Response decisioning-response
The Decisioning response contains multiple handles organized by concern type: personalization:decisions (the offers), locationHint:result, and state:store (the cookies to persist).
Response Structure:
{
"requestId": "<REQUEST_ID>",
"handle": [
{
"type": "personalization:decisions",
"eventIndex": 0,
"payload": [
{
"id": "103ae599-e6d8-4631-baf3-51dd8c6ed4c1",
"scope": "web://my-web/IP_NLI_HP_GET_LOAN_WIDGET",
"scopeDetails": {
"decisionProvider": "AJO",
"correlationID": "<CORRELATION_ID>",
"characteristics": {
"eventToken": "<base64 message-level event token>",
"subPropositions": "<base64-encoded array of decision items>"
},
"rank": 1,
"activity": {
"id": "<campaignId>#<actionId>",
"priority": 0,
"matchedSurfaces": ["web://my-web/IP_NLI_HP_GET_LOAN_WIDGET"]
}
},
"items": [
{
"id": "36646bab-af1b-44c6-b632-bbfb9c357919",
"schema": "https://ns.adobe.com/personalization/json-content-item",
"data": { "content": "{ ...offer JSON... }" }
}
]
}
]
},
{
"type": "locationHint:result",
"payload": [
{ "scope": "EdgeNetwork", "hint": "ind1", "ttlSeconds": 1800 }
]
},
{
"type": "state:store",
"payload": [
{ "key": "kndctr_<ORG>_AdobeOrg_cluster", "value": "<cluster-cookie>", "maxAge": 1800 },
{ "key": "kndctr_<ORG>_AdobeOrg_identity", "value": "<identity-cookie>", "maxAge": 34128000 }
]
}
]
}
Key Response Fields:
handle[].type- Handle type (personalization:decisions,locationHint:result,state:store)payload[].id- Unique proposition instance ID — echo back on display/interact eventspayload[].scope- Surface URI the proposition was resolved forpayload[].scopeDetails.decisionProvider- Confirms engine isAJOpayload[].scopeDetails.correlationID- Links decision instance to serving eventpayload[].scopeDetails.rank/payload[].scopeDetails.activity- Rank and campaign/action metadata for the propositionpayload[].scopeDetails.characteristics.eventToken- Message-level tracking tokenpayload[].scopeDetails.characteristics.subPropositions- Base64-encoded array of the decision items; each item carries its own per-itemtoken. These per-item tokens are what you pass inpropositionAction.tokenson display/interact eventspayload[].items[].schema/payload[].items[].data.content- Content schema and actual offer content (JSON/HTML) to renderstate:storepayload - The identity and cluster cookies to persist and forward on subsequent requests (server-side)
The characteristics.subPropositions string base64-decodes to the array of served items, each with its per-item token:
[
{
"id": "1ae75277-8832-4c23-bbbc-09f01cfe6c8b",
"scope": "web://my-web/IP_NLI_HP_GET_LOAN_WIDGET",
"scopeDetails": { "decisionProvider": "EXD", "correlationID": "<CORRELATION_ID>-0", "rank": 1 },
"items": [
{ "id": "dps:<schema>:1be64ff83a612488", "name": "ExD_Personal Loan Offer", "score": 997.0, "token": "CLaefQnVLcLbCtzEXV3Jeg" },
{ "id": "dps:<schema>:1be6516838e1248c", "name": "ExD_Home Loan Offer", "score": 995.0, "token": "ALlB5KV1B0e+CpHoahi7Ew" },
{ "id": "dps:<schema>:1be650da3cd06e98", "name": "ExD_Auto Loan Offer", "score": 994.0, "token": "koJTRQcwFkR92AqbZ88ytQ" },
{ "id": "dps:<schema>:1be65612d5a1248d", "name": "ExD_Fallback Offer", "itemSelection": { "selectionDetail": { "selectionType": "fallback" } }, "token": "GHo4ow7h6iCzBOhYR1+6jg" }
]
}
]
Implementation patterns implementation-patterns
Decisioning supports three implementation approaches:
Client-Side Implementation (Web SDK / Mobile SDK) client-side
The Web SDK or Mobile SDK handles all requests and cookie management automatically. The SDK stores and forwards both identity and cluster cookies with each request.
Cookie handling: Automatic — Web SDK manages kndctr_<OrgId>_identity and kndctr_<OrgId>_cluster cookies.
Server-Side Implementation (Edge Network API) server-side
The application server POSTs directly to Edge Network and must manually manage cookie forwarding. The server extracts browser cookies from incoming requests and forwards them to Edge Network via meta.state.entries[], then returns cookies in the response.
Cookie handling: Manual — App server must extract cookies from browser request, forward to Edge Network in request body, and set in response. Cookies must be explicitly forwarded in meta.state.entries for identity consistency.
Hybrid Implementation hybrid
Combines server-side rendering (initial page load) with client-side SDK (subsequent interactions). The server renders initial content via Edge Network, then Web SDK takes over for subsequent personalization requests.
Cookie handling: Mixed — Server side requires manual cookie forwarding to Edge Network; client side handled automatically by Web SDK. Ensure identity tokens from server-side rendering are available to client-side SDK for consistent identity resolution.
Event tracking and data collection event-tracking
To properly attribute decisioning results, enable frequency capping, and power AI-based ranking optimization, you must implement event tracking using the Decisioning event schema.
Required Event Fields event-fields
Both eventType and _experience.decisioning.propositionEventType are required. If either is missing, the corresponding display/interact counter will not increment.
-
eventType- Specifies the event category:decisioning.propositionDisplay— Impression event (offer shown to user)decisioning.propositionInteract— Interaction event (user clicked or engaged with the offer)
-
_experience.decisioning.propositionEventType- Flags the event subtype. Include exactly one event-type key set to1(each value is1or0; do not set multiple event types to1in the same object):{ "display": 1 }— Impression event{ "interact": 1 }— Interaction event- If all of
display/interact/dismissare0— oreventTypeis any value other thandecisioning.proposition<Display|Interact|Dismiss>— the event is treated as a custom event.
-
_experience.decisioning.propositionAction.tokens[]- Per-item token(s) identifying which served item(s) to increment counters for:- Copy each item’s
tokenfrom the decodedsubPropositionsarray — notscopeDetails.characteristics.eventToken, which is a different, message-level token. - Pass the token exactly as received, unmodified.
- Interact events: provide exactly one token (the clicked item).
- Display events: optional — provide token(s) to increment specific items, or omit
tokensto increment the counter for all items insubPropositions.
- Copy each item’s
-
_experience.decisioning.propositions[]- Echo back the served proposition(s), includingid,scope, and the fullscopeDetailsfrom the response (which carriescharacteristics.subPropositionsand requiresdecisionProvider). You do not need to build an explicititems[]array.
Schema Requirements schema-requirements
Associate the Decisioning field group to your event dataset schema before migration:
-
In Experience Platform, open your event dataset schema
-
Add the
Experience Event - Proposition Detailsfield group -
Ensure the following fields are mapped:
_experience.decisioning.*fields_experience.decisioning.propositionAction.tokens_experience.decisioning.propositionEventType
Tracking Token Handling tracking-token
The tracking token must be handled according to these requirements:
- Per-item token drives the counters — the value(s) in
propositionAction.tokensare each served item’stokenfromsubPropositions, not the message-levelcharacteristics.eventToken. - Interact events — provide exactly one token (the clicked item).
- Display events — tokens are optional; omit to increment all items in
subPropositions, or provide specific tokens to increment only those items. - Do not modify the token — pass the value exactly as received; do not encode, parse, or alter it.
Decisioning Event Examples event-examples
Each example echoes back the served proposition (including its scopeDetails, which carries characteristics.subPropositions) and sets both eventType and propositionEventType. Counters increment against the items in subPropositions; propositionAction.tokens selects which items.
Display Events
Display events notify Decisioning when an offer is shown to a user. Provide the token(s) of the shown item(s), or omit tokens to increment the display counter for all items in subPropositions:
{
"header": {
"imsOrgId": "YOUR_ORG_ID",
"sandboxId": "sandbox-id",
"sandboxName": "sandbox-name",
"source": { "name": "ajo-inbound" }
},
"body": {
"xdmEntity": {
"identityMap": {
"ECID": [ { "id": "ecid-123", "primary": true } ]
},
"eventType": "decisioning.propositionDisplay",
"_experience": {
"decisioning": {
"propositionEventType": { "display": 1 },
"propositionAction": {
"id": "b96f842b-5dd9-4c55-9dae-647d96250028",
"tokens": ["CLaefQnVLcLbCtzEXV3Jeg", "ALlB5KV1B0e+CpHoahi7Ew"]
},
"propositions": [
{
"id": "103ae599-e6d8-4631-baf3-51dd8c6ed4c1",
"scope": "web://my-web/IP_NLI_HP_GET_LOAN_WIDGET",
"scopeDetails": {
"decisionProvider": "AJO",
"characteristics": {
"eventToken": "<base64 eventToken from response>",
"subPropositions": "<base64 subPropositions from response>"
}
}
}
]
}
}
}
}
}
Interact (Click) Events
Interact events track when a user clicks or engages with a displayed offer. You must provide exactly one token identifying the clicked item:
{
"header": {
"imsOrgId": "YOUR_ORG_ID",
"sandboxId": "sandbox-id",
"sandboxName": "sandbox-name",
"source": { "name": "ajo-inbound" }
},
"body": {
"xdmEntity": {
"identityMap": {
"ECID": [ { "id": "ecid-123", "primary": true } ]
},
"eventType": "decisioning.propositionInteract",
"_experience": {
"decisioning": {
"propositionEventType": { "interact": 1 },
"propositionAction": {
"id": "b96f842b-5dd9-4c55-9dae-647d96250028",
"tokens": ["CLaefQnVLcLbCtzEXV3Jeg"]
},
"propositions": [
{
"id": "103ae599-e6d8-4631-baf3-51dd8c6ed4c1",
"scope": "web://my-web/IP_NLI_HP_GET_LOAN_WIDGET",
"scopeDetails": {
"decisionProvider": "AJO",
"characteristics": {
"eventToken": "<base64 eventToken from response>",
"subPropositions": "<base64 subPropositions from response>"
}
}
}
]
}
}
}
}
}
Custom Events
A custom event uses a customer-defined eventType (any value other than decisioning.proposition<Display|Interact|Dismiss>) and sets all of display/interact/dismiss to 0 in propositionEventType (classified as OTHER). Custom events are decoded like display events (multi-token filtering) against subPropositions, and are evaluated via the configured PQL:
{
"header": {
"imsOrgId": "YOUR_ORG_ID",
"sandboxId": "sandbox-id",
"sandboxName": "sandbox-name",
"originalTimestamp": 1700000
},
"body": {
"xdmEntity": {
"identityMap": {
"ECID": [ { "id": "ecid-123", "primary": true } ]
},
"eventType": "add-to-cart",
"_experience": {
"decisioning": {
"propositionEventType": { "display": 0, "interact": 0, "dismiss": 0 },
"propositionAction": {
"id": "b96f842b-5dd9-4c55-9dae-647d96250028",
"tokens": ["CLaefQnVLcLbCtzEXV3Jeg"]
},
"propositions": [
{
"id": "103ae599-e6d8-4631-baf3-51dd8c6ed4c1",
"scope": "web://my-web/IP_NLI_HP_GET_LOAN_WIDGET",
"scopeDetails": {
"decisionProvider": "AJO",
"characteristics": {
"eventToken": "<base64 eventToken from response>",
"subPropositions": "<base64 subPropositions from response>"
}
}
}
]
}
}
}
}
}
These events enable frequency capping, out-of-the-box reporting, and AI-driven ranking optimization in Decisioning. For sending proposition events with the Web SDK, see Code-based experience: Decisioning implementations.
End-to-end Migration Process migration-process
-
Validate prerequisites — Ensure your target sandbox is prepared and all prerequisite dependencies are identified and ready before starting the migration (profile attributes, segment IDs, ID mapping).
-
Call the Migration API — Execute the Migration API to migrate Decision management objects to Decisioning using your prepared prerequisites and mappings.
-
Draft Decisioning entities generation — Tooling creates Campaigns, Decision Policies, Selection Strategies, Offer Items, etc. in Draft state per entity mapping. Review all generated Decisioning objects in the target sandbox. Validate naming, entity types, and references are correct. Nothing is customer-facing yet, Decision Management keeps serving live traffic.
-
Update client & server code — Implement required code changes to use the new Decisioning request/response formats and implement event tracking with required fields.
-
Activate & cutover — Activate your Decisioning objects (strategies, policies, campaigns, surfaces) and shift traffic away from Decision Management on your own timeline.
Related topics related-topics
- Migrate from Decision management to Decisioning - Understand the benefits and capabilities of migrating to Decisioning
- Get started with Decisioning
- Decisioning guardrails and limitations
- Get started with Decisioning APIs