When a workflow runs, contextual data about what triggered it is available through the trigger object. This page documents every trigger type and the fields available for each.
Using Trigger Context
Access trigger data in any workflow node that supports Liquid:
{% if trigger . type == "form_submission" %}
Thanks for submitting {{ trigger . form_submission . form_name }} !
{% endif %}
The trigger.type field identifies what triggered the workflow, allowing you to create conditional content that adapts to different trigger sources.
Trigger Types
Trigger Type Description form_submissionA form was submitted page_visitA page was visited email_sentAn email was sent email_deliveredAn email was delivered email_openedAn email was opened email_bouncedAn email bounced email_link_clickedA link in an email was clicked contact_createdA new contact was created contact_updatedA contact field value changed company_updatedA company field value changed added_to_audienceContact was added to an audience removed_from_audienceContact was removed from an audience opportunity_createdAn opportunity was created opportunity_updatedAn opportunity was updated opportunity_role_addedContact was added to an opportunity opportunity_role_changedContact’s opportunity role changed object_createdA custom object was created object_updatedA custom object was updated object_relationship_changedA custom object relationship changed custom_eventA custom event was tracked apiWorkflow was triggered via API
Triggered when a contact submits a form.
{% if trigger . type == "form_submission" %}
Thanks for submitting {{ trigger . form_submission . form_name }} !
{% endif %}
Available Fields
Field Description trigger.form_submission.form_nameName of the form trigger.form_submission.form_idUnique identifier of the form trigger.form_submission.page_urlURL where the form was submitted trigger.form_submission.submitted_atTimestamp of submission (ISO 8601)
Submitted Field Values
Access any field from the form submission through the .fields namespace:
{{ trigger . form_submission . fields . company_size }}
{{ trigger . form_submission . fields . use_case }}
{{ trigger . form_submission . fields . phone }}
Field values are nested under .fields to avoid conflicts between submission data and form metadata. For example, if a form has a field named “form_name”, it’s accessible at trigger.form_submission.fields.form_name without overwriting the actual form name.
Example
Hi {{ contact . first_name }} ,
Thanks for requesting a demo!
{% if trigger . form_submission . fields . company_size == "Enterprise" %}
I'll have our enterprise team reach out within 24 hours to schedule a call.
{% else %}
I'll follow up shortly with some times to connect.
{% endif %}
Page Visits
Triggered when a contact visits a tracked page.
{% if trigger . type == "page_visit" %}
They visited {{ trigger . page_visit . page_url }}
{% endif %}
Available Fields
Field Description trigger.page_visit.page_urlURL of the visited page trigger.page_visit.referrerReferring URL (if available) trigger.page_visit.typeVisit type (direct, organic, paid, etc.) trigger.page_visit.utm_sourceUTM source parameter (if available) trigger.page_visit.utm_mediumUTM medium parameter (if available) trigger.page_visit.utm_campaignUTM campaign parameter (if available) trigger.page_visit.utm_termUTM term parameter (if available) trigger.page_visit.visited_atTimestamp of visit (ISO 8601)
Example
💰 Pricing Page Visit
{{ contact . first_name }} {{ contact . last_name }} from * {{ company . name }} * just viewed the pricing page.
*Contact:* {{ contact . email }}
*Title:* {{ contact . job_title | default: "Unknown" }}
{% if trigger . page_visit . utm_campaign %}
*Campaign:* {{ trigger . page_visit . utm_campaign }}
{% endif %}
Email Events
All email event triggers share common email metadata through trigger.email. Each event type also has event-specific fields.
Common Email Fields
These fields are available for all email triggers:
Field Description trigger.email.idEmail asset ID trigger.email.sent_email_idUnique identifier for this specific send trigger.email.nameName of the email in Conversion trigger.email.sent_atTimestamp when email was sent (ISO 8601)
Email Sent
Triggered when an email is sent to a contact.
{% if trigger . type == "email_sent" %}
{{ trigger . email . name }} was just sent
{% endif %}
Email Delivered
Triggered when an email is successfully delivered.
Field Description trigger.email.delivered_atTimestamp of delivery (ISO 8601)
Email Opened
Triggered when a contact opens an email.
Field Description trigger.email.opened_atTimestamp of open (ISO 8601)
Email Bounced
Triggered when an email bounces.
Field Description trigger.email.bounced_atTimestamp of bounce (ISO 8601) trigger.email.bounce_typeType of bounce (hard, soft)
Email Link Clicked
Triggered when a contact clicks a link in an email.
Field Description trigger.email.link.urlURL that was clicked trigger.email.link.clicked_atTimestamp of click (ISO 8601)
Example
📧 Email Engagement
{{ contact . first_name }} {{ contact . last_name }} clicked a link in * {{ trigger . email . name }} *
*Company:* {{ company . name }}
*Link:* {{ trigger . email . link . url }}
Triggered when a new contact is created in Conversion.
{% if trigger . type == "contact_created" %}
New contact: {{ contact . email }}
{% endif %}
Available Fields
Field Description trigger.contact.created_atTimestamp of creation (ISO 8601) trigger.contact.sourceHow the contact was created (e.g., “form”, “api”, “import”)
Example
🆕 New Lead
*Name:* {{ contact . first_name }} {{ contact . last_name }}
*Email:* {{ contact . email }}
*Company:* {{ company . name }}
*Title:* {{ contact . job_title | default: "Not provided" }}
*Source:* {{ trigger . contact . source }}
Triggered when a contact field value changes.
{% if trigger . type == "contact_updated" %}
{{ contact . email }} was updated
{% endif %}
Available Fields
Field Description trigger.contact._changed.<field>Boolean indicating if the field changed trigger.contact._previous.<field>Previous value of the field before update
Example
{% if trigger . contact . _changed . job_title %}
👔 Title Change Detected
*Contact:* {{ contact . first_name }} {{ contact . last_name }} ( {{ contact . email }} )
*Company:* {{ company . name }}
*Previous Title:* {{ trigger . contact . _previous . job_title }}
*New Title:* {{ contact . job_title }}
{% if contact . job_title contains "Director" or contact . job_title contains "VP" or contact . job_title contains "Head" %}
🎉 This looks like a promotion! Consider reaching out to congratulate them.
{% endif %}
{% endif %}
Company Updated
Triggered when a company field value changes.
{% if trigger . type == "company_updated" %}
{{ company . name }} was updated
{% endif %}
Available Fields
Field Description trigger.company._changed.<field>Boolean indicating if the field changed trigger.company._previous.<field>Previous value of the field before update
Example
{% if trigger . company . _changed . number_of_employees %}
📈 Company Update
*Company:* {{ company . name }}
*Previous Size:* {{ trigger . company . _previous . number_of_employees }} employees
*New Size:* {{ company . number_of_employees }} employees
{% endif %}
Audience Changes
Triggered when a contact is added to or removed from an audience.
Added to Audience
{% if trigger . type == "added_to_audience" %}
Added to {{ trigger . audience . name }}
{% endif %}
Removed from Audience
{% if trigger . type == "removed_from_audience" %}
Removed from {{ trigger . audience . name }}
{% endif %}
Available Fields
Field Description trigger.audience.idUnique identifier of the audience trigger.audience.nameName of the audience
Example
🎯 New MQL
{{ contact . first_name }} {{ contact . last_name }} was added to * {{ trigger . audience . name }} *.
*Email:* {{ contact . email }}
*Company:* {{ company . name }}
*Title:* {{ contact . job_title | default: "Not provided" }}
Opportunity Events
Triggered when opportunities are created or updated.
Opportunity Created
Triggered when a new opportunity is created.
{% if trigger . type == "opportunity_created" %}
New opportunity: {{ trigger . opportunity . name }}
{% endif %}
Opportunity Updated
Triggered when an opportunity field value changes.
{% if trigger . type == "opportunity_updated" %}
{{ trigger . opportunity . name }} has been updated
{% endif %}
Available Fields
For all opportunity triggers:
Field Description trigger.opportunity.nameName of the opportunity trigger.opportunity.amountDeal amount trigger.opportunity.stageCurrent stage trigger.opportunity.<field>Any field on the opportunity
For opportunity_updated, access changed field information:
Field Description trigger.opportunity._changed.<field>Boolean indicating if field changed trigger.opportunity._previous.<field>Previous value of the field
Example
{% if trigger . opportunity . _changed . stage %}
🚀 Deal Update
*Opportunity:* {{ trigger . opportunity . name }}
*Company:* {{ company . name }}
*Amount:* {{ trigger . opportunity . amount }}
*Previous Stage:* {{ trigger . opportunity . _previous . stage }}
*New Stage:* {{ trigger . opportunity . stage }}
{% if trigger . opportunity . stage == "Closed Won" %}
🎉 Deal closed! Time to kick off onboarding.
{% endif %}
{% endif %}
Opportunity Role Events
Triggered when a contact’s relationship to an opportunity changes.
Opportunity Role Added
Triggered when a contact is added to an opportunity (given an Opportunity Contact Role).
{% if trigger . type == "opportunity_role_added" %}
{{ contact . first_name }} was added to {{ trigger . opportunity . name }}
{% endif %}
Opportunity Role Changed
Triggered when a contact’s role on an opportunity changes.
{% if trigger . type == "opportunity_role_changed" %}
{{ contact . first_name }} 's role on {{ trigger . opportunity . name }} changed
{% endif %}
Available Fields
Field Description trigger.opportunity.nameName of the opportunity trigger.opportunity.amountDeal amount trigger.opportunity.stageCurrent stage trigger.opportunity_role.roleThe contact’s role (e.g., “Decision Maker”) trigger.opportunity_role.is_primaryWhether this is the primary contact
For opportunity_role_changed, access changed field information:
Field Description trigger.opportunity_role._changed.<field>Boolean indicating if role field changed trigger.opportunity_role._previous.<field>Previous value of the role field
Example
👥 New Stakeholder
A new contact was added to * {{ trigger . opportunity . name }} *:
*Contact:* {{ contact . first_name }} {{ contact . last_name }}
*Title:* {{ contact . job_title | default: "Not provided" }}
*Role:* {{ trigger . opportunity_role . role | default: "Not specified" }}
{% if trigger . opportunity_role . is_primary %}
⭐ Primary contact
{% endif %}
Custom Object Events
Triggered when custom objects are created, updated, or when relationships change.
Object Created
Triggered when a new custom object is created.
{% if trigger . type == "object_created" %}
New {{ trigger . object . type }} : {{ trigger . object . name }}
{% endif %}
Object Updated
Triggered when a custom object field value changes.
{% if trigger . type == "object_updated" %}
{{ trigger . object . name }} has been updated
{% endif %}
Object Relationship Changed
Triggered when the relationship between a contact and custom object changes.
{% if trigger . type == "object_relationship_changed" %}
Relationship to {{ trigger . object . name }} changed
{% endif %}
Available Fields
For all custom object triggers:
Field Description trigger.object.idUnique identifier of the triggering object trigger.object.typeThe custom object type (e.g., “product”, “subscription”) trigger.object.<field>Any field on the triggering custom object trigger.object._relationship.<field>Relationship fields between contact and object
For object_updated, access changed field information:
Field Description trigger.object._changed.<field>Boolean indicating if field changed trigger.object._previous.<field>Previous value of the field
For object_relationship_changed, access relationship change details:
Field Description trigger.object._relationship._changed.<field>Boolean indicating if relationship field changed trigger.object._relationship._previous.<field>Previous value of the relationship field
Example
{% if trigger . object . type == "subscription" %}
{% if trigger . object . _changed . status %}
🔔 Subscription Update
*Contact:* {{ contact . first_name }} {{ contact . last_name }}
*Company:* {{ company . name }}
*Plan:* {{ trigger . object . plan_name }}
*Previous Status:* {{ trigger . object . _previous . status }}
*New Status:* {{ trigger . object . status }}
{% endif %}
{% endif %}
Custom Events
Triggered when a custom event is tracked for a contact.
{% if trigger . type == "custom_event" %}
Event: {{ trigger . custom_event . name }}
{% endif %}
Available Fields
Field Description trigger.custom_event.nameThe event name trigger.custom_event.typeThe event type trigger.custom_event.idConversion’s assigned unique ID trigger.custom_event.timestampWhen the event occurred (ISO 8601)
Custom Properties
Access any custom property sent with the event through the .data namespace:
{{ trigger . custom_event . data . feature_name }}
{{ trigger . custom_event . data . plan_name }}
{{ trigger . custom_event . data . usage_count }}
Custom properties are nested under .data to avoid conflicts between event data and event metadata.
Example
{% if trigger . custom_event . name == "feature_activated" %}
✨ Feature Adoption
{{ contact . first_name }} {{ contact . last_name }} from * {{ company . name }} * activated * {{ trigger . custom_event . data . feature_name }} *.
{% endif %}
API Triggers
Triggered when a workflow is started via the API.
{% if trigger . type == "api" %}
Processing {{ trigger . api . name }}
{% endif %}
Available Fields
Field Description trigger.api.nameThe name provided in the API request (required) trigger.api.timestampWhen the request was received (ISO 8601)
Request Payload
Access any custom field sent in the API request through the .data namespace:
{{ trigger . api . data . campaign_id }}
{{ trigger . api . data . source_system }}
{{ trigger . api . data . assigned_owner }}
Request payload fields are nested under .data to avoid conflicts with request metadata, following the same pattern as form submissions and custom events.
Example
Hi {{ contact . first_name }} ,
You're registered for * {{ trigger . api . data . webinar_title }} *!
*Date:* {{ trigger . api . data . webinar_date }}
*Time:* {{ trigger . api . data . webinar_time }}
We'll send a reminder the day before.
Handling Multiple Trigger Types
Use trigger.type with case statements to handle multiple trigger types in a single workflow:
{% case trigger . type %}
{% when "form_submission" %}
New form submission: {{ trigger . form_submission . form_name }}
{% when "email_link_clicked" %}
{{ contact . first_name }} clicked a link in {{ trigger . email . name }}
{% when "opportunity_updated" %}
{% if trigger . opportunity . _changed . stage %}
{{ trigger . opportunity . name }} moved to {{ trigger . opportunity . stage }}
{% endif %}
{% else %}
Activity from {{ contact . first_name }} {{ contact . last_name }}
{% endcase %}
Frequently Asked Questions
What happens if I reference a trigger field that doesn't exist for this trigger type?
If your Liquid syntax is valid but references a trigger field that doesn’t apply to the current trigger type (e.g., using trigger.form_submission.form_name when the workflow was triggered by a page visit), the expression evaluates to an empty string. Use trigger.type checks to ensure you’re accessing the right fields.
Why are form fields under .fields and event properties under .data?
These namespaces prevent conflicts between user-provided data and system metadata. For example, if a form has a field named “form_name”, it won’t overwrite trigger.form_submission.form_name—it’s safely accessible at trigger.form_submission.fields.form_name.
How do I check if a specific field changed in an update trigger?
Use the _changed namespace. For example, trigger.contact._changed.job_title returns true if the job title field changed. You can then access the previous value with trigger.contact._previous.job_title.
Are timestamps in a specific timezone?
All timestamps are returned in UTC in ISO 8601 format. Use the date filter to format them for display.