Integrations

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 typeWhere to add seedsComplexity
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 launchLow
Ongoing (Program)Add seed to Profile List, ensure it satisfies the Program entry Filter, or enable Seed Launch on the Program's Campaign ActivityMedium

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

  1. Navigate to Data > Profile Lists > Seed Groups tab
  2. Click Create Seed Group
  3. Enter a name (e.g., "Telltide Seeds"), select the folder, optionally add a description
  4. Save
  5. Click the group name to open it
  6. 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)

  1. Navigate to Data > Profile Lists > [your Profile List]
  2. Click Add Record
  3. Enter the seed email address in the EMAIL_ADDRESS_ field
  4. Set EMAIL_PERMISSION_STATUS_ to I (opted in)
  5. Fill in any other fields needed for personalization
  6. Save

Load seeds via CSV (Load from File)

  1. Select the Profile List in Data > Profile Lists
  2. Click Load from File
  3. Upload your CSV file
  4. Configure delimiter and field name mappings
  5. Set merge rule: match on EMAIL_ADDRESS_, update on match, insert if no match
  6. 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)

  1. Open the Campaign in the Campaign Designer
  2. In the Audience section, find the Seed List option
  3. Select your Seed Group
  4. 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)

  1. Open the Campaign in the Campaign Designer
  2. Click Proof Launch in the launch panel
  3. In Proof Settings, select your Proof Group from the Proof List dropdown
  4. 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 address
  • EMAIL_PERMISSION_STATUS_ = I (opted in). Contacts with O (opted out) are excluded from marketing sends.
  • EMAIL_DELIVERABILITY_STATUS_ must not be U (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 typeHow it firesSeed approach
Scheduled FilterA Filter runs on a schedule, matching contacts enterSet seed fields to satisfy the Filter at the scheduled run time
Scheduled SQL ViewA saved SQL view runs on a scheduleEnsure the seed is included in the SQL view result
Customer ActivatedFires when a new record is added or opt-in status changes to IInsert new seed record or change EMAIL_PERMISSION_STATUS_ to I
Customer DeactivatedFires when opt-in status changes to O (opt-out)Not used for seed entry
Custom EventAPI-triggered entryCall POST /rest/api/v1.3/events/{eventName} with seed's data
REI EventReal-time API-triggered entryCall 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 from O to I
  • 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 optionalData or 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 custom BIRTH_MONTH and BIRTH_DAY numeric fields)
  • Or: anniversary_of(BIRTH_DATE, 'years') = today if 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_DATE field 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_DATE to 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

ScopeLimit
Auth tokenValid 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 request200 recipients per request
Async merge (large loads)Processes as background job, poll job status
Throttling response on overrunAPI_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 termWhat it means
Profile ListThe 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 TableA one-to-many data table linked to Profile List records (e.g., order line items, cart contents).
Proof Group / Seed GroupA special list for receiving test sends before or during live Campaign launches.
Seed ListA list attached to a Campaign or Program Campaign Activity that receives copies during the live send, excluded from performance reporting.
Seed LaunchThe 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 DesignerThe visual interface for creating and launching email Campaigns.
Program CanvasThe visual interface for building automated multi-step Program workflows.
Campaign Activity nodeA Program Canvas node that sends a message (email, SMS, etc.) to contacts at that step.
Timer nodeA Program Canvas node that pauses contact progression for a set duration or until a date.
Data Switch nodeA 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 EventA named API-triggered Program entry point defined in Account Management.
REI EventResponsys 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 AnalysisAnalytics 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