Adobe Journey Optimizer
Datafly Signal delivers your first-party events to Adobe Journey Optimizer (AJO) by streaming XDM ExperienceEvents to the Adobe Experience Platform Edge Network Server API. Events flow through an Experience Platform datastream to Real-Time Customer Profile and any AJO journey listening for them, so you can trigger orchestrations and enrich profiles from the server without a client-side Web SDK collecting the same data twice.
Prerequisites
- An Adobe Experience Platform / Journey Optimizer organization with a configured sandbox.
- A datastream (Data Collection > Datastreams) whose target schema is an XDM ExperienceEvent class that includes the Web Details and Commerce Details field groups. Note its Datastream ID.
- An Adobe Developer Console project with an OAuth Server-to-Server credential, granting access to the Experience Platform Data Collection APIs. Note the Client ID and Client Secret and your IMS Organization ID (ends in
@AdobeOrg). - The identity namespaces you intend to match on (for example
EmailandECID) must exist in your sandbox.
Configuration
Signal authenticates to the Edge Network with an Adobe IMS access token. The token is short-lived (around 24 hours), so you must configure automatic rotation using your OAuth Server-to-Server credential.
| Field | Description |
|---|---|
| Datastream ID | The ID of the datastream that routes events to your sandbox, schema, and Journey Optimizer. |
| IMS Access Token | A current Adobe IMS bearer token from your OAuth Server-to-Server credential. Sent as Authorization: Bearer. |
| IMS Organization ID | Your Experience Cloud org ID (...@AdobeOrg). Sent as x-gw-ims-org-id. |
| API Key (Client ID) | The Client ID of your OAuth Server-to-Server credential. Sent as x-api-key. |
Configure in Signal
- In the Signal management UI, open Integrations and add Adobe Journey Optimizer.
- Paste your Datastream ID, IMS Access Token, IMS Organization ID, and API Key.
- Select the Default preset and attach it to a pipeline.
- Save. Signal begins delivering matching events as XDM ExperienceEvents.
API Endpoint
Signal sends events to the authenticated Edge Network collect endpoint:
POST https://server.adobedc.net/ee/v2/collect?datastreamId={DATASTREAM_ID}Headers:
Authorization: Bearer {IMS_ACCESS_TOKEN}
x-gw-ims-org-id: {IMS_ORG_ID}
x-api-key: {API_KEY}
Content-Type: application/jsonA successful request returns 202 Accepted (the event is queued for processing). Malformed payloads, an expired token, insufficient scope, or an unknown datastream return a 4xx and are not retried.
Identity Signals
AJO matches incoming events to Real-Time Customer Profiles using the XDM identityMap. The Default blueprint emits:
- Email — the customer’s email address, trimmed, lowercased, and SHA-256 hashed (Adobe’s standard hashed-email convention), marked as the primary identity.
- ECID — the Experience Cloud ID when available.
You can add further namespaces (for example CRMID) in the blueprint to match your AJO schema. Email is hashed by Signal before it leaves your infrastructure; raw email is never sent.
Event Mapping
Signal events are mapped to standard XDM eventType values. The page view and the e-commerce funnel are covered out of the box:
| Signal event | XDM eventType |
|---|---|
page | web.webpagedetails.pageViews |
Products Searched | commerce.searches |
Product List Viewed | commerce.productListViews |
Product Viewed | commerce.productViews |
Product Added | commerce.productListAdds |
Product Removed | commerce.productListRemovals |
Product Added to Wishlist | commerce.saveForLaters |
Checkout Started | commerce.checkouts |
Order Completed | commerce.purchases |
Example
A purchase tracked with Datafly.js:
datafly.track("Order Completed", {
order_id: "ORD-10042",
revenue: 39.98,
currency: "USD",
product_id: "HT105",
product_name: "The Big Floppy Hat",
price: 29.99,
quantity: 1
}, {
traits: { email: "shopper@example.com" }
});Signal delivers the following XDM ExperienceEvent to the Edge Network:
{
"events": [
{
"xdm": {
"eventType": "commerce.purchases",
"timestamp": "2026-06-06T14:09:20.859Z",
"identityMap": {
"Email": [
{ "id": "0c7e6a405862e402eb76a70f8a26fc732d07c32931e9fae9ab1582911d2e8a3b", "primary": true }
]
},
"commerce": {
"purchases": { "value": 1 },
"order": {
"purchaseID": "ORD-10042",
"priceTotal": 39.98,
"currencyCode": "USD"
}
},
"productListItems": [
{
"SKU": "HT105",
"name": "The Big Floppy Hat",
"priceTotal": 29.99,
"quantity": 1,
"currencyCode": "USD"
}
]
}
}
]
}Consent
When you map a canonical marketing-consent signal, Signal writes it to xdm.consents.marketing.preferred.val (y for granted, n otherwise). Because the standard Consents and Preferences field group is only valid on Profile schemas, your datastream’s ExperienceEvent schema must include a custom consent field group for this value to be accepted. If your schema does not carry consent, remove the consent mapping from the blueprint.
Testing
- Trigger an event on a page running your Signal pipeline (or use the Event Debugger in the management UI).
- Confirm Signal received a
202 Acceptedfrom the Edge Network. - In Experience Platform, use the datastream’s monitoring or Profile lookup to confirm the event landed and merged onto the expected profile.
- In Journey Optimizer, verify any journey using this event as its entry condition advanced as expected.
Troubleshooting
- 401 Unauthorized — the IMS access token is expired or invalid. Confirm token rotation is running and the token belongs to the credential whose Client ID you entered as the API Key.
- 403 Forbidden — the credential lacks the datastream’s collection scope, or the IMS Organization ID does not match the credential’s org.
- 404 Not Found — the Datastream ID is wrong or the datastream was deleted.
- 400 Bad Request — the XDM is malformed or references fields/eventTypes not present in your schema. XDM field names are case-sensitive (for example
web.webpagedetails.pageViewsfor the eventType butweb.webPageDetailsfor the object). Confirm your schema includes the Web Details and Commerce Details field groups. - Event accepted but no profile / journey — confirm the
identityMapnamespace you send (for exampleEmail) matches the identity your AJO journey and schema key on, and that the datastream forwards to Profile and AJO.