Docs/Automations/Triggers & Actions

Triggers & Actions

This page is the complete reference for every trigger and action available in EmailSendX automations. Each trigger section covers when it fires, configuration options, use cases, and any applicable limits.

Trigger: Contact Added to List

Fires when: a contact is added to a specific list — regardless of how they were added (CSV import, API, signup form, manual dashboard add, or automation action).

Configuration

  • List: required. Select the list to monitor. Only one list per automation trigger — create separate automations for multiple lists.
  • Tag filter: optional. Only fire for contacts added to the list who also have a specific tag. Useful when the same list receives both imported and organic signups that need different sequences.

Use cases

  • Welcome sequence for newsletter subscribers
  • Onboarding emails for users added to "Trial Users" list via API
  • Lead nurture sequence for contacts added via a lead magnet form

Notes

  • Does not fire for contacts already in the list who are being updated — only on new additions.
  • Does not fire retrospectively for existing list members when the automation is activated. Only new additions after activation are enrolled.
  • Backfilling existing list members: loop through the list members and call POST /automations/{id}/enroll for each contact. The single-enroll endpoint is idempotent — already-active contacts are skipped automatically.

Trigger: Tag Applied

Fires when: a specific tag is added to a contact. Tags can be applied via the API, an automation action, CSV import with tags, or manually from the contact profile.

Configuration

  • Tag name: the tag that triggers enrollment. Case-insensitive. Must be an exact match.

Use cases

  • Start a trial onboarding sequence when your app tags a user as trial-started
  • Send a win-back sequence when a contact is tagged churned
  • Send a VIP welcome when a contact is upgraded and tagged vip

Notes

  • If the tag is removed and re-applied, the trigger fires again (unless the contact is already actively enrolled).
  • Applying the same tag twice (when it's already present) does not re-fire the trigger.

Trigger: Custom API Event

Fires when: your application sends a named event to the EmailSendX events API for a specific contact. This is the most powerful trigger — it connects EmailSendX to any in-app behavior without requiring contact data changes.

Configuration

  • Event name: the exact name of the event your app will send (e.g., purchase_completed, trial_started, feature_used).
  • Event data filter: optional. Only trigger if the event's data payload matches a condition. For example, only fire if data.plan == "pro".

Sending an event from your app

curl -X POST https://emailsendx.com/api/v1/contacts/CONTACT_ID/events \
  -H "Authorization: Bearer esx_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "purchase_completed",
    "data": {
      "plan": "pro",
      "amount": 99,
      "currency": "USD",
      "invoice_id": "inv_123456"
    }
  }'

Use cases

  • Start a post-purchase sequence when purchase_completed fires
  • Send onboarding tips when trial_started fires
  • Trigger a feature adoption sequence when feature_enabled fires
  • Send a milestone email when usage_milestone fires with data.count == 100

Event data in templates

Data sent with an event can be referenced in template merge tags using the event. prefix. For example, {{event.plan}} would output "pro" from the example above. Event data is available only to the email steps in the automation that was triggered by that event.

Trigger: Date-Based

Fires at: a specific date and time relative to a date stored in a contact's custom date field.

Configuration

  • Custom date field: select a workspace date-type custom field (e.g., renewal_date, birthday).
  • Offset: fire N days/weeks before, on the date, or N days/weeks after the date field value.
  • Time of day: the time in the contact's timezone (or workspace timezone if not set).
  • Repeat annually: for birthday-style triggers, check this to re-enroll the contact each year.

Use cases

  • Renewal reminder: fire 14 days before renewal_date
  • Birthday email: fire on birthday, repeat annually
  • Contract review: fire 30 days before contract_end_date
  • Trial check-in: fire 7 days after trial_start_date
Date-based triggers evaluate daily at the configured time. Contacts whose date field value falls on the trigger date are enrolled. If a contact's date field is updated while they're already enrolled, the current enrollment is not affected — the new date will be evaluated on its day.

Actions Reference

Full table of all available automation actions and their configuration fields:

ActionConfig fieldsNotes
Send EmailTemplate (required), Subject override, From name override, Reply-to overrideCounts toward monthly send limit. Analytics available per step.
Wait / DelayDuration (minutes/hours/days), or "Until time of day" (HH:MM in contact timezone)Contacts are paused here until the wait expires.
Add TagTag nameCreates the tag if it doesn't exist. Case-insensitive.
Remove TagTag nameNo-op if contact doesn't have the tag.
Move to ListTarget list (add), Source list (remove — optional)Adding to list may trigger other automations watching that list.
Branch on ConditionField, Operator, Value — same syntax as segmentsEvaluates at the moment the contact reaches this step.
Update Contact FieldCustom field name, New value (text/number/boolean/date)Overwrites the current value. Use for marking automation progress.
Send WebhookURL, HTTP method (POST/PUT), Headers, Body templatePro/Business plan. Calls an external URL. Useful for Zapier, Slack, CRM sync.
End / ExitNoneExplicitly ends the contact's journey. Optional — contacts also exit when they reach the last step.

Build your first automation

Connect triggers to actions in the visual builder and let EmailSendX handle the rest — no code required.