Bloomreach Engagement: Telltide Seed Address Guide
Place Telltide seeds in Bloomreach Engagement segments and scenarios.
Bloomreach Engagement (formerly Exponea) is a real-time customer data platform with a schema-less NoSQL architecture. Contacts are called "customers." All segmentation is dynamic, there are no static lists. Saving a Segmentation creates a new customer attribute that scenarios can reference. The most important constraints for seed management: customer hard IDs are case-sensitive (User@example.com and user@example.com are treated as different customers and can cause duplicates), and test emails from the scenario builder do not generate campaign events (opens, clicks) or affect analytics.
Quick reference
| Send type | Where to add seeds | Complexity |
|---|---|---|
| Scheduled (Email Campaign) | Create seed customer; target via inline filter condition (e.g., email equals seed email) | Low |
| Ongoing (Scenario) | Create seed customer; trigger entry via consent event, custom activity event, or date attribute | Medium |
1. Scheduled / one-off sends (Email Campaigns)
Bloomreach Engagement Email Campaigns are one-time sends. The audience is defined using inline customer and event filter conditions, not pre-built named segments as static audience pickers.
Where to add seed addresses
Simplest approach: add an internal_test_user boolean attribute to seed customer profiles, then add a condition to every campaign: internal_test_user = true (OR logic alongside the main audience filter). This ensures seeds are always included.
Non-technical path
For CRM managers who prefer the UI and CSV imports.
Add a seed customer manually
- Navigate to Data & Assets > Customers
- Click Add customer (or use the + button)
- Enter the seed email address as the customer's identifier
- Set the
emailattribute - Add
internal_test_user: trueas a custom boolean attribute - Grant consent for the relevant consent category (required to receive email sends)
- Save
Add seeds via CSV Import
- Navigate to Data & Assets > Imports > New import
- Upload a CSV with one row per seed:
registered,email,first_name,internal_test_user,consent_category - Map columns to customer attributes; set
registeredas the hard ID - For consent, include a consent column or grant consent separately via the UI or API
- Run the import. Imports are the recommended path for bulk seed loading; the Tracking API should not be used for large historical loads (fair use policy).
Add seeds via the Customer Acquisition Weblayer
If your site already uses the Bloomreach Customer Acquisition Weblayer for signups, you can submit the seed address through the live form so it picks up the same consent and attribute defaults as real subscribers. Set internal_test_user: true afterwards from the customer profile.
Include seeds in a Segmentation
To make seeds reusable across multiple campaigns, define a "Seeds" Segmentation:
- Navigate to Data & Assets > Segmentations > New segmentation
- Add a segment named "Seeds" with the filter
internal_test_user equals true - Save. Bloomreach creates a customer attribute (e.g.,
seeds_segmentation) that any campaign filter or scenario condition can reference.
Technical path
For engineers wiring up seeds through the Tracking API.
Create a seed customer
POST https://api.exponea.com/track/v2/projects/{projectToken}/customers
Authorization: Basic {{base64(api_key_id:api_secret)}}
Content-Type: application/json
{
"customer_ids": {
"registered": "seed@example.com"
},
"properties": {
"first_name": "Seed",
"last_name": "Monitor",
"email": "seed@example.com",
"internal_test_user": true,
"date_of_birth": "1990-04-15"
}
}
Base URL: Use the API base URL configured for your project (e.g., api.exponea.com or a project-specific host such as api-{cluster}.exponea.com). The exact host is shown in Project Settings > Access Management > API.
Authentication: Basic auth using API Key ID and API Secret from Project Settings > Access Management > API. Token auth (public) is for front-end tracking only; use Basic auth for server-side management calls.
registered: The hard ID used as the primary identifier. Using email as the registered hard ID is the most common pattern, but your Bloomreach project may use a different hard ID (e.g., internal database ID). Check your project's customer identification setup.
Project token: Found at Project Settings > Access Management > API > Project token.
Case sensitivity warning: Hard IDs are case-sensitive. Always normalize email addresses to lowercase before tracking. User@example.com and user@example.com create two separate customer profiles.
Add consent for the seed customer
Consent is required for the customer to receive email sends in the relevant consent category:
POST https://api.exponea.com/track/v2/projects/{projectToken}/customers/consents
Authorization: Basic {{base64(api_key_id:api_secret)}}
Content-Type: application/json
{
"customer_ids": {
"registered": "seed@example.com"
},
"consents": [
{
"category": "newsletter",
"action": "accept",
"valid_until": "unlimited",
"sources": {
"imported": true
}
}
]
}
Replace "newsletter" with your project's specific consent category name.
Batch creation for multiple seeds
Use Batch commands (up to 50 commands per request) to create or update several seed customers in a single call. For larger seed loads, prefer Data & Assets > Imports rather than scripting bulk Tracking API calls.
Including the seed in a Campaign
In the Campaign's audience definition step:
- Add a condition:
internal_test_user = true(or membership of the "Seeds" segment created above) - Set the condition with OR logic relative to the main audience conditions
- The seed customer receives the campaign alongside the main audience
Profile attributes required
Seeds need:
- Customer identifier (hard ID) set
emailattribute set to a deliverable inbox address- Consent granted for the campaign's consent category
- Values for any custom attributes referenced in email template personalization
Ensuring seeds receive the same version as real recipients
Dynamic content in email templates: Bloomreach email templates use a conditional logic system. The seed receives content based on its own attribute values. Set the seed's attributes to match the target recipient segment.
A/B split nodes in Scenarios: If the scenario uses an A/B split, the seed is assigned to one branch randomly. Use multiple seed customers to monitor all branches.
Custom recipient setting (validation only): During development, configure the scenario or campaign to redirect all test emails to your own inbox. This is for content validation before go-live; Telltide monitoring requires the seed to be in the live audience, not a redirected test recipient.
Gotchas
Frequency Policy can suppress sends. Bloomreach's Frequency Policy (Settings > Project settings > Campaigns > Privacy management > Frequency Policy) limits the number of messages a customer receives per time period. Seeds subject to the default frequency policy may not receive all sends. To exempt seed customers: create a separate frequency policy segment for internal_test_user = true with no limits, or use the custom recipient setting for testing.
Global Suppression List. Bloomreach maintains a project-wide custom suppression list (Settings > Email > Suppression lists). Addresses on this list receive no emails from the project regardless of consent or campaign settings. Verify seed addresses are not on the suppression list.
2. Ongoing / automated journeys (Scenarios)
Bloomreach Scenarios are visual drag-and-drop automation sequences. Entry is controlled by the trigger node placed at the start of the canvas.
Scenario entry trigger types
| Trigger | Description | Seed approach |
|---|---|---|
| On event | Fires each time a specified event is tracked for the customer | Track the event for the seed via Tracking API, browser SDK, or "Add event manually" from the customer profile |
| On date attribute | Fires on/around a date stored in a customer attribute | Set the date attribute on the seed customer |
| Now | Runs once for all customers matching conditions at activation | Useful for one-off scenarios and testing |
| Repeat | Runs on a defined recurring schedule and re-evaluates customers at each tick | Seed enters on the next scheduled evaluation if conditions match |
The API trigger is not a separate trigger type. It is an event source: an external system calls the trigger URL Bloomreach generates for the API trigger definition, which produces a tracked event that an "On event" scenario then consumes.
Creating trap profiles per journey type
Welcome / onboarding (On event trigger)
- Trigger: "On event" with
session_start(first visit), a customsignupevent, or a consent event when the customer opts in - Seed requirements: Customer profile with email attribute, consent granted for the relevant category
- How to trigger: Track the trigger event via the Tracking API:
POST https://api.exponea.com/track/v2/projects/{projectToken}/customers/events
Authorization: Basic {{base64(api_key_id:api_secret)}}
Content-Type: application/json
{
"customer_ids": {
"registered": "seed@example.com"
},
"event_type": "signup",
"timestamp": 1744732800,
"properties": {
"signup_source": "web",
"plan": "pro"
}
}
Or add the customer's email and consent via the consent API and add a Condition node after the trigger that filters email = seed@example.com so only the seed enters during testing.
Abandoned cart (On event trigger - cart_update)
- Trigger: "On event" with
cart_updateevent - scenario checks that nopurchaseevent occurs within the configured window - Seed requirements: Customer profile with email and consent;
cart_updateevent tracked with product data - Required
cart_updateevent properties: product_list- array of cart items; each item needs:item_id(must match product catalog),item_quantity,price,titletotal_quantitytotal_price
POST https://api.exponea.com/track/v2/projects/{projectToken}/customers/events
{
"customer_ids": {
"registered": "seed@example.com"
},
"event_type": "cart_update",
"timestamp": 1744732800,
"properties": {
"product_list": [
{
"item_id": "SKU-123",
"item_quantity": 1,
"price": 95.00,
"title": "Widget Pro",
"category_1": "Electronics"
}
],
"total_quantity": 1,
"total_price": 95.00,
"currency": "USD"
}
}
Wait the configured abandonment window. If no purchase event is tracked, the scenario sends the abandoned cart email.
Browse abandonment (On event trigger - view_item)
- Trigger: "On event" with
view_itemevent - Seed requirements: Customer profile with email and consent
- Required event properties:
item_id,item_name,item_url,item_image_url,item_price,category - How to trigger: Track the
view_itemevent via Tracking API with the above properties
Winback / re-engagement (Repeat trigger)
- Entry: Repeat trigger (scheduled daily/weekly) with a Condition node filtering on last purchase aggregate
- Condition example: Running aggregate of
purchaseevents - last event timestamp is more than 90 days ago - Seed requirements: Customer with purchase event history, or a
last_purchase_dateattribute set to a date older than the threshold - How to set up: Track a historical
purchaseevent with an old timestamp, or set a customlast_purchase_dateattribute:
POST https://api.exponea.com/track/v2/projects/{projectToken}/customers
{
"customer_ids": {"registered": "seed@example.com"},
"properties": {
"last_purchase_date": "2025-01-15"
}
}
Post-purchase (On event trigger - purchase)
- Trigger: "On event" with
purchaseevent - Seed requirements: Customer profile with email and consent
- Required
purchaseevent properties: purchase_id- unique order identifiertotal_price- order total (feeds revenue analytics)currency- Product details (product list or individual product attributes)
POST https://api.exponea.com/track/v2/projects/{projectToken}/customers/events
{
"customer_ids": {"registered": "seed@example.com"},
"event_type": "purchase",
"timestamp": 1744732800,
"properties": {
"purchase_id": "TEST-ORD-001",
"total_price": 149.99,
"currency": "USD",
"product_list": [
{
"item_id": "SKU-123",
"item_quantity": 1,
"price": 149.99,
"title": "Widget Pro"
}
]
}
}
Birthday / anniversary (On date attribute trigger)
- Trigger: "On date attribute" trigger set to fire annually on the month and day of the customer's
date_of_birthattribute - Seed requirements: Customer profile with
date_of_birthattribute set (ISO 8601 format:YYYY-MM-DD) - Trigger configuration: Select the
date_of_birthattribute > offset: 0 days > repeat: yearly > set execution time and timezone - For same-day testing: Set the seed's
date_of_birthto today's date. The scenario evaluates date attribute triggers daily; the seed enters on the next daily evaluation.
Scenario testing best practices
Add a Condition node immediately after the trigger: Filter email = seed@example.com during testing so only the seed customer enters the scenario flow. Remove this condition before enabling the scenario for all customers.
Custom recipient setting: In the Scenario settings, configure "Custom recipients" to redirect all emails to your own inbox. Recommended for content validation before go-live.
Add event manually from customer profile:
- Navigate to Data & Assets > Customers > [search for seed customer]
- Open the customer profile
- Click the three-dot menu (top right) > Add event manually
- Select the event type, add properties, set timestamp
- Click Submit
This is useful for quickly testing scenario entry without writing API calls.
Test emails do not count toward analytics. Test/preview sends from the scenario builder or email editor do not generate open, click, or send events - they do not affect campaign reporting.
How to reset seeds for repeated scenario testing
Event-triggered scenarios: Track the trigger event again via the Tracking API. If the scenario allows re-entry ("More than once" mode), the seed enters a new instance.
Date attribute scenarios: The scenario evaluates daily and re-triggers annually (for anniversary-type triggers). For same-day re-testing: change the date attribute value, wait for the trigger evaluation to reset, then set it back to today.
Remove from scenario mid-run: If a seed is stuck in a scenario (e.g., waiting on a delay node), navigate to the scenario's Live view > find the seed customer > remove from the scenario.
Always-on flow coverage
Telltide monitors recurring sends, so each seed must keep matching the live Scenario's entry conditions and any downstream Condition nodes. Bloomreach's three relevant primitives are Segmentations (dynamic groups), Aggregates (computed customer attributes), and Scenarios (the journey itself).
Match the segment trigger. If a Scenario's Condition node filters on Segmentation membership (e.g., "VIP customers"), set the seed's attributes so the segment evaluator places the seed in the same segment. Each Segmentation creates a customer attribute on save; verify the seed's value of that attribute matches the segment the Scenario expects. Re-check after any Segmentation edit, since rule changes can silently move the seed into a different segment.
Match the event trigger. "On event" Scenarios fire each time the configured event arrives for the customer. Schedule a recurring job to retrack the trigger event for the seed (Tracking API event POST) at a cadence at least as frequent as the Scenario's "More than once" re-entry window. For abandoned-cart and browse-abandonment Scenarios, retrack cart_update or view_item and do not retrack purchase, otherwise the cancel branch will exclude the seed.
Match aggregate-based conditions. Scenarios commonly branch on Aggregates (e.g., total_spend, last_purchase_at) or Running Aggregates derived from event history. Aggregates recompute from the seed's events; keep the seed's event history producing values that fall inside the Scenario's filter ranges. For Winback flows that key off "no purchase in 90 days," do not track new purchase events for the seed; for high-value flows that require minimum spend, backfill historical purchase events with realistic totals.
API trigger Scenarios. If your customer ESP setup pushes events through an API trigger definition rather than direct event tracking, send the seed through the same API trigger payload as production traffic so the resulting tracked event matches the Scenario's "On event" filter exactly.
Re-validate on Scenario edits. When a CRM manager modifies a live Scenario's segment filter, event filter, or aggregate threshold, the seed may drop out silently. Telltide's missed-send alerts will surface this, but reviewing seed coverage immediately after any Scenario or Segmentation change shortens the gap.
3. Platform-specific considerations
API options
Update/create customer (Tracking API):
POST https://api.exponea.com/track/v2/projects/{projectToken}/customers
Authorization: Basic {{base64(api_key_id:api_secret)}}
Track event for customer:
POST https://api.exponea.com/track/v2/projects/{projectToken}/customers/events
Add consent:
POST https://api.exponea.com/track/v2/projects/{projectToken}/customers/consents
API trigger for scenario: Bloomreach generates the trigger URL when you create an API trigger definition under Data & Assets > API trigger. Copy the generated URL and example payload from that screen; the URL embeds the project and trigger identifiers, so there is no fixed /scenarios/{id}/trigger path you can construct manually.
Batch commands: Up to 50 commands per request, mixing customer property updates and event additions. Use Batch for small grouped operations only; do not use it for high-volume historical imports.
API credentials location: Project Settings > Access Management > API > Create new API key pair (API Key ID + API Secret).
Tracking API is asynchronous. A successful 200 response means the request is queued, not that the customer record has been updated. Allow a few seconds for processing before checking the customer profile.
Rate limits
| Scope | Limit |
|---|---|
| Tracking API (HTTP) | Default 6,000 requests per minute per IP (100 per second). Actual cap may be higher per instance. Contact your Bloomreach Customer Success Manager for an increase. |
| Batch commands | Up to 50 commands per batch request. Not for bulk historical loads. |
| Bulk loads | Use Data & Assets > Imports (CSV/XML) for large customer or event loads. Loading years of history through the Tracking API violates fair use. |
| Customer attributes | 255 attributes per profile (default contract) or 1,024 attributes per profile (extended contract). |
Duplicate contact handling
Bloomreach automatically merges customer profiles when two profiles share the same hard ID value of the same type. If a new tracking event assigns a hard ID that already belongs to another customer, the profiles merge automatically - combining all historical events and properties.
Case sensitivity: Hard IDs are case-sensitive. User@example.com and user@example.com are different hard IDs and create separate profiles. Always normalize identifiers to lowercase before tracking.
Manual deduplication: Navigate to the customer profile > three-dot menu > Merge. Irreversible once started.
Platform-specific terminology
| Bloomreach Engagement term | What it means |
|---|---|
| Customer | A person record in Bloomreach's CDP (equivalent to a Contact/Profile in other platforms). |
| Scenario | An automated multi-step journey built in the scenario builder. |
| Campaign | A one-time email send configured via the Campaigns menu. |
| Event | A behavioral or system action tracked for a customer (e.g., purchase, cart_update, view_item). |
| Hard ID | A globally unique identifier for a customer (e.g., registered, email). One value per type per customer. |
| Soft ID | A non-unique identifier (e.g., cookie, device ID). Multiple values per type per customer allowed. |
| Consent category | A custom-defined opt-in category (e.g., "newsletter", "transactional"). Customers must have consent granted to receive campaign sends in that category. |
| Frequency Policy | Project-level setting capping the number of messages per customer per time period. |
| Custom suppression list | Project-wide list of email addresses or domains that receive no emails regardless of consent. |
| Condition node | A scenario building block that filters customers based on attributes, events, or segment membership. |
| Segmentation Fork | A scenario building block that branches the flow based on segment membership. |
| On date attribute trigger | Scenario entry trigger that fires based on a date stored in a customer attribute. Supports offset and repeat options (annually, monthly). |
| Tracking API | Bloomreach's asynchronous API for creating/updating customers and tracking events. |
Known limitations and workarounds
Hard IDs are case-sensitive. Normalize all email addresses and identifiers to lowercase before tracking. Failing to do so creates duplicate customer profiles for the same person.
Tracking API responses are asynchronous. A 200 OK means the request is queued. Wait a few seconds before checking the customer profile or before testing scenario entry.
Test emails do not generate campaign analytics. Opens and clicks from test sends (preview and custom recipient sends) are not recorded. Only production sends count toward reporting.
Scenario toggle OFF/ON affects all eligible customers - not just seeds. Toggling a live scenario off and back on re-evaluates entry conditions for all customers. In production environments, use the Condition node filtering approach or API trigger instead.
Frequency Policy applies to seed customers by default. If the seed has low engagement history, the policy may suppress sends. Configure a separate policy segment for internal test users (internal_test_user = true) with unlimited sends.
Test emails max 20 recipients. The email editor's Test section supports sending to a maximum of 20 addresses simultaneously.
Start monitoring your Bloomreach Engagement sends
Place a Telltide seed in your Bloomreach Engagement audience, and we will tell you when an expected email did not land.
Start free