Salesforce Marketing Cloud: Telltide Seed Address Guide
Place Telltide seeds in Salesforce Marketing Cloud Data Extensions and Journey Builder.
Salesforce Marketing Cloud (SFMC) is a complex platform with multiple layers of identity, subscription status, and send logic. Placing seeds correctly requires understanding how Data Extensions, the All Subscribers list, and Journey Builder interact. A seed that looks correct in a Data Extension can still be suppressed silently if the subscriber key status is wrong.
Quick reference
| Send type | Where to add seeds | Complexity |
|---|---|---|
| Scheduled (User-Initiated Send / Email Studio) | Add seed row to the sendable Data Extension used as the send audience | Medium |
| Ongoing (Journey Builder) | Add seed row to the entry DE, or inject via the Journey Builder REST API event endpoint | High |
1. Scheduled / one-off sends (User-Initiated Sends in Email Studio)
SFMC's Email Studio handles one-off batch sends through User-Initiated Sends (UIS). The audience is always a sendable Data Extension or a subscriber List.
Where to add seed addresses
Seeds must be added as rows in the sendable Data Extension used as the audience for the send. Adding an email address elsewhere (a different DE, a list, the All Subscribers list only) will not cause it to receive the email.
Non-technical path
For CRM managers and email operators without API or developer access. All work happens in the SFMC web UI.
Email Studio Subscribers UI
If your account uses the legacy Subscribers list as the audience (instead of a Data Extension), you can add the seed directly from Email Studio:
- From Marketing Cloud, open the App Switcher (the 9-dot menu in the top-right) and choose Email Studio.
- Navigate to Email Studio > Subscribers > All Subscribers.
- Click Create (or Import for a CSV) and add the seed with a unique Subscriber Key, the seed inbox email address, and Status set to Active.
Contact Builder list add
If the send uses a Subscriber List or a published audience built in Contact Builder:
- Open Contact Builder from the App Switcher.
- Open the relevant list under Lists or the source population, then add the seed contact with the required attribute values.
Data Extension manual edit
This is the most common path because most modern sends use a sendable DE.
- Navigate to Email Studio > Subscribers > Data Extensions.
- Locate the sendable DE used as the campaign audience and click to open it.
- Click the Records tab.
- Click Add Record.
- Enter values for all required fields: - The field mapped to Subscriber Key (commonly named
SubscriberKeyorContactKey), use a unique identifier likeseed-monitor-001. - The email address field, use the seed inbox address. - Any additional fields referenced by AMPscript in the email content (null merge tags will appear broken). - Click Save.
For larger updates, use the file-import option instead of manual entry:
- Open the target Data Extension.
- Click Import.
- Upload a CSV file with columns matching the DE schema.
- Map CSV columns to DE fields in the import wizard.
- Select Add and Update mode (upsert) to avoid errors if the row already exists.
- Complete the import.
Technical path
For developers and integrators with SFMC API credentials. Use these when seed placement needs to be automated, scripted, or fired on demand.
REST API: upsert a Data Extension row
POST https://{{subdomain}}.rest.marketingcloudapis.com/data/v1/customobjectdata/key/{{ExternalKey}}/rowset
Authorization: Bearer {{token}}
Content-Type: application/json
{
"items": [
{
"SubscriberKey": "seed-monitor-001",
"EmailAddress": "seed@example.com",
"FirstName": "Seed"
}
]
}
This is the preferred path for adding or updating seed rows in a sendable DE programmatically.
REST API: subscribers (legacy lists)
POST https://{{subdomain}}.rest.marketingcloudapis.com/contacts/v1/contacts
Use the contacts endpoint to manage contact-level identity for seeds that need to live on a Subscriber List rather than a DE.
SOAP API (legacy)
The SOAP Subscriber and DataExtensionObject objects still work and are the only option in some older integrations. Endpoint:
https://{{subdomain}}.soap.marketingcloudapis.com/Service.asmx
A Create call against DataExtensionObject with CustomerKey set to the DE's external key inserts a seed row. New code should prefer REST.
AMPscript tracking
Inside an email, AMPscript can be used to log a seed's send to a custom DE for verification. For example, an InsertDE block keyed off a SubscriberKey that starts with seed- writes a row whenever the seed is rendered, so Telltide-side checks have a clear send-side fingerprint:
%%[
IF IndexOf(AttributeValue("SubscriberKey"), "seed-") == 1 THEN
InsertDE("SeedSendLog", "SubscriberKey", AttributeValue("SubscriberKey"), "JobID", JobID, "SentTime", Now())
ENDIF
]%%
This is optional and useful only if you want a send-side audit trail in addition to inbox arrival.
Always-on flow coverage
Adding a seed once is not enough; the seed must be picked up by every send the customer cares about monitoring. In Email Studio's User-Initiated Sends this happens automatically as long as the seed is a row in the sendable DE used by each campaign. For sends that pull audiences from multiple DEs or filter activities, do the following:
- Source data extension: add the seed's SubscriberKey to the source DE that any filter activity or query activity reads from. If filter activities run as part of an Automation Studio workflow before the send, the seed must satisfy the filter or the workflow must include an OR criterion that allows seed Subscriber Keys through (for example,
OR SubscriberKey LIKE 'seed-%'). - Automation Studio scheduled sends: if the campaign send is wired up via a Send Email activity inside an Automation Studio automation, confirm the upstream Query Activity's target DE includes the seed row before the Send Email step runs. If the Query Activity is destructive (overwrite mode), the seed needs to be either in the source data the query reads from, or appended after the query via a second activity.
- Triggered Send / API-driven sends: ensure the seed's ContactKey is allowlisted into the test feed that fires Triggered Sends, so production triggers also fire for the seed and not just a hand-curated test list.
Profile attributes required
Seeds need:
- A Subscriber Key value - any unique string works; does not need to match a real customer format
- The email address field populated with the seed inbox address
- Values for any personalization fields referenced in the email content - null values will appear as blank or broken in the rendered email
Seeds do not need to match any customer demographic criteria. SFMC does not filter DE rows by attribute values at send time (that filtering happens via query activities or segmentation DEs, not during the send itself).
Ensuring seeds receive the same version as real recipients
A/B testing: SFMC A/B testing for User-Initiated Sends randomly splits the audience DE into groups. Seeds in the DE will be randomly assigned to a variant - there is no mechanism to pin a seed to a specific variant. This means:
- Seeds will receive one variant, but not necessarily all variants
- To monitor all variants, you need one seed per variant or to run the test sends separately
- Workaround: add seeds to a suppression list for the main send, then run separate seed-only sends against each variant after the winner is selected
Exclusion scripts: Review any AMPscript or SSJS exclusion logic in the send configuration. If the email or send definition contains exclusion scripts that evaluate subscriber attributes (e.g., "exclude anyone without a purchase in 90 days"), the seed's DE row values must pass those conditions.
Gotchas
All Subscribers status (most common failure): SFMC checks each contact's Subscriber Key against the All Subscribers list at send time. If the key exists with a status of Unsubscribed, Bounced, or Held, the email is suppressed - even if the row is in the DE.
To verify and correct status:
- Navigate to Email Studio > Subscribers > All Subscribers
- Search for the seed's Subscriber Key or email address
- If the status is not Active, select the contact and update the status to Active
If the seed has never been sent to in SFMC, its Subscriber Key may not exist in All Subscribers yet. A first send will create the record.
If the seed's status is Held, importing a CSV with Status=Active will not reliably clear it. Held is set by SFMC's bounce engine after repeated bounces, and re-importing a row generally does not reset that state. Reliable options are:
- Rotate the seed's local part (for example,
seed+abc@example.comso SFMC sees a new email address and clears the bounce history), or - Open a Salesforce support case to clear the Held status on that Subscriber Key.
Auto-Suppression Lists: These are account- or BU-level lists that block delivery regardless of subscriber status or DE membership. Check:
- Email Studio > Admin > Send Management > Auto-Suppression Configuration
- Confirm the seed address and domain are not listed on any auto-suppression list
Note: "Suppression Lists" (without "Auto-") is a separate construct that lives in the Subscribers area and is selected at send time on a specific send definition. Both should be checked.
Manual Suppression Lists: Check the specific send definition or journey email activity to confirm no suppression list is applied that includes the seed address.
Frequency caps and Einstein Engagement Frequency: SFMC Engagement does not ship with a stock per-contact daily or weekly cap under Setup > Administration. Frequency capping is implemented per account through one of:
- A custom send-log Data Extension feeding an auto-suppression list,
- Exclusion scripts on send definitions or journey email activities, or
- Einstein Engagement Frequency (a separate add-on that scores contacts as Saturated or At Risk).
If any of these are configured, seeds may hit the cap and stop receiving emails. This is a common failure for seeds in high-volume accounts. Ask the SFMC admin which mechanism (if any) is in place and confirm the seed's Subscriber Key is excluded from it.
2. Ongoing / automated journeys (Journey Builder)
Journey Builder journeys run continuously. A seed profile must enter the journey through the configured entry source and must not be filtered out at any step.
Entry source types
Journey Builder currently exposes several entry source types: Data Extension, API Event, Salesforce Data, CloudPages (Form Submit), Audience Studio Audiences, and Event (transactional or Data Cloud data action). The approach for seeds depends on which type the journey uses. This guide focuses on Data Extension and API Event because those are where seeds are placed directly. For Salesforce Data and CloudPages entry sources the seed contact must first exist in the source system (a Salesforce CRM record, or a successful CloudPages form submission) before it will enter the journey.
Non-technical path
For CRM managers without dev access. Use the Journey Builder canvas, Email Studio, and Contact Builder UIs.
Data Extension entry (manual seed row)
The journey reads from a specified DE on a schedule or one-time trigger. New rows added to that DE are picked up at the next evaluation.
For seeds:
- Identify the DE configured as the journey's entry source (visible in the journey canvas, on the entry source tile, the first block).
- Add the seed row to that DE with all required fields populated (same process as Section 1).
- The seed will enter the journey at the next scheduled evaluation.
Where to create seed profiles in the SFMC UI
- Email Studio > Subscribers > Data Extensions, for adding rows to journey entry DEs.
- Email Studio > Subscribers > All Subscribers, to verify and set Active status.
- Email Studio > Admin > Send Management > Auto-Suppression Configuration, to check for seed conflicts on auto-suppression lists.
For API-based injection (Technical path below), no additional UI setup is needed; the contact is created or updated at the time of injection.
Technical path
For developers with API credentials. Use these when journey entry needs to be fired on demand or scripted.
Entry type: API Event (most flexible for seeds)
The journey exposes an Event Definition Key. You call the Journey Builder REST API to inject a specific contact immediately.
Step-by-step: Inject a seed via API
- In Journey Builder, open the journey canvas
- Click the Entry Event step (the first block)
- Note the Event Definition Key (format:
APIEvent-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx) - Authenticate: obtain a Bearer token from the SFMC auth endpoint
- Make the API call. The sync
/interaction/v1/eventsendpoint requires Pascal-case payload keys (ContactKey,EventDefinitionKey,Data, and optionallyEstablishContactKey):
POST https://{{subdomain}}.rest.marketingcloudapis.com/interaction/v1/events
Authorization: Bearer {{token}}
Content-Type: application/json
{
"ContactKey": "seed-monitor-001",
"EventDefinitionKey": "APIEvent-abc123-def456",
"EstablishContactKey": true,
"Data": {
"EmailAddress": "seed@example.com",
"FirstName": "Seed",
"CustomField1": "value"
}
}
Setting "EstablishContactKey": true ensures the seed's ContactKey is created on the All Subscribers list if it does not already exist, which matters for first-time seeds.
- The
Dataobject must match the fields defined in the DE associated with the entry event. Missing required fields cause a 400-level validation error rather than skipping without notice, so check the response body when debugging. - For batch injection (up to 100 contacts per request), use the async endpoint, which uses camelCase keys and a
members[]array:
POST https://{{subdomain}}.rest.marketingcloudapis.com/interaction/v1/async/events
Authorization: Bearer {{token}}
Content-Type: application/json
{
"eventDefinitionKey": "APIEvent-abc123-def456",
"members": [
{
"contactKey": "seed-monitor-001",
"data": {
"EmailAddress": "seed@example.com",
"FirstName": "Seed"
}
}
]
}
The two endpoints are not interchangeable. Sending Pascal-case keys to the async endpoint, or camelCase keys to the sync endpoint, results in the call failing or being ignored.
SOAP API (legacy)
For accounts still on the SOAP integration, the Subscriber and DataExtensionObject objects support seed insertion. Endpoint:
https://{{subdomain}}.soap.marketingcloudapis.com/Service.asmx
A SOAP Create against DataExtensionObject (with CustomerKey set to the entry DE's external key) inserts a seed row that the journey will pick up at the next DE evaluation. New code should prefer REST.
AMPscript tracking
Inside a journey email, AMPscript can write a seed-only row to a custom Send Log DE so Telltide-side checks have a send-side fingerprint:
%%[
IF IndexOf(AttributeValue("SubscriberKey"), "seed-") == 1 THEN
InsertDE("SeedSendLog", "SubscriberKey", AttributeValue("SubscriberKey"), "JobID", JobID, "JourneyKey", _DataSourceName, "SentTime", Now())
ENDIF
]%%
This is optional; Telltide does not require it, but it is a convenient audit trail for journeys that span many steps.
Always-on flow coverage
To ensure the seed is pulled into every Journey Builder entry event and every Automation Studio scheduled send, not just the cycle you set up by hand, do the following:
- Source data extension feeding Journey entry events: add the seed's SubscriberKey to the upstream DE that any Data Extension entry source reads from. If the journey's entry DE is populated by a nightly Query Activity, seed the source tables that the query reads from, not just the entry DE itself, so the seed is re-added on every refresh.
- Filter Activity OR criterion: in any Filter Activity that narrows the entry DE (for example, "only contacts who purchased in the last 30 days"), add an OR criterion that allows seed Subscriber Keys through. A common pattern is
OR SubscriberKey LIKE 'seed-%'orOR EmailAddress LIKE '%@inbound.telltide.io'. - Automation Studio scheduled sends: if the campaign is wired up via a Send Email activity inside an Automation Studio automation, confirm the Query Activity producing the audience DE includes the seed row before the Send Email step runs. If the Query Activity is destructive (overwrite mode), either include the seed in the underlying source data, or append the seed via a second Query or Script Activity that runs after the main query and before the send.
- Triggered API events: for journeys with API Event entry sources used in production (transactional flows, abandoned cart, post-purchase), allowlist the seed's ContactKey into the test feed that fires the production trigger, so the seed receives the same payloads as live customers, not a hand-curated test list. If the trigger is fired by an external system (e-commerce platform, internal app), make sure that system treats the seed as a real contact rather than skipping it as test data.
- Journey re-entry settings: confirm the journey's re-entry mode (see "How to reset seeds for repeated testing" below). Once a journey has been activated with No Re-entry, that choice cannot be changed, even by publishing a new version, so plan seed Subscriber Key rotation accordingly.
Creating trap profiles for each common journey type
Welcome / onboarding
- Entry trigger: Data Extension or API event
- Seed requirements: Subscriber Key, email address, any profile fields used in the welcome email (first name, account type, etc.)
- How to trigger entry: Add the seed row to the entry DE, or fire an API event injection call
- Gotcha: If the welcome journey entry DE is populated via a form submission or integration (not manually), you may need API event injection to bypass the form flow
Abandoned cart
- Entry trigger: API event carrying product/cart data
- Seed requirements: Subscriber Key, email address, product fields used in the email (product name, price, image URL, product URL, cart total)
- How to trigger entry: Fire the API event injection with
datafields that match the product schema expected by the email's AMPscript - Key detail: The email's AMPscript likely looks up product data from the
dataobject passed with the event. If fields are missing, the email will render with nulls. Map all fields explicitly.
{
"ContactKey": "seed-monitor-001",
"EventDefinitionKey": "APIEvent-cart-abandon-key",
"EstablishContactKey": true,
"Data": {
"EmailAddress": "seed@example.com",
"ProductName": "Widget Pro",
"ProductPrice": "49.99",
"ProductImageURL": "https://example.com/img/widget.jpg",
"CartTotal": "49.99",
"CartURL": "https://example.com/cart"
}
}
Winback / re-engagement
- Entry trigger: Scheduled DE entry, where the DE is populated by a query that finds lapsed contacts
- Seed requirements: Subscriber Key, email address, plus whatever fields the query uses to identify "lapsed" status (e.g., a
LastPurchaseDatefield older than 90 days, or aLastOpenDatefield) - How to trigger entry: Set the seed's date fields to values that qualify them as lapsed (e.g., set
LastPurchaseDateto a date 120 days in the past). Add the seed row to the source DE or ensure the query would include the seed. - Gotcha: If the entry DE is populated by a nightly Automation Studio query, the seed must exist in the source data tables the query reads from, or be inserted directly into the entry DE after the query runs.
Post-purchase
- Entry trigger: API event carrying order data, or a DE-based entry triggered by a purchase event written to a DE
- Seed requirements: Subscriber Key, email address, order ID, product details, order total, purchase date
- How to trigger entry: Fire the API event or insert a row into the entry DE with valid-looking order data
Birthday / anniversary
- Entry trigger: Date-based, evaluated daily against a DE where a birthday/anniversary date field matches today's date
- Seed requirements: Subscriber Key, email address, birthday field (format:
MM/DDorYYYY-MM-DDdepending on DE field type - confirm the DE schema) - How to trigger entry: Set the seed's birthday/anniversary field to today's date. Add the seed row to the entry DE before the daily evaluation runs.
- Gotcha: Date-based journeys often evaluate once per day at a fixed time. Plan seed injection timing accordingly.
Ensuring seeds progress through the full journey
Journey steps can filter or exit contacts at multiple points:
Decision Splits: Review each Decision Split in the journey. A split evaluates a condition (e.g., "Did the contact open the previous email?"). If the seed takes the wrong path, it may exit the journey or skip an email step. Plan seed interactions with prior emails to ensure the expected path is taken.
Engagement Splits: These evaluate email engagement (opens, clicks) within a defined window. A seed that does not open or click will follow the "No" or "Did Not" path. If monitoring requires the seed to traverse all steps, open/click tracking will affect routing.
Exit Criteria: Check whether the journey has exit criteria configured. If the seed profile matches the exit condition at any evaluation point, it will be removed from the journey.
Frequency caps: As noted above, custom send-frequency rules, exclusion scripts, or Einstein Engagement Frequency can suppress individual emails within a journey. If a seed is hitting these caps, it may receive the first email but not subsequent ones.
Goal Criteria: Journey goals can cause contacts to exit early when they meet the goal condition. If the seed's profile attributes match the goal condition, it may exit before completing the full journey.
How to reset seeds for repeated testing
Option A: Use a new Subscriber Key for each monitoring cycle. The same seed email address can have multiple Subscriber Keys. Each key is treated as a separate contact by SFMC. The seed inbox receives all copies. This sidesteps re-entry restrictions but accumulates DE rows over time.
Option B: Change the journey's re-entry setting. In Journey Settings, switch from "No Re-entry" to "Re-entry After Exit" or "Re-entry Anytime." This requires publishing a new journey version, which does not affect contacts already in the active version.
Option C: Publish a new journey version. Publishing a new version resets the entry history for re-entry purposes. New entrants use the new version; contacts already in the journey continue on the old version.
3. Platform-specific considerations
API options
Data Extension REST API (upsert DE rows):
POST https://{{subdomain}}.rest.marketingcloudapis.com/data/v1/customobjectdata/key/{{ExternalKey}}/rowset
Preferred for inserting or updating seed rows in DEs programmatically.
Journey Builder Entry Event API:
POST https://{{subdomain}}.rest.marketingcloudapis.com/interaction/v1/events
For injecting seeds into API-event-entry journeys. Batch version:
POST https://{{subdomain}}.rest.marketingcloudapis.com/interaction/v1/async/events
Batch limit: 100 contacts per request.
Contacts REST API:
POST https://{{subdomain}}.rest.marketingcloudapis.com/contacts/v1/contacts
For managing contact-level identity data. Not required for basic DE-based seed management.
Authentication: All REST API calls require a Bearer token obtained via:
POST https://{{authsubdomain}}.auth.marketingcloudapis.com/v2/token
Tokens expire after 20 minutes. Implement token refresh logic in any automation.
Rate limits and sending caps
- SFMC does not publish explicit REST API rate limits per endpoint. In practice, standard rate limits apply per tenant.
- Journey Builder API event injection: up to 100 contacts per async batch request
- Custom frequency caps or Einstein Engagement Frequency (if configured): can cap per-contact sends to N per day or N per week. This directly affects seed delivery in multi-email journeys.
Duplicate contact handling
SFMC deduplicates by Subscriber Key, not by email address. A single email address can exist under multiple Subscriber Keys and will receive one email per Subscriber Key included in a send. This is intentional for seed management (using different keys per monitoring cycle) but affects contact billing.
Platform terminology
| SFMC term | What it means |
|---|---|
| Data Extension (DE) | A database table for subscriber data; sendable DEs are the primary audience source |
| Subscriber Key | The unique contact identifier; maps to All Subscribers status |
| All Subscribers | The master list tracking global subscription status for every Subscriber Key |
| User-Initiated Send (UIS) | A manually scheduled one-off or recurring batch email send |
| Journey Builder | The visual automation canvas for multi-step triggered journeys |
| Entry Event | The source that feeds contacts into a Journey Builder journey |
| Event Definition Key | The unique identifier for an API-triggered journey entry event |
| Triggered Send | A transactional, per-contact email send via API |
| AMPscript | SFMC's native templating language used for personalization in email content |
| Publication List | An opt-in/opt-out list layered on top of All Subscribers for preference management |
| Auto-Suppression List | An account-level block list applied to all sends |
| Frequency cap | Per-contact cap on how many commercial messages a contact can receive per day or week. Not a stock setting in SFMC Engagement; implemented per account through custom send-log rules, exclusion scripts, or Einstein Engagement Frequency. |
| Business Unit (BU) | A sub-account within SFMC. Seeds must match the BU context of the send. |
Known limitations and workarounds
No re-entry without a new journey version or Subscriber Key rotation: Journey re-entry settings are fixed per journey version. The cleanest workaround for repeated seed monitoring is using a new Subscriber Key each cycle while routing to the same inbox.
Suppression lists are not visible in the send preview: There is no pre-flight check that shows which contacts in a DE will be suppressed before sending. Verify seed address status in All Subscribers and suppression lists manually before each monitoring cycle.
Frequency caps are silent: A contact suppressed by a custom frequency rule, exclusion script, or Einstein Engagement Frequency receives no error or notification. The send simply skips them. If seeds stop receiving mid-journey, the configured frequency-cap mechanism is the first thing to check.
A/B test variant assignment is random: Seeds cannot be pinned to a specific variant. Plan for this in your monitoring strategy.
Business Unit isolation: Each Business Unit has its own All Subscribers list, Data Extensions, and send history. A seed registered in one BU may need to be separately registered in another BU if sends originate from multiple BUs.
Start monitoring your Salesforce Marketing Cloud sends
Place a Telltide seed in your Salesforce Marketing Cloud audience, and we will tell you when an expected email did not land.
Start free