SendGrid: Telltide Seed Address Guide
Place Telltide seeds in SendGrid contact lists and Marketing Campaigns automations.
SendGrid Marketing Campaigns has a significant constraint for automation monitoring: contacts added to a list before an automation was set to "Live" do not receive the automation emails. Only contacts added after activation are eligible. This means seeds must be added to the automation's entry list after the automation goes live - not before. Plan your activation sequence accordingly.
Quick reference
| Send type | Where to add seeds | Complexity |
|---|---|---|
| Scheduled (Single Send) | Add seed contact to any list or segment targeted in the Single Send | Low |
| Ongoing (Automation) | Add seed contact to the automation's entry list after the automation is set to Live | Medium |
1. Scheduled / one-off sends (Single Sends)
SendGrid Single Sends are one-off campaigns. The audience is defined by selecting contact lists and/or segments. Seeds must be in at least one targeted list or segment.
Where to add seed addresses
Add the seed contact to any contact list selected as a recipient in the Single Send. The simplest approach: maintain a "Telltide Seeds" contact list and include it in every Single Send's recipient selection.
The instructions below split into two paths. Use the Non-technical path if you work in CRM or Lifecycle and add contacts through the Marketing Campaigns UI. Use the Technical path if you are an email-developer or ops engineer enrolling seeds programmatically.
Non-technical path
For CRM and Lifecycle managers without dev access. No code required.
Option A: Add a seed contact manually via UI
- Navigate to Marketing > Contacts > Add Contacts > Manual Add
- Enter the seed email address
- Fill in any additional fields: first name, last name, custom field values
- Select the list(s) to add this contact to (or add to "All Contacts" and add to a list separately)
- Click Add Contacts
Option B: Add a seed contact via CSV upload
- Navigate to Marketing > Contacts > Add Contacts > Upload CSV
- Select or create the target list
- Upload your CSV file. The email column header must be exactly
email(lowercase) - Map additional columns to SendGrid contact fields or custom fields
- Click Add Contacts. Contacts are queued for upload (asynchronous processing)
Required CSV header: email
Optional headers: first_name, last_name, address_line_1, address_line_2, city, state_province_region, postal_code, country, phone_number, whatsapp, line, facebook, unique_name, plus any custom field column names you've defined.
Note: phone_number_id is a contact identifier (one of the four primary keys, alongside email, external_id, anonymous_id), not a normal optional profile field. Use phone_number for storing a phone value.
Option C: Capture the seed via a public sign-up form
If your team uses SendGrid sign-up forms to grow lists, you can submit the seed address through the same sign-up form that real subscribers use. Open the public form URL, enter the seed email, and complete any required fields. The seed lands in the form's target list automatically. This is useful when you want the seed to follow the exact same intake path as real customers (including any double opt-in confirmation step).
Technical path
For email-developer and ops engineers enrolling seeds programmatically through the v3 Marketing API.
Add a seed contact via API
PUT https://api.sendgrid.com/v3/marketing/contacts
Authorization: Bearer {{api_key}}
Content-Type: application/json
{
"list_ids": ["{{list_id}}"],
"contacts": [
{
"email": "seed@example.com",
"first_name": "Seed",
"last_name": "Monitor",
"custom_fields": {
"e1_T": "value_for_custom_text_field"
}
}
]
}
Or via curl:
curl -X PUT https://api.sendgrid.com/v3/marketing/contacts \
-H "Authorization: Bearer $SENDGRID_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"list_ids": ["LIST_ID"],
"contacts": [
{ "email": "seed@example.com", "first_name": "Seed", "last_name": "Monitor" }
]
}'
This is an asynchronous upsert. The response is 202 Accepted with a body containing { "job_id": "..." }. The 202 means the contact is queued, not stored, so retry and idempotency logic should not treat it as a synchronous success. The contact is available after processing completes. Always poll the job_id until status is completed before assuming the seed appears in a Single Send's recipient count. Processing typically takes seconds but can take 15 minutes or more during peak load and occasionally hangs, so do not assume immediate availability. Check job status:
GET https://api.sendgrid.com/v3/marketing/contacts/imports/{job_id}
Custom field references in API: Custom field IDs use the format {field_id}_{field_type} (e.g., e1_T for a text field, e2_N for a number field). Retrieve field IDs from:
GET https://api.sendgrid.com/v3/marketing/field_definitions
Always-on flow coverage
Always-on or triggered flows in SendGrid are built as Automations. Unlike a Single Send, you cannot attach a recipient list to a single message inside an Automation, so the seed has to satisfy the Automation's entry condition before any of its emails will reach it. Pick the approach that matches the Automation's entry criterion:
- Entry criterion is "first time added to a list": Add the seed to that exact entry list (after the Automation is set to Live, see Section 2). Every contact added to the entry list, including the seed, is enrolled and walks through the full series. Maintaining one shared "Telltide Seeds" list will not work here unless the entry list is the seeds list itself; the seed must be a member of the configured entry list.
- Entry criterion is "first time added to a segment": Make the seed match the segment's filter criteria. Typically this means setting the seed's reserved fields or custom-field values so the segment query evaluates true, then waiting for the segment to refresh (1 hour for active segments, up to 24 hours for inactive). Segment-triggered Automations do not fire instantly; budget for the refresh delay when validating coverage. If you need predictable seed timing on an always-on flow, change the Automation to a list-based entry and use the bullet above.
- Single Send broadcasts via the UI (one-off, not always-on): No special configuration is needed. Just keep the seed in any audience list selected as a recipient in the Single Send.
To confirm coverage, query the Automation's entry list (or run the segment query) for the seed's contact_id before activating, and re-check after each refresh cycle if you are using a segment.
Profile attributes required
Seeds need:
email(required)first_name,last_nameif used in personalization- Values for any custom fields referenced in email content
Ensuring seeds receive the same version as real recipients
Exclusions: Single Sends allow exclusion of up to 5 segments and 50 lists. Verify the seed is not in any excluded list or segment.
If a contact is on multiple targeted lists: They receive the email only once (deduplication is automatic).
Unsubscribe mechanism: Each Single Send is configured with one of: an unsubscribe group, a custom unsubscribe link, or the global unsubscribe link. If a group is used, check the seed's status in that group. If the global unsubscribe link is used, only GET /v3/asm/suppressions/global/{email} matters. If a custom link is used, check whatever suppression list the customer's link writes to. A seed that is globally unsubscribed will not receive the email regardless of which mechanism is configured.
Gotchas
Global unsubscribes override everything: A seed that is globally unsubscribed (opted out of all email) will not receive any Single Send regardless of list membership. A seed can also be silently suppressed by other categories. Check the full set:
GET /v3/asm/suppressions/global/{email}, global unsubscribeGET /v3/suppression/bounces/{email}, bouncesGET /v3/suppression/blocks/{email}, blocksGET /v3/suppression/invalid_emails/{email}, invalidGET /v3/suppression/spam_reports/{email}, spam reportsGET /v3/asm/suppressions/{email}, all group unsubscribes for this email
Unsubscribe group conflicts with Subscription Tracking: Do not enable the "Subscription Tracking" setting (Settings > Tracking > Subscription Tracking) if you use Marketing Campaigns. These two systems conflict with each other.
2. Ongoing / automated journeys (Automations)
SendGrid Marketing Campaigns Automations are time-delayed email series triggered by a contact being added to a specific list or segment.
How Automations work
Each automation has:
- Entry criteria: One list (or segment) addition event - the "first time a contact is added to [list]"
- Email series: Multiple emails with configurable time delays between them
- Live state required: Contacts added before the automation was set to Live do not receive emails. Only additions after activation are eligible.
Critical workflow for seed monitoring
Never add seeds to the entry list before going Live. The correct sequence is:
- Build the automation and set it to Live
- After confirmation the automation is Live, add the seed contact to the entry list
- The seed enters the automation and begins receiving the email series
Step-by-step: Set automation to Live and add seed
- Navigate to Marketing > Automations and open the target automation
- Open the Automation Options dropdown and select Set Live to activate it
- Confirm the automation status shows "Live"
- Navigate to Marketing > Contacts and add the seed contact to the automation's entry list (using any method from Section 1)
- The seed begins receiving the automation emails according to the configured delay schedule
Automation trigger types and limitations
SendGrid Marketing Campaigns automations have one of two entry criteria:
| Entry criterion | Description |
|---|---|
| First time added to a list | Triggers when a contact is added to the specified contact list |
| First time added to a segment | Triggers when a contact first qualifies for the specified segment |
Note: segment entry is evaluated only when the segment refreshes, which ranges from every 1 hour for active segments to every 24 hours for inactive segments. For reliable seed timing, prefer a list-based entry list.
SendGrid Automations do NOT natively support:
- Date-based triggers (birthday, anniversary)
- Behavioral triggers (abandoned cart, browse abandonment, purchase events)
- Custom event triggers
For birthday, cart abandonment, or post-purchase automation monitoring in SendGrid, you need either:
- A third-party integration that manages these triggers externally and adds contacts to SendGrid lists at the right moment, OR
- The SendGrid v3 Mail Send API (
POST /v3/mail/send) for transactional sends - which is managed entirely outside the Marketing Campaigns automation builder
Profile requirements per journey type
Welcome automation (list-addition trigger):
- Seed: email address, added to entry list after automation is Live
- No additional attributes needed beyond personalization fields in the email
Date-based automations (birthday, anniversary):
- Not natively supported in SendGrid Automations
- Workaround: Build an external system that adds contacts to a "birthday trigger" list on the day of their birthday. The automation triggers when the contact is added to that list.
- Seed approach: Create a "Birthday Trigger" list. Add the seed to this list on the day you want to test. The automation fires.
Abandoned cart / post-purchase:
- Not natively supported in SendGrid Automations
- Use the transactional
POST /v3/mail/sendendpoint for these use cases:
POST https://api.sendgrid.com/v3/mail/send
Authorization: Bearer {{api_key}}
Content-Type: application/json
{
"personalizations": [
{
"to": [{ "email": "seed@example.com" }],
"dynamic_template_data": {
"first_name": "Seed",
"cart_total": "49.99",
"product_name": "Widget Pro",
"cart_url": "https://yourstore.com/cart"
}
}
],
"from": { "email": "sender@yourdomain.com", "name": "Your Brand" },
"template_id": "d-xxxxxxxxxxxx",
"asm": {
"group_id": 12345
}
}
For transactional sends, seed monitoring is straightforward: include the seed address as a recipient in the API call.
Ensuring seeds progress through the full automation
Entry is once only (default): Contacts can only enter an automation once under the "first time added to list" trigger. To re-test the automation with the same seed:
- Remove the seed from the entry list
- Wait for the removal to process
- Re-add the seed to the entry list
The automation treats the re-addition as a new entry event.
Alternatively: Create a duplicate test automation with a separate entry list. Add the seed to the test automation's list. This isolates testing from the production automation.
Mid-automation email edits: Edits to a Live automation only apply to contacts who enter after the edit. Contacts already mid-series continue receiving the previously generated content. To verify edited content with a seed, you must trigger a new entry (remove and re-add).
Unsubscribe group check at each email: If the seed unsubscribes from the unsubscribe group between email 1 and email 2, they will not receive email 2 or beyond.
How to reset seeds for repeated automation testing
Remove and re-add: Remove the seed from the entry list (DELETE /v3/marketing/lists/{list_id}/contacts), then re-add them. This creates a new entry event.
Use a different seed address per cycle: Create seed@example.com, seed2@example.com, etc. Each is a fresh contact with no automation history.
Remove the seed contact from the automation's processed list: SendGrid does not expose a direct API to clear a contact's automation history. The remove-and-re-add method is the supported approach.
3. Platform-specific considerations
API options
Create or update contacts (upsert):
PUT https://api.sendgrid.com/v3/marketing/contacts
Authorization: Bearer {{api_key}}
Asynchronous. Returns a job_id. Check status with GET /v3/marketing/contacts/imports/{job_id}.
Create a contact list:
POST https://api.sendgrid.com/v3/marketing/lists
Add contacts to a list:
PUT https://api.sendgrid.com/v3/marketing/contacts
(Include list_ids in the request body)
Remove contacts from a list:
DELETE https://api.sendgrid.com/v3/marketing/lists/{id}/contacts?contact_ids={ids}
contact_ids is a comma-separated list of contact UUIDs (not email addresses), for example ?contact_ids=id1,id2. Look up the contact_id first via POST /v3/marketing/contacts/search before calling this endpoint.
Search contacts:
POST https://api.sendgrid.com/v3/marketing/contacts/search
{
"query": "email LIKE 'seed%'"
}
Transactional email send:
POST https://api.sendgrid.com/v3/mail/send
Synchronous, immediate send. Used for transactional emails outside the automation builder.
Check global unsubscribe:
GET https://api.sendgrid.com/v3/asm/suppressions/global/{email}
Remove from global unsubscribe:
DELETE https://api.sendgrid.com/v3/asm/suppressions/global/{email}
Get all custom field definitions:
GET https://api.sendgrid.com/v3/marketing/field_definitions
API key location: Settings > API Keys > Create API Key. For Marketing Campaigns, the key needs "Marketing" permission scope.
Rate limits
SendGrid rate limits are per-endpoint, not global. Most v3 endpoints return 429 with a Retry-After header when exceeded. /v3/mail/send does not enforce a per-second rate limit but is bound by your plan's daily and monthly volume. Some Marketing Campaigns endpoints (for example, segment refresh) have very tight per-day limits, so consult the official rate-limits page before bulk operations. Monitor X-RateLimit-Limit and X-RateLimit-Remaining headers where they are returned.
PUT /v3/marketing/contacts accepts batches up to 30,000 contacts or 6 MB per request.
Duplicate contact handling
Email address is the unique identifier. Sending PUT /v3/marketing/contacts with an existing email updates the contact's data rather than creating a duplicate. A contact can be on multiple lists simultaneously - they are counted once for billing regardless of how many lists they appear on.
Platform-specific terminology
| SendGrid term | What it means |
|---|---|
| Single Send | A one-time email campaign sent to a defined audience (equivalent to a blast or campaign). |
| Automation | A triggered time-delayed email series. Trigger is always list or segment addition. |
| Contact List | A static list of contacts (equivalent to a List in other platforms). |
| Segment | A dynamic filter-based grouping of contacts in All Contacts (equivalent to a dynamic segment). |
| Unsubscribe Group | A category of email communications that contacts can opt out of independently. One option for the unsubscribe mechanism on a Single Send, alongside a custom unsubscribe link or the global unsubscribe link. |
| Global Unsubscribe | An account-level opt-out - the contact receives no email from your account regardless of group. |
| Subscription Tracking | A legacy SendGrid feature that conflicts with Marketing Campaigns. Do not enable when using Marketing Campaigns. |
| Template | A reusable email design. Dynamic templates use Handlebars for personalization. |
| Dynamic Template Data | Per-recipient variable values passed in API calls to populate Handlebars variables in templates. |
| job_id | A reference ID returned by asynchronous Marketing Campaigns API operations (contact uploads, etc.). |
Known limitations and workarounds
No native date-based, cart abandonment, or behavioral triggers. SendGrid Marketing Campaigns Automations only trigger on list/segment addition. Use external systems to add contacts to trigger lists at the right moment, or use the transactional POST /v3/mail/send API for these email types.
Contacts added before automation goes Live are not eligible. This is the most important constraint for seed timing. Always activate the automation before adding seeds.
The contacts upload is asynchronous. After calling PUT /v3/marketing/contacts, the contact is not immediately available or included in sends. Processing typically takes seconds but can take longer during peak load. Check job status before assuming the contact is ready.
Removing a contact from a list and re-adding re-triggers the automation. This is both the limitation (accidental re-trigger) and the workaround (intentional reset for re-testing).
Subscription Tracking conflicts with Marketing Campaigns. If "Subscription Tracking" is enabled (Settings > Tracking > Subscription Tracking), it interferes with the unsubscribe mechanism in Marketing Campaigns. Disable it if you're using the Marketing Campaigns product.
Custom field IDs are not human-readable. Custom fields are referenced in the API by internal IDs (e.g., e1_T). Retrieve these from GET /v3/marketing/field_definitions before building seed management scripts.
Start monitoring your Twilio SendGrid sends
Place a Telltide seed in your Twilio SendGrid audience, and we will tell you when an expected email did not land.
Start free