Oracle Responsys: Telltide Seed Address Guide
Place Telltide seeds in Responsys lists and programs.
Oracle Responsys uses Profile Lists as its primary contact store. Each contact record has a system-assigned unique key called RIID_. The most important constraint for seed management: Responsys does NOT enforce email address uniqueness at the database level, so multiple RIID_ records can share the same email address, and all matching records receive the campaign. Manage deduplication through your merge rule configuration when loading contacts.
Quick reference
| Send type | Where to add seeds | Complexity |
|---|---|---|
| Scheduled (Campaign) | Add seed to a Profile List or Segment included in the Campaign's Recipient Source, or attach a Proof/Seed Group to the Campaign launch | Low |
| Ongoing (Program) | Add seed to Profile List, ensure it satisfies the Program entry Filter, or enable Seed Launch on the Program's Campaign Activity | Medium |
1. Scheduled / one-off sends (Campaigns)
Responsys Email Campaigns are one-time or scheduled sends. The audience is defined in the Recipient Source step: a Profile List, Segment (Filter), or API call. Seeds can be included in the live send via a Seed List, or receive a pre-launch proof via a Proof Group.
Proof Groups vs Seed Lists
Proof Group (pre-launch test): A special list type that receives a copy of the Campaign before the live launch. Members receive the Campaign in the test phase and are excluded from live reporting metrics. Used for QA before go-live.
Seed List (live send copy): A list attached to the Campaign's Seed List setting. Members receive the Campaign alongside the real audience during the live send. Included in send counts but excluded from performance reporting metrics.
Non-technical path
For CRM and lifecycle managers working in the Responsys UI.
Create a Proof/Seed Group
- Navigate to Data > Profile Lists > Seed Groups tab
- Click Create Seed Group
- Enter a name (e.g., "Telltide Seeds"), select the folder, optionally add a description
- Save
- Click the group name to open it
- Click Add Member to add individual email addresses, or use Import to upload a file
Add a seed contact to the Profile List (single record)
- Navigate to Data > Profile Lists > [your Profile List]
- Click Add Record
- Enter the seed email address in the
EMAIL_ADDRESS_field - Set
EMAIL_PERMISSION_STATUS_toI(opted in) - Fill in any other fields needed for personalization
- Save
Load seeds via CSV (Load from File)
- Select the Profile List in Data > Profile Lists
- Click Load from File
- Upload your CSV file
- Configure delimiter and field name mappings
- Set merge rule: match on
EMAIL_ADDRESS_, update on match, insert if no match - Confirm and run the load
Sign-up form / web form capture
If your team captures opt-ins via a Responsys-hosted Form or a native Web Form, submit each seed address through the same form your real subscribers use. The form posts into the Profile List with the configured default EMAIL_PERMISSION_STATUS_ and any source-tracking fields, which is the same path real subscribers travel.
Attach a Seed Group at Campaign launch (live)
- Open the Campaign in the Campaign Designer
- In the Audience section, find the Seed List option
- Select your Seed Group
- Seeds receive the Campaign on the live launch alongside the real audience
This is the recommended option for ongoing monitoring of scheduled Campaigns: it works even when you cannot modify the Profile List or the targeting Filter.
Run a Proof Launch (pre-launch QA)
- Open the Campaign in the Campaign Designer
- Click Proof Launch in the launch panel
- In Proof Settings, select your Proof Group from the Proof List dropdown
- Click Launch Proof
Technical path
For email developers and ops who want to script seed management.
Merge a seed into a Profile List
POST https://{endPoint}/rest/api/v1.3/lists/{listName}/members
Authorization: {{authToken}}
Content-Type: application/json
{
"recordData": {
"fieldNames": ["EMAIL_ADDRESS_", "EMAIL_PERMISSION_STATUS_"],
"records": [["seed@example.com", "I"]],
"mapTemplateName": null
},
"mergeRule": {
"insertOnNoMatch": true,
"updateOnMatch": "REPLACE_ALL",
"matchColumnName1": "EMAIL_ADDRESS_",
"matchOperator": "NONE",
"optinValue": "I",
"optoutValue": "O",
"htmlValue": "H",
"textValue": "T",
"rejectRecordIfChannelEmpty": "E",
"defaultPermissionStatus": "OPTIN"
}
}
Up to 200 records per request.
Merge into a Profile Extension Table (PET)
POST https://{endPoint}/rest/api/v1.3/lists/{listName}/listExtensions/{petName}/members
Authorization: {{authToken}}
Content-Type: application/json
Use this to set custom attributes (e.g., LAST_PURCHASE_DATE, BIRTH_DATE) on the seed record without touching the base Profile List.
Trigger a transactional Campaign message directly
POST https://{endPoint}/rest/api/v1.3/campaigns/{campaignName}/email
Authorization: {{authToken}}
Content-Type: application/json
{
"recipientData": [
{
"recipient": {
"listName": {"folderName": "{{folder}}", "objectName": "{{profile_list}}"},
"recipientId": null,
"customerId": null,
"emailAddress": "seed@example.com",
"mobileNumber": null,
"emailFormat": "HTML_FORMAT"
},
"optionalData": [
{"name": "FIRSTNAME", "value": "Telltide Seed"}
]
}
]
}
This bypasses the Campaign's Recipient Source and sends directly to the seed, useful for transactional confirmation flows.
Profile attributes required (Profile List fields)
Seeds need:
EMAIL_ADDRESS_: the seed inbox addressEMAIL_PERMISSION_STATUS_=I(opted in). Contacts withO(opted out) are excluded from marketing sends.EMAIL_DELIVERABILITY_STATUS_must not beU(undeliverable). Set automatically on hard bounce.- Values for any personalization fields referenced in the email template
Ensuring seeds receive the same version as real recipients
Dynamic content in Campaigns: Responsys supports dynamic content blocks using filter conditions based on Profile List fields. The seed receives the block matching its own field values. Set seed fields to match the target recipient segment.
Filter-based Recipient Source: If the Campaign targets a Filter, the seed must satisfy the Filter conditions to receive the Campaign via the main audience path. Alternatively, attach the seed via Seed List (as described above) to ensure delivery regardless of Filter conditions.
Gotchas
EMAIL_DELIVERABILITY_STATUS_ = U blocks all sends. On a hard bounce, Responsys sets this field to U on all records in the account sharing that email address (cross-list matching). A seed that bounces is automatically blocked from future sends. Check this field before each monitoring cycle and reset it via the Profile List record editor if needed.
Multiple records with the same email both receive the Campaign. If your seed email appears in the Profile List more than once, both records receive the send. Use the EMAIL_ADDRESS_ match merge rule to prevent duplicates during import.
2. Ongoing / automated journeys (Programs)
Responsys Programs are multi-step automated workflows built on a visual canvas. Contacts enter via Program Entry configurations and move through Campaign Activity nodes, Timer nodes, Data Switch nodes, and other canvas elements.
Program entry trigger types
| Entry type | How it fires | Seed approach |
|---|---|---|
| Scheduled Filter | A Filter runs on a schedule, matching contacts enter | Set seed fields to satisfy the Filter at the scheduled run time |
| Scheduled SQL View | A saved SQL view runs on a schedule | Ensure the seed is included in the SQL view result |
| Customer Activated | Fires when a new record is added or opt-in status changes to I | Insert new seed record or change EMAIL_PERMISSION_STATUS_ to I |
| Customer Deactivated | Fires when opt-in status changes to O (opt-out) | Not used for seed entry |
| Custom Event | API-triggered entry | Call POST /rest/api/v1.3/events/{eventName} with seed's data |
| REI Event | Real-time API-triggered entry | Call POST /rest/api/v1.3/events/rei/{eventName} with seed's data |
Always-on flow coverage
Programs are recurring by nature, so seed coverage has to survive every cycle of the Program, not just the first run. Three reliable patterns, in order of preference:
1. Make the seed satisfy the Program entry Filter (preferred when you control the data). Add the seed to the Program's source Profile List, then set the seed's standard and Profile Extension Table fields so the entry Filter selects it on every scheduled run. For example, if the entry Filter is EMAIL_PERMISSION_STATUS_ = I AND LAST_PURCHASE_DATE < SYSDATE - 90, write the seed's LAST_PURCHASE_DATE to a date older than 90 days. The seed re-qualifies each cycle and travels the same path as a real contact.
2. Enable Seed Launch on the Program's Campaign Activity (when you cannot modify the audience). On each Campaign Activity node inside the Program canvas, the activity properties expose an Enable seed launch when this activity is executed checkbox. Tick it and select your Seed Group. Every time the Program fires that activity, the Seed Group receives a copy alongside whichever contacts the Program selected. Use this when the entry Filter or source list is governed by another team.
3. OR-add the seed via the Filter expression (when the seed cannot satisfy the real criteria). Edit the entry Filter so the existing logic is OR'd with EMAIL_ADDRESS_ = 'seed@example.com'. The seed enters every cycle regardless of behavioural state. Cleanest when the Filter is a Classic Filter you own. Avoid this on Filters maintained by another team since edits change segment counts.
Creating trap profiles per journey type
Welcome / onboarding (Customer Activated entry)
- Entry: "Customer Activated", fires when a new contact is created or
EMAIL_PERMISSION_STATUS_changes fromOtoI - Seed requirements: Email address in Profile List,
EMAIL_PERMISSION_STATUS_ = I - How to trigger: Load the seed into the Profile List via the API or UI with
EMAIL_PERMISSION_STATUS_ = I. The "Customer Activated" entry fires automatically. - Scheduled Filter variant: If the Program uses a Scheduled Filter targeting "new subscribers in last N days", set the seed's opt-in date or custom date field to match that window.
Abandoned cart (Custom Event / REI Event entry)
- Entry: Custom Event or REI Event fired by the ecommerce platform when a cart is abandoned
- Seed requirements: Email address in Profile List, cart data available in the event payload or in a Supplemental Table linked to the contact
- How to trigger via Custom Event API:
POST https://{endPoint}/rest/api/v1.3/events/{eventName}
Authorization: {{authToken}}
Content-Type: application/json
{
"customEvent": {
"eventNumberDataMapping": null,
"eventDateDataMapping": null,
"eventStringDataMapping": null
},
"recipientData": [
{
"recipient": {
"emailAddress": "seed@example.com",
"listName": {
"folderName": "{{folder_name}}",
"objectName": "{{profile_list_name}}"
},
"emailFormat": "HTML_FORMAT"
},
"optionalData": [
{"name": "CART_VALUE", "value": "95.00"},
{"name": "CART_PRODUCT", "value": "Widget Pro"},
{"name": "CART_URL", "value": "https://yourstore.com/cart"}
]
}
]
}
The optionalData fields map to Entry Tracking Variables (ETVs) configured in the Program's entry settings. The event name must match a Custom Event defined in Account Management > Custom Events.
Browse abandonment (REI Event entry)
- Entry: REI Event triggered by the web tracking system
- Seed requirements: Email address in Profile List
- How to trigger via REI Event API:
POST https://{endPoint}/rest/api/v1.3/events/rei/{eventName}
Authorization: {{authToken}}
Content-Type: application/json
{
"recipientData": [
{
"recipient": {
"emailAddress": "seed@example.com",
"listName": {
"folderName": "{{folder_name}}",
"objectName": "{{profile_list_name}}"
}
},
"optionalData": [
{"name": "PRODUCT_NAME", "value": "Widget Pro"},
{"name": "PRODUCT_URL", "value": "https://yourstore.com/products/widget"}
]
}
]
}
Winback / re-engagement (Scheduled Filter entry)
- Entry: Scheduled Filter running daily or weekly with criteria such as
LAST_PURCHASE_DATE < [90 days ago] AND EMAIL_PERMISSION_STATUS_ = I - Seed requirements: Contact in Profile List with
LAST_PURCHASE_DATE(custom Profile Extension Table field) set to a date older than the threshold - How to trigger: Update the seed's PET field via API or Profile List record editor. At the next Scheduled Filter run, the seed qualifies and enters the Program.
Update via API:
POST https://{endPoint}/rest/api/v1.3/lists/{listName}/listExtensions/{petName}/members
Authorization: {{authToken}}
Content-Type: application/json
{
"recordData": {
"fieldNames": ["EMAIL_ADDRESS_", "LAST_PURCHASE_DATE"],
"records": [["seed@example.com", "01/15/2025"]],
"mapTemplateName": null
},
"mergeRule": {
"insertOnNoMatch": false,
"updateOnMatch": "REPLACE_ALL",
"matchColumnName1": "EMAIL_ADDRESS_"
}
}
Date format: Responsys uses MM/DD/YYYY HH:MI:SS as the standard timestamp format internally. Configure the Date Import Format in the Profile List settings.
Post-purchase (Custom Event entry)
- Entry: Custom Event fired by the order management system after a confirmed purchase
- Seed requirements: Contact in Profile List, order data passed via
optionalDataor stored in a Supplemental Table - How to trigger: Same Custom Event API call as abandoned cart, with order-specific event name and data
Birthday / anniversary (Scheduled Filter or Timer ETV entry)
Option A: Scheduled Filter (runs daily)
- Filter criteria:
BIRTH_MONTH = [current month] AND BIRTH_DAY = [current day](requires customBIRTH_MONTHandBIRTH_DAYnumeric fields) - Or:
anniversary_of(BIRTH_DATE, 'years') = todayif your account's filter designer supports anniversary operators - Seed: set
BIRTH_DATE(TIMESTAMP type custom field) to today's date (matching month and day)
Option B: Timer with Entry Tracking Variable (ETV)
- Program entry: Scheduled Filter or Customer Activated, with
BIRTH_DATEfield as an ETV - Timer node: "Wait until date" set to the ETV value (the stored birthday date)
- The Program holds each contact at the Timer until their birthday arrives
- Seed: set
BIRTH_DATEto today's date so the Timer releases immediately
Date field format: MM/DD/YYYY HH:MI:SS for TIMESTAMP fields. Seed's BIRTH_DATE should match today's date exactly in this format.
How to obtain an auth token
POST https://{login_pod}/rest/api/v1.3/auth/token
Content-Type: application/x-www-form-urlencoded
user_name={{username}}&password={{password}}&auth_type=password
Returns authToken (valid 3 hours), issuedAt, and endPoint (your account-specific API base URL). All subsequent API calls use the Authorization: {{authToken}} header and the endPoint value as base URL.
Your login pod is the host you use to log in to Responsys (for Interact 2 use login2.responsys.net, for Interact 5 use login5.responsys.net). The returned endPoint is the host you must use for all data and event APIs and may differ from the login pod.
How to reset seeds for repeated Program testing
Scheduled Filter Programs: The Program evaluates the Filter again on its next scheduled run. If the seed still satisfies the Filter, it enters again. If re-entry is restricted, remove the seed from the Filter criteria (update the qualifying field), wait for one cycle, then re-qualify.
Event-triggered Programs (Custom/REI Event): Fire the event API again. Up to 200 recipients per request.
Customer Activated Programs: The trigger fires on new record insertion or opt-in status change. To re-trigger, change the seed's EMAIL_PERMISSION_STATUS_ to O then back to I via the API.
3. Platform-specific considerations
API options
Authentication:
POST https://{login_pod}/rest/api/v1.3/auth/token
Content-Type: application/x-www-form-urlencoded
Returns authToken (3-hour expiry) and endPoint.
Merge / upsert Profile List member:
POST https://{endPoint}/rest/api/v1.3/lists/{listName}/members
Authorization: {{authToken}}
Merge / upsert Profile Extension Table member:
POST https://{endPoint}/rest/api/v1.3/lists/{listName}/listExtensions/{petName}/members
Authorization: {{authToken}}
Retrieve member by RIID:
GET https://{endPoint}/rest/api/v1.3/lists/{listName}/members/{riid}
Authorization: {{authToken}}
Trigger Custom Event (up to 200 recipients):
POST https://{endPoint}/rest/api/v1.3/events/{eventName}
Authorization: {{authToken}}
Trigger REI Event (up to 200 recipients):
POST https://{endPoint}/rest/api/v1.3/events/rei/{eventName}
Authorization: {{authToken}}
Trigger transactional Campaign message:
POST https://{endPoint}/rest/api/v1.3/campaigns/{campaignName}/email
Authorization: {{authToken}}
Get throttling limits for your account:
GET https://{endPoint}/rest/api/v1.3/info/throttlingLimits
Authorization: {{authToken}}
API credentials location: Account Management > API users. The username and password for API authentication are separate from the UI login credentials.
Rate limits
| Scope | Limit |
|---|---|
| Auth token | Valid 3 hours, re-authenticate before expiry |
| High-volume APIs (merge list members, trigger email, custom event, REI event) | Default 200 requests per minute per account, raise via support request |
| Records per merge or event request | 200 recipients per request |
| Async merge (large loads) | Processes as background job, poll job status |
| Throttling response on overrun | API_LIMIT_EXCEEDED with retry-after-1-minute message |
Use the /info/throttlingLimits endpoint to fetch your account's current per-API limits.
Duplicate contact handling
RIID_ uniqueness, not email uniqueness. Each record has a unique RIID_ but multiple records can share the same EMAIL_ADDRESS_. If duplicates exist, all matching records receive the Campaign.
Prevent duplicates at import: Set the merge rule's matchColumnName1 = EMAIL_ADDRESS_ with updateOnMatch = REPLACE_ALL and insertOnNoMatch = true. Loading a seed email that already exists then updates the existing record rather than creating a new one.
EMAIL_DELIVERABILITY_STATUS_: On hard bounce, Responsys sets this to U on all records sharing that email address across all lists in the account. Monitor and reset this field for seed addresses after any bounce events.
Platform-specific terminology
| Oracle Responsys term | What it means |
|---|---|
| Profile List | The primary contact database (equivalent to a List or Audience in other platforms). |
| RIID_ | System-assigned unique integer identifier for each record in a Profile List. |
| Profile Extension Table (PET) | A one-to-one extension table storing additional attributes per Profile List record. |
| Supplemental Table | A one-to-many data table linked to Profile List records (e.g., order line items, cart contents). |
| Proof Group / Seed Group | A special list for receiving test sends before or during live Campaign launches. |
| Seed List | A list attached to a Campaign or Program Campaign Activity that receives copies during the live send, excluded from performance reporting. |
| Seed Launch | The Program Campaign Activity option ("Enable seed launch when this activity is executed") that delivers the activity's send to a Seed Group on every Program execution. |
| Campaign Designer | The visual interface for creating and launching email Campaigns. |
| Program Canvas | The visual interface for building automated multi-step Program workflows. |
| Campaign Activity node | A Program Canvas node that sends a message (email, SMS, etc.) to contacts at that step. |
| Timer node | A Program Canvas node that pauses contact progression for a set duration or until a date. |
| Data Switch node | A Program Canvas branching node that routes contacts based on Filter criteria. |
| Entry Tracking Variable (ETV) | A data field value passed into a Program at entry time (e.g., a date or order value), available in Timer nodes and downstream logic. |
| Custom Event | A named API-triggered Program entry point defined in Account Management. |
| REI Event | Responsys Event Interface, a real-time API-triggered entry point for Programs, supporting richer data payloads than Custom Events. |
| Filter (Classic / Simple) | A saved set of audience criteria used as a Recipient Source for Campaigns or as a Program entry. |
| EMAIL_PERMISSION_STATUS_ | System field storing email opt-in status. I = opted in, O = opted out. |
| EMAIL_DELIVERABILITY_STATUS_ | System field set to U on hard bounce, blocking all future sends to that address. |
| Fatigue Analysis | Analytics tool (Advanced Intelligence Package add-on) that segments contacts by send-frequency persona. Advisory only, does not automatically block sends. |
Known limitations and workarounds
Email address uniqueness is not enforced. If a seed email appears in the Profile List more than once, every matching record receives the Campaign. Always use the email-address match merge rule when loading seeds to prevent duplicates.
EMAIL_DELIVERABILITY_STATUS_ = U is set account-wide on hard bounce. When a seed email bounces, all records sharing that email across all Profile Lists in the account are blocked. Monitor this field for seed addresses and reset it via the record editor if needed.
Auth tokens expire after 3 hours. Automated seed management scripts must refresh the token before expiry by re-calling POST /auth/token.
Custom and REI Event APIs are capped at 200 recipients per request. For Programs that need to inject more than 200 seeds simultaneously, batch the requests.
Default API throttle is 200 requests per minute per account. High-volume seed pipelines should pace requests, retry on API_LIMIT_EXCEEDED, and request a limit increase via Oracle support if needed.
Fatigue Analysis is an add-on. If your account does not have the Advanced Intelligence Package, frequency management must be implemented manually via Filter logic checking the count of recent sends from Interaction attributes.
Batch Program nodes cannot be modified after activation. For any Automation Center Batch Programs, finalise the canvas design before activating. Use a fresh copy of the Program for iterative testing.
Start monitoring your Oracle Responsys sends
Place a Telltide seed in your Oracle Responsys audience, and we will tell you when an expected email did not land.
Start free