ActiveCampaign: Telltide Seed Address Guide
Place Telltide seeds in ActiveCampaign lists and automations.
ActiveCampaign's automation system uses per-list subscription statuses rather than a global unsubscribe flag. The critical constraint for seeds: a contact unsubscribed from a list cannot be re-subscribed via an automation action, the step silently skips with a log note. Use fresh seed addresses that have never unsubscribed from any list in your account, and manage re-entry through the automation's entry settings rather than by unsubscribing and resubscribing.
Quick reference
| Send type | Where to add seeds | Complexity |
|---|---|---|
| Scheduled (Campaign) | Add seed contact to the list(s) selected as the campaign audience | Low |
| Ongoing (Automation) | Add seed to the trigger list, apply the trigger tag, or fire the trigger event | Medium |
1. Scheduled / one-off sends (Campaigns)
ActiveCampaign Campaigns (Standard/Broadcast type) send to one or more lists. A seed contact must be on at least one list selected as the campaign's audience, with Active subscription status.
Where to add seed addresses
Add the seed contact to any list included in the campaign's audience selection. If the campaign also applies a Segment filter, the seed's contact fields must satisfy that filter.
Non-technical path
Use the ActiveCampaign UI to create the seed and place it on the right list. No engineering required.
Create a seed contact (Contacts UI):
- Navigate to Contacts in the left navigation.
- Click Add a contact (or the + button, top right).
- In the modal, fill in: - Email (required) - First name, Last name (for personalization) - Phone (optional)
- Click Add.
- In the Contact Actions screen that follows, click Add to Lists.
- Select the list(s) for this contact and confirm.
Add an existing contact to a list (from contact profile):
- Open the contact record (Contacts > search for contact > click name).
- Find the Lists section in the contact info panel.
- Click Add to Lists.
- Select the list(s) and click Apply.
Bulk add from the Contacts index:
- Navigate to Contacts.
- Select contacts via checkboxes.
- Click Bulk action > Subscribe to List.
- Select the list and click Apply.
CSV import:
- Go to Contacts > Import Contacts > Upload CSV.
- Map columns including the list assignment.
- Complete the import wizard. Imported contacts arrive on the chosen list as Active.
Form sign-up:
- Navigate to Site > Forms > Create a form.
- Choose a form type (Inline, Floating Bar, Modal, or Floating Box).
- Set the Action to Subscribe to a list and pick the target list.
- If the form uses double opt-in, switch the form to single opt-in (Options > Opt-in) so the seed becomes Active immediately. Otherwise the seed stays at Unconfirmed until it clicks the confirmation email, which Telltide can deliver if the seed mailbox is configured.
- Publish the form (Embed, Direct link, or Share) and submit it once with the seed's email to register it.
Technical path
Use the REST API v3 to provision and manage seeds at scale. Base URL is https://{account}.api-us1.com. Authenticate every request with the Api-Token header.
Create or update a contact:
POST https://{account}.api-us1.com/api/3/contacts
Api-Token: {{api_key}}
Content-Type: application/json
{
"contact": {
"email": "seed@example.com",
"firstName": "Telltide",
"lastName": "Seed",
"phone": ""
}
}
Email is the unique key. Repeat calls for the same email update the existing record (upsert).
Subscribe the contact to a list:
POST https://{account}.api-us1.com/api/3/contactLists
Api-Token: {{api_key}}
Content-Type: application/json
{
"contactList": {
"list": "LIST_ID",
"contact": "CONTACT_ID",
"status": 1
}
}
status: 1 = subscribe, status: 2 = unsubscribe. LIST_ID is the numeric list ID (Lists > select list, ID is in the URL). CONTACT_ID comes from the create response or GET /api/3/contacts?email=seed@example.com.
Look up a contact by email:
GET https://{account}.api-us1.com/api/3/contacts?email=seed@example.com
Api-Token: {{api_key}}
Bulk import (for many seeds at once):
POST /api/3/import/bulk_import accepts up to 100 contacts per request and is rate limited separately (see Rate limits below). Prefer this over per-contact calls when seeding many lists.
Profile attributes required
Seeds need:
- Email address
- Active subscription status on the target list
- Values for any personalization fields referenced in the campaign email (if empty, fields render blank or with fallback text)
Ensuring seeds receive the same version as real recipients
Campaign type: Split Test. Seeds will be randomly assigned to one split variant. To monitor all variants, you need one seed per variant.
Segment filters applied to the campaign: If the campaign targets a segment of the list (e.g., "subscribers in New York"), the seed must satisfy the segment conditions. Add the relevant contact field values to the seed profile, or use a list with no segment filter for simpler monitoring.
Exclusion list (account-level): The Exclusion List in ActiveCampaign blocks email delivery entirely for any address added to it. Verify the seed address is not on the Exclusion List (Settings > Contacts > Exclusion List).
Gotchas
Bounced status: Contacts with Bounced status on a list (1 hard bounce or 3 consecutive soft bounces) do not receive emails. Use fresh seed addresses that have not bounced in any previous send.
Contact statuses per list: Status is tracked per contact per list. A contact can be Active on List A and Unsubscribed on List B simultaneously. The campaign audience includes only Active contacts on the targeted list(s).
2. Ongoing / automated journeys (Automations)
ActiveCampaign Automations are triggered workflows. Automation entry is controlled by the trigger configuration and the entry settings ("Any number of times," "Only once," or "Only after they have exited").
Always-on flow coverage
To monitor an Automation continuously, the seed must satisfy the entry trigger and any segment filter on that trigger. ActiveCampaign's primitives behave as follows:
- Lists: a contact has a per-list status (Active, Unsubscribed, Bounced, Unconfirmed). The "Subscribes to a list" trigger fires when status flips to Active on the chosen list.
- Tags: a free-form label applied to a contact. The "Tag is added" trigger fires every time the tag is applied (even if it was applied and removed previously).
- Segments: saved filters on top of one or more lists. They are not triggers themselves, but they appear under "Segment the contacts entering this automation" on most triggers, narrowing entry.
- Custom fields: per-contact data used in segment filters and date triggers.
Make sure the seed satisfies entry:
- Open the automation. Note the trigger type and the list, tag, segment, or field it references.
- Add the seed via the matching mechanism (subscribe it to the trigger list, apply the trigger tag, set the trigger date field, or submit the trigger form).
- If the trigger has "Segment the contacts entering this automation" enabled, inspect each segment condition and ensure the seed's contact fields satisfy them.
Add OR criteria so seeds always qualify:
If the segment on the entry trigger is narrow (for example "Country = United States AND Last Purchase > $100"), the seed will not enter unless its data matches. You have two options:
- Add an OR branch in the segment. Open the segment block on the trigger and add a new condition group joined by OR:
Tag EXISTS "telltide-seed". Apply thetelltide-seedtag to every seed. The seed enters whenever the tag is present, real contacts continue to enter via the original conditions. - Tag-based parallel trigger. Add a second trigger to the same automation: "Tag is added" =
telltide-seed. Triggers on an automation are OR'd together, so this lets seeds enter without touching the production segment at all. Set entry to "Any number of times" if you want repeat coverage.
Coverage checklist per automation:
- Seed exists as an Active contact, never Unsubscribed or Bounced on any referenced list.
- Seed satisfies every condition in the entry segment, or an OR branch / parallel tag trigger has been added.
- Entry setting is "Any number of times" or "Only after they have exited" so the seed can re-enter for repeat monitoring.
- For multi-step automations with internal If/Else branches, the seed's field values route it down the branch you want monitored. Add seeds to each branch if all branches send email.
Creating trap profiles
Create the seed contact first (Section 1 process), then trigger automation entry by satisfying the trigger condition.
Automation entry triggers and seed approaches
| Trigger | How it fires | Seed approach |
|---|---|---|
| Subscribes to a list | Contact is added to a specific list | Add seed to the trigger list |
| Tag is added | A specified tag is applied to the contact | Apply the tag to the seed |
| Event is recorded | A custom site-tracking event occurs | Fire the event via Site Tracking (requires tracking setup) |
| Date based | Fires on/around a date custom field, annually | Set the date field on the seed |
| Abandons cart | Ecommerce Deep Data cart abandonment | Create an abandoned cart record via API |
| Makes a purchase | Ecommerce Deep Data purchase completion | Create an order record via API |
| Submits a form | Contact submits an ActiveCampaign form | Submit the form with the seed email |
| Page/site is visited | Site Tracking detects a page visit | Requires Site Tracking tag installed |
Creating trap profiles per journey type
Welcome / onboarding (List subscription trigger)
- Trigger: "Subscribes to a list" on the trigger list
- Seed requirements: Email address, not previously unsubscribed from the trigger list
- How to trigger: Add the seed contact to the trigger list via the UI or API
- UI: Contact profile > Lists > Add to Lists > select trigger list
- API:
POST /api/3/contactListswithlistid,contactid,status: 1(subscribe) - Entry settings: Set to "Only once" for welcome automations. Seeds enter once. To re-test: manually add the seed to the automation (bypasses entry counting), or use "Any number of times" entry setting during testing.
- Gotcha: If the seed was previously unsubscribed from the trigger list, the "Subscribe contact to List" automation action will silently skip when trying to add them back via automation. The initial manual subscribe (if done from the contact profile) should work regardless of prior unsubscribe status.
Abandoned cart (ecommerce Deep Data trigger)
- Trigger: "Abandons cart". Requires an ecommerce Deep Data integration (a connected store platform or custom API).
- Seed requirements: Email address, an abandoned cart record linked to the seed contact
- How to trigger via API:
POST https://{account}.api-us1.com/api/3/ecomOrders
Api-Token: {{api_key}}
Content-Type: application/json
{
"ecomOrder": {
"source": 1,
"email": "seed@example.com",
"orderNumber": "TEST-CART-001",
"orderUrl": "https://yourstore.com/cart",
"orderDate": "2026-04-15T00:00:00-00:00",
"shippingAmount": "0",
"taxAmount": "0",
"discountAmount": "0",
"currency": "USD",
"connectionid": "{{connection_id}}",
"customerid": "{{customer_id}}",
"externalcheckoutid": "cart-seed-001",
"abandonedDate": "2026-04-15T09:00:00-00:00",
"orderProducts": [
{
"externalid": "SKU-123",
"name": "Widget Pro",
"price": 4999,
"quantity": 1,
"sku": "WIDGET-PRO",
"imageUrl": "https://example.com/img/widget.jpg",
"productUrl": "https://example.com/products/widget-pro"
}
]
}
}
Note: price is in cents (4999 = $49.99). The abandonedDate field marks this as an abandoned cart. The externalcheckoutid must be unique per cart session.
- Connection ID and Customer ID: Obtained from your ActiveCampaign ecommerce connection setup. Navigate to Integrations > ecommerce to find connection IDs.
- Gotcha: Site Tracking (JavaScript tracking script) is required for browse abandonment. The abandoned cart trigger fires based on the cart data pushed via Deep Data API, not site tracking.
Browse abandonment
- Trigger: Site visit trigger + ecommerce integration for product page detection
- Seed requirements: Site Tracking JavaScript installed on your store; seed must visit tracked product pages while identified (cookie linked to email)
- Cannot be easily simulated via pure API. The browse abandonment trigger in ActiveCampaign relies on Site Tracking detecting the page visit and associating it with the contact. Manual browsing with the seed's email is the most reliable approach.
[NEEDS VERIFICATION: whether ActiveCampaign's browse abandonment is configurable via Deep Data API without requiring actual site tracking cookie]
Winback / re-engagement (Date based trigger)
- Trigger: "Date based" referencing a custom date contact field (for example,
Last Purchase Date) - Seed requirements: Email address,
Last Purchase Datecustom field populated with a date in the trigger window - Date format:
YYYY-MM-DD(always this format for API and CSV import, regardless of account date display settings) - Step 1: Create the custom field (if it doesn't exist): 1. Navigate to Settings > Custom Fields (or Contacts > Manage Fields) 2. Click Add Field 3. Type: Date (or Date and Time) 4. Name:
Last Purchase Date5. Save - Step 2: Set the field on the seed contact:
- UI: Contact profile > click the field > enter the date value
- API: Include in the contact update with
fieldValuesarray:
POST https://{account}.api-us1.com/api/3/contacts
Api-Token: {{api_key}}
Content-Type: application/json
{
"contact": {
"email": "seed@example.com",
"fieldValues": [
{ "field": "FIELD_ID", "value": "2025-12-01" }
]
}
}
Replace FIELD_ID with the custom field's numeric ID (visible in the Custom Fields settings or via GET /api/3/fields).
- Trigger configuration: "Date based" trigger > select
Last Purchase Date> "After" > [X days] > "Recurring" (fires annually). Set the seed's date to [X+1] days before today so the trigger fires today or soon.
Post-purchase (ecommerce Makes a purchase trigger)
- Trigger: "Makes a purchase". Requires an ecommerce Deep Data integration.
- Seed requirements: Email address, a purchase order record linked to the seed contact
- How to trigger via API: Same structure as abandoned cart, but without the
abandonedDatefield and with order status set tocomplete:
POST https://{account}.api-us1.com/api/3/ecomOrders
{
"ecomOrder": {
"source": 1,
"email": "seed@example.com",
"orderNumber": "TEST-ORD-001",
"orderDate": "2026-04-15T00:00:00-00:00",
"totalPrice": 4999,
"currency": "USD",
"connectionid": "{{connection_id}}",
"customerid": "{{customer_id}}",
"externalid": "order-seed-001",
"orderStatus": "complete",
"orderProducts": [
{
"externalid": "SKU-123",
"name": "Widget Pro",
"price": 4999,
"quantity": 1
}
]
}
}
Birthday / anniversary (Date based trigger)
- Trigger: "Date based" > referencing the
Birthday(or custom date) contact field > "Recurring annually" (fires each year on the stored month/day) - Seed requirements: Email address,
Birthdaycontact field set to a date - Date format:
YYYY-MM-DDvia API - Set the seed's birthday:
- UI: Contact profile > Birthday field > enter date
- API: Use
fieldValuesin a contact update (same pattern as winback above) - For same-day testing: Set the seed's birthday to today's date. The automation fires today if the trigger is configured to fire "on" the date (not "before" or "after").
Manually adding a seed to an automation
When trigger simulation is impractical, manually add the seed directly to the automation:
From the automation canvas:
- Navigate to Automations > open the target automation
- Click "Add contacts to this automation" (button near the trigger at the top of the canvas)
- Search for and select the seed contact
- The contact enters at step 1
From the contact profile:
- Open the seed contact record
- Scroll to the Automations section in the left panel
- Click + Add
- Select the automation
- Click Okay. The contact enters at step 1 immediately.
From Contacts index (bulk):
- Check contacts in the Contacts list
- Click the more options icon (or kebab menu) > Add to automation
How to reset seeds for repeated automation testing
Option A: Use "Any number of times" entry setting. In the automation settings, set entry to "Any number of times." The seed re-enters every time the trigger condition fires.
Option B: Use "Only after they have exited" entry setting. The seed can re-enter after completing or exiting the automation. Allows one active run at a time.
Option C: Manually add the seed again. Even if the automation entry setting is "Only once," you can still manually add a contact to the automation via the methods above. This bypasses the entry count tracking.
Option D: Remove and re-apply the trigger condition. For tag-based triggers: remove the tag from the seed, then re-add it. For list-based triggers: the seed cannot be unsubscribed and re-subscribed via automation (see constraint above), but manual re-subscription from the contact profile works.
3. Platform-specific considerations
API options
Create a contact:
POST https://{account}.api-us1.com/api/3/contacts
Api-Token: {{api_key}}
Update a contact by ID:
PUT https://{account}.api-us1.com/api/3/contacts/{id}
Look up contact by email:
GET https://{account}.api-us1.com/api/3/contacts?email={email}
Subscribe contact to list:
POST https://{account}.api-us1.com/api/3/contactLists
{
"contactList": {
"list": "LIST_ID",
"contact": "CONTACT_ID",
"status": 1
}
}
status: 1 = subscribe, status: 2 = unsubscribe.
Add tag to contact:
POST https://{account}.api-us1.com/api/3/contactTags
{
"contactTag": {
"contact": "CONTACT_ID",
"tag": "TAG_ID"
}
}
Create ecommerce order:
POST https://{account}.api-us1.com/api/3/ecomOrders
API key location: Settings > Developer (left nav) > API Access > copy the API key.
Account URL: Your ActiveCampaign account URL is https://{account}.activehosted.com. The API base is https://{account}.api-us1.com.
Rate limits
Standard API: 5 requests per second per account. HTTP 429 is returned when exceeded. Implement retry logic with exponential backoff. No burst allowance is documented. Custom higher limits can be requested from ActiveCampaign for high-volume accounts.
Bulk Contact Importer (/api/3/import/bulk_import): separate limits apply. 20 requests per minute when each request contains a single contact, and 100 requests per minute when each request contains multiple contacts (up to 100 per request).
For seeding many lists at once, prefer the bulk importer over per-contact calls.
Suppression and unsubscribe handling
| Status | Effect | Re-subscribe possible? |
|---|---|---|
| Active | Receives emails | N/A |
| Unsubscribed | Does not receive emails from this list | Yes, manually from contact profile, or via new opt-in |
| Bounced | Does not receive emails from this list | Yes, but only after investigating and fixing the email address |
| Exclusion List | Does not receive any email from the account | Yes, remove from Exclusion List (Settings > Exclusion List) |
Key rule: Automation's "Subscribe contact to list" action silently skips contacts previously unsubscribed from that list. Manual re-subscription from the contact profile is required.
Duplicate contact handling
Email address is the unique identifier. If you attempt to create a contact with an existing email, ActiveCampaign updates the existing record (upsert behavior). No error is returned and no duplicate is created.
To merge two contacts (same person, two different email addresses): Contacts > find both contacts > Merge. Merge is irreversible and only two contacts can be merged at a time. No automated deduplication for different-email records.
Platform-specific terminology
| ActiveCampaign term | What it means |
|---|---|
| Automation | A triggered multi-step workflow with emails, waits, conditions, and actions (equivalent to a Flow/Journey/Canvas in other platforms). |
| Campaign | A one-time or scheduled bulk email send to one or more lists (equivalent to a blast or broadcast). |
| List | A subscriber group. Subscription status is tracked per contact per list. |
| Tag | A label applied to contacts used for segmentation and as automation triggers. |
| Segment | A saved filter set applied to a list for campaign targeting. |
| Custom Field | A contact-level data field (Text, Date, Number, Checkbox, etc.) used for personalization and automation triggers. |
| Deep Data | ActiveCampaign's ecommerce data layer connecting order, cart, and product data to contacts. |
| Exclusion List | An account-level block list. Addresses here never receive any email from the account. |
| Entry settings | The automation configuration for how many times a contact can enter: Any number of times / Only once / Only after they have exited. |
| Site Tracking | ActiveCampaign's JavaScript tracking tag for detecting page visits and triggering site-based automations. |
Known limitations and workarounds
Unsubscribed contacts cannot be re-subscribed via automation action. This is the most impactful constraint for seed management. Plan seed lifecycle to avoid any unsubscribe events. If a seed does get unsubscribed, manually change their status from the contact profile.
Browse abandonment requires active Site Tracking. Cannot be simulated purely via API. For seed monitoring of browse abandonment automations, the seed must actually browse your site while identified via the tracking cookie.
Rate limit is low (5 req/sec). If managing many seeds programmatically, implement a queue with rate limiting. Burst imports should use the bulk contact import API endpoint rather than individual contact creation calls.
Deep Data ecommerce triggers require a configured ecommerce connection. The connectionid and customerid fields in the ecommerce order API are specific to your integration setup. Retrieve them from your account's Integrations configuration before attempting to create test orders.
Date field format is always YYYY-MM-DD via API regardless of your account's regional date display format. Do not use MM/DD/YYYY or DD/MM/YYYY in API calls.
Start monitoring your ActiveCampaign sends
Place a Telltide seed in your ActiveCampaign audience, and we will tell you when an expected email did not land.
Start free