Signals for SFMC Journey Builder
Wunderkind captures and processes on-site behavioral data to determine the highest-priority campaign a visitor is eligible for during a session. Starting with real-time event collection, each visit is evaluated against your active campaigns in priority order, triggering a single signal that reflects the visitor's highest-intent action. Learn more about how signals work, here.
In our help center docs, you will also find details regarding access and permissions, integration components provided by Wunderkind, and client-owned integration components.
This document provides a more detailed, technical view of the integration components for reference.
Wunderkind Naming Convention
| Campaign Name | SFMC Asset Name [Data Extension, Journey, Entry Event] |
|---|---|
| Cart Abandonment | wknd_email_cartabandonment |
| Product Abandonment | wknd_email_prodabandonment |
| Category Recap | wknd_email_categoryrecap |
| Low Stock | wknd_email_lowstock |
| Back in Stock | wknd_email_backinstock |
| Price Drop | wknd_email_pricedrop |
Sendable Data Extensions
Wunderkind will create the sendable Data Extensions required to support each journey. These Data Extensions store the event data used to personalize and send campaign emails. They will be located in Contact Builder under the Data Extensions tab in a Wunderkind folder.
For existing clients migrating to SFMC Journey Builder, data extensions will be located in a Wunderkind Signals folder within your existing Wunderkind folder (if applicable).
Data Extension Schema
For existing clients migrating to SFMC Journey Builder, your schema may differ to support your existing implementation.
Field Name | Type | Length | Nullable | Context |
|---|---|---|---|---|
SubscriberKey | Text | 254 | No |
|
EmailAddress | Email Address | 254 | No | Recipient plain text email |
Origin | Test | 254 | Yes | wunderkind |
DataOnly | Text | 50 | Yes | Y |
UserType | Text | 254 | Yes | Prospect - Customer |
SendDate | Text | No set length | No | Date of signal, MM/DD/YYYY HH:MM:SS |
WkOpen | Text | No set length | Yes |
|
WkPurpose | Text | 254 | Yes |
|
WkChannel | Text | 50 | Yes | email -or- text |
WKCouponCode | Text | 254 | Yes |
|
WKCouponPurpose | Text | 254 | Yes |
|
WkCartReplenUrl | Text | No set length | Yes |
|
WkEventId | Text | 100 | Yes |
|
WkCategoryUrl | Text | No set length | Yes |
|
Items | Text | No set length | Yes |
|
Data Extension Settings
- Type: Standard
- Used for Sending
- Used for Testing
- Data Retention Policy: 15 Days
- Delete Data: Individual Records
- This offers a buffer for review, troubleshooting, or handling potential delays in processing while adhering to data cleanliness best practices.
- SUBSCRIBER RELATIONSHIP: SubscriberKey relates to Subscribers on Subscriber Key
Journey Entry Events
Wunderkind will configure a Journey Entry Event for each journey, with a dedicated data extension for each. What this looks like in practice:
If you are running a Cart Abandonment Series, Wunderkind will build wknd_email_cartabandonment data extension, journey and entry event source specifically for cart abandonment.
The entry event will not include any filter criteria at the event level. Filters will be applied at the journey level if applicable.
Cross-Campaign Priority
For behavioral campaigns, a priority framework is applied to ensure the following behavior
- If a user is in journey, then goes back to the site and takes a higher-intent action, they'll always receive the higher-priority journey. The configuration will skip the remaining emails in the current journey.
- If a user is in a journey, then goes back to the site and takes a lower-intent action, the configuration will prevent their entry into the lower-priority journey.
We implement this in SFMC using a cross_campaign_priority_email data extension to act as a centralized control table that enforces cross-campaign prioritization logic across abandonment journeys. It stores a contact’s current priority state to determine eligibility, prevent lower-intent interruptions, and allow higher-intent overrides
Campaign Priority Data Extension Details
- Name: cross_campaign_priority_email
- External Key: cross_campaign_priority_email
- Type: Standard
- Used for Sending
- Used for Testing
- Data Retention Policy: 90 Days
- Delete Data: Individual Records
- SUBSCRIBER RELATIONSHIP: SubscriberKey relates to Subscribers on Subscriber Key
| Field Name | Type | Length | Nullable | Context |
|---|---|---|---|---|
| SubscriberKey | Text | 254 | No | PrimaryKey |
| EmailAddress | Email Address | 254 | No | |
| Journey | Text | 254 | Yes | Name of active or completed Journey |
| PriorityRank | Number | No | Priority rank of the corresponding Journey | |
| LastUpdated | Date | No | Date contact was last updated in Data Extension | |
| Status | Text | 100 | Yes | Contact's current status on the corresponding Journey |
Contact Model Link
Wunderkind will link this data extension to your Contact Model so its data is available in Journey Builder in real time. This is done in Data Designer by creating an attribute group called Wunderkind Email Campaign Priority and establishing a one-to-one relationship between the data extension’s Subscriber Key and the Contact Key.
See how this association is used in each journey in the campaign-specific breakdown below.
API Endpoints & Payloads
Contact Key
Wunderkind triggers a Journey entry event via the REST Interaction Events API. This payload requires a ContactKey for the email recipient. In SFMC, the ContactKey is a unique, customer-generated identifier for a Contact. We offer 2 options for how to generate the ContactKey to use in the Interaction Event Payload, including:
- Lookup ContactKey before sending (Recommended/Default):
- If a Contact with a matching email address is found, the ContactKey is used as the ContactKey and SubscriberKey in the signals payload.
- If no match is found, the ContactKey will be generated using the email address and optional prefix/suffix and hashing rules. If no prefix/suffix or hashing rules are configured, the unaltered email address will be used as the ContactKey.
- Use plaintext Email Address:
- We will skip the REST lookup for the ContactKey and use the plaintext email as the ContactKey.
- Use a configured value:
- We will skip the REST lookup for the ContactKey and will generate the ContactKey using the configuration rules.
- Options include:
- HashSubscriberKey > generates a
sha256of the email address. - SubscriberKeyPrefix > Supply a string value to prefix the generated ContactKey.
- SubscriberKeySuffix > Supply a string value to suffix the generated ContactKey.
- HashSubscriberKey > generates a
Lookup ContactKey
MaximumCount is set to 1, so that only the top result (the newest contactKey created for that user) is returned in the contactKeyDetails array to be used
POST /contacts/v1/addresses/email/search HTTP/1.1
Host: {tenantURL}.rest.marketingcloudapis.com
Content-Type: application/json
Authorization: ••••••
{
"channelAddressList":["{email_address}"],
"maximumCount": 1
}Insert subscribers into a journey synchronously
Upon successful submission, the following occurs:
- A record containing the ContactKey and associated signal data is written to the Journey’s Event Data Extension.
- The contact is injected into the configured Journey entry source.
- If the contact doesn't exist at the time of entry, a new contact record is created in Contact Builder using the provided ContactKey.
JSON Parameters
- ContactKey: The unique ID of a subscriber or a contact.
- The value of ContactKey and SubscriberKey will be the same
- EventDefinitionKey: The unique ID of the journey entry event.
- Data: User and session-specific data
POST /interaction/v1/events HTTP/1.1
Host: <tenantURL>.rest.marketingcloudapis.com
Content-Type: application/json
Authorization: Bearer <access_token>
{
"ContactKey": "<ContactKey>",
"EventDefinitionKey": "wknd_email_cartabandonment",
"Data": {
"EmailAddress": "[email protected]",
"SubscriberKey": "<ContactKey>",
"Origin": "wunderkind",
"DataOnly": "Y",
"UserType": "prospect",
"WkOpen": "https://ibx1.net/ibx/em/opn/5557399f?x2=bBnltxh8Y6e1EDklG4bgQpw00CdMeRb0hxKaBvVVMsZ90l1eJtS16FZfRwBooTEuNi0yvvNk2kHa_pGzvfE-r1nyxB0ezGJtpao--6D6VtRi3LYdF6BR0BL3So0JARh5R_2ZKND7jgdVoYyq1gE5_DwJu_6Q5EwmI8zlrA97s8M,",
"WkPurpose": "cart abandonment",
"WkChannel": "email",
"WkCouponCode": "",
"WkCouponPurpose": "",
"WkCartReplenUrl": "",
"SendDate": "01/02/2006 15:04:06",
"Items": [
{
"WkCopy": "Lorem ipsum dolor sit amet",
"WkId": "product_1",
"WkImageUrl": "https://assets.bounceexchange.com/assets/uploads/users/2518/wknd/ei/2022/test1.png",
"WkUrl": "https://ibx1.net/ibx/rd2/example1"
},
{
"WkCopy": "Lorem ipsum dolor sit amet consectetur",
"WkId": "product_2",
"WkImageUrl": "https://assets.bounceexchange.com/assets/uploads/users/2518/wknd/ei/2022/test5.png",
"WkUrl": "https://ibx1.net/ibx/rd2/example2"
}
]
}
}POST /interaction/v1/events HTTP/1.1
Host: <tenantURL>.rest.marketingcloudapis.com
Content-Type: application/json
Authorization: Bearer <access_token>
{
"ContactKey": "<ContactKey>",
"EventDefinitionKey": "wknd_email_prodabandonment",
"Data": {
"EmailAddress": "[email protected]",
"SubscriberKey": "<ContactKey>",
"Origin": "wunderkind",
"DataOnly": "Y",
"UserType": "prospect",
"WkOpen": "https://ibx1.net/ibx/em/opn/5557399f?x2=bBnltxh8Y6e1EDklG4bgQpw00CdMeRb0hxKaBvVVMsZ90l1eJtS16FZfRwBooTEuNi0yvvNk2kHa_pGzvfE-r1nyxB0ezGJtpao--6D6VtRi3LYdF6BR0BL3So0JARh5R_2ZKND7jgdVoYyq1gE5_DwJu_6Q5EwmI8zlrA97s8M,",
"WkPurpose": "product abandonment",
"WkChannel": "email",
"WkCouponCode": "",
"WkCouponPurpose": "",
"SendDate": "01/02/2006 15:04:06",
"Items": [
{
"WkCopy": "Lorem ipsum dolor sit amet",
"WkId": "product_1",
"WkImageUrl": "https://assets.bounceexchange.com/assets/uploads/users/2518/wknd/ei/2022/test1.png",
"WkUrl": "https://ibx1.net/ibx/rd2/example1"
},
{
"WkCopy": "Lorem ipsum dolor sit amet consectetur",
"WkId": "product_2",
"WkImageUrl": "https://assets.bounceexchange.com/assets/uploads/users/2518/wknd/ei/2022/test5.png",
"WkUrl": "https://ibx1.net/ibx/rd2/example2"
}
]
}
}POST /interaction/v1/events HTTP/1.1
Host: <tenantURL>.rest.marketingcloudapis.com
Content-Type: application/json
Authorization: Bearer <access_token>
{
"ContactKey": "<ContactKey>",
"EventDefinitionKey": "wknd_email_categoryrecap",
"Data": {
"EmailAddress": "[email protected]",
"SubscriberKey": "<ContactKey>",
"Origin": "wunderkind",
"DataOnly": "Y",
"UserType": "prospect",
"WkOpen": "https://ibx1.net/ibx/em/opn/5557399f?x2=bBnltxh8Y6e1EDklG4bgQpw00CdMeRb0hxKaBvVVMsZ90l1eJtS16FZfRwBooTEuNi0yvvNk2kHa_pGzvfE-r1nyxB0ezGJtpao--6D6VtRi3LYdF6BR0BL3So0JARh5R_2ZKND7jgdVoYyq1gE5_DwJu_6Q5EwmI8zlrA97s8M,",
"WkPurpose": "category recap",
"WkChannel": "email",
"WkCouponCode": "",
"WkCouponPurpose": "",
"WkCategoryUrl": "https://www.wunderkind.co/",
"SendDate": "01/02/2006 15:04:06",
"Items": [
{
"WkCopy": "Lorem ipsum dolor sit amet",
"WkId": "product_1",
"WkImageUrl": "https://assets.bounceexchange.com/assets/uploads/users/2518/wknd/ei/2022/test1.png",
"WkUrl": "https://ibx1.net/ibx/rd2/example1"
},
{
"WkCopy": "Lorem ipsum dolor sit amet consectetur",
"WkId": "product_2",
"WkImageUrl": "https://assets.bounceexchange.com/assets/uploads/users/2518/wknd/ei/2022/test5.png",
"WkUrl": "https://ibx1.net/ibx/rd2/example2"
}
]
}
}- UserType: "prospect" | "customer"
- Items:
- Wunderkind sends the single highest-priority campaign a visitor is eligible for during a given visit. The Items array contains the item data associated with that campaign for that visit.
- This array is supported by the SFMC event payload structure and is used for item-level personalization in the journey.
- The item-level metadata included in
Itemsis derived from the data tracked on site via Wunderkind-owned event tracking or webSDK.- WkCopy: Item Copy
- WkId: Item Id
- WkImageUrl: Item Image URL
- WkUrl: Item URL
- Wunderkind sends the single highest-priority campaign a visitor is eligible for during a given visit. The Items array contains the item data associated with that campaign for that visit.
Updated 7 days ago