# Loops (/integrations/loops)





{/* MANUAL-CONTENT-START:intro */}

Use [Loops](https://loops.so/) to manage contacts, send transactional emails, and trigger email sequences with events. Update Contact creates a contact when no match exists. Configure an API key from Loops **Settings > API** before selecting an operation.

{/* MANUAL-CONTENT-END */}

## Use the block [#usage-instructions]

Create and manage contacts, send transactional emails, and trigger event-based automations.

## Actions [#actions]

### Loops Create Contact [#loops-create-contact]

Create a new contact in your Loops audience with an email address and optional properties like name, user group, and mailing list subscriptions.

<ReferenceDetails>
  #### Input [#input]

  | Parameter | Type | Required | Description |
  | - | - | - | - |
  | `apiKey` | string | Yes | Loops API key for authentication |
  | `email` | string | Yes | The email address for the new contact |
  | `firstName` | string | No | The contact first name |
  | `lastName` | string | No | The contact last name |
  | `source` | string | No | Custom source value replacing the default "API" |
  | `subscribed` | boolean | No | Whether the contact receives campaign emails (defaults to true) |
  | `userGroup` | string | No | Group to segment the contact into (one group per contact) |
  | `userId` | string | No | Unique user identifier from your application |
  | `mailingLists` | json | No | Mailing list IDs mapped to boolean values (true to subscribe, false to unsubscribe) |
  | `customProperties` | json | No | Custom contact properties as key-value pairs (string, number, boolean, or date values) |

  #### Output [#output]

  | Parameter | Type | Description |
  | - | - | - |
  | `success` | boolean | Whether the contact was created successfully |
  | `id` | string | The Loops-assigned ID of the created contact |
</ReferenceDetails>

### Loops Update Contact [#loops-update-contact]

Update an existing contact in Loops by email or userId. Creates a new contact if no match is found (upsert). Can update name, subscription status, user group, mailing lists, and custom properties.

<ReferenceDetails>
  #### Input [#input-1]

  | Parameter | Type | Required | Description |
  | - | - | - | - |
  | `apiKey` | string | Yes | Loops API key for authentication |
  | `email` | string | No | The contact email address (at least one of email or userId is required) |
  | `userId` | string | No | The contact userId (at least one of email or userId is required) |
  | `firstName` | string | No | The contact first name |
  | `lastName` | string | No | The contact last name |
  | `source` | string | No | Custom source value replacing the default "API" |
  | `subscribed` | boolean | No | Whether the contact receives campaign emails (sending true re-subscribes unsubscribed contacts) |
  | `userGroup` | string | No | Group to segment the contact into (one group per contact) |
  | `mailingLists` | json | No | Mailing list IDs mapped to boolean values (true to subscribe, false to unsubscribe) |
  | `customProperties` | json | No | Custom contact properties as key-value pairs (send null to reset a property) |

  #### Output [#output-1]

  | Parameter | Type | Description |
  | - | - | - |
  | `success` | boolean | Whether the contact was updated successfully |
  | `id` | string | The Loops-assigned ID of the updated or created contact |
</ReferenceDetails>

### Loops Find Contact [#loops-find-contact]

Find a contact in Loops by email address or userId. Returns an array of matching contacts with all their properties including name, subscription status, user group, and mailing lists.

<ReferenceDetails>
  #### Input [#input-2]

  | Parameter | Type | Required | Description |
  | - | - | - | - |
  | `apiKey` | string | Yes | Loops API key for authentication |
  | `email` | string | No | The contact email address to search for (at least one of email or userId is required) |
  | `userId` | string | No | The contact userId to search for (at least one of email or userId is required) |

  #### Output [#output-2]

  | Parameter | Type | Description |
  | - | - | - |
  | `contacts` | array | Array of matching contact objects (empty array if no match found) |
  | ↳ `id` | string | Loops-assigned contact ID |
  | ↳ `email` | string | Contact email address |
  | ↳ `firstName` | string | Contact first name |
  | ↳ `lastName` | string | Contact last name |
  | ↳ `source` | string | Source the contact was created from |
  | ↳ `subscribed` | boolean | Whether the contact receives campaign emails |
  | ↳ `userGroup` | string | Contact user group |
  | ↳ `userId` | string | External user identifier |
  | ↳ `mailingLists` | object | Mailing list IDs mapped to subscription status |
  | ↳ `optInStatus` | string | Double opt-in status: pending, accepted, rejected, or null |
</ReferenceDetails>

### Loops Delete Contact [#loops-delete-contact]

Delete a contact from Loops by email address or userId. At least one identifier must be provided.

<ReferenceDetails>
  #### Input [#input-3]

  | Parameter | Type | Required | Description |
  | - | - | - | - |
  | `apiKey` | string | Yes | Loops API key for authentication |
  | `email` | string | No | The email address of the contact to delete (at least one of email or userId is required) |
  | `userId` | string | No | The userId of the contact to delete (at least one of email or userId is required) |

  #### Output [#output-3]

  | Parameter | Type | Description |
  | - | - | - |
  | `success` | boolean | Whether the contact was deleted successfully |
  | `message` | string | Status message from the API |
</ReferenceDetails>

### Loops Send Transactional Email [#loops-send-transactional-email]

Send a transactional email to a recipient using a Loops template. Supports dynamic data variables for personalization and optionally adds the recipient to your audience.

<ReferenceDetails>
  #### Input [#input-4]

  | Parameter | Type | Required | Description |
  | - | - | - | - |
  | `apiKey` | string | Yes | Loops API key for authentication |
  | `email` | string | Yes | The email address of the recipient |
  | `transactionalId` | string | Yes | The ID of the transactional email template to send |
  | `dataVariables` | json | No | Template data variables as key-value pairs (string or number values) |
  | `addToAudience` | boolean | No | Whether to create the recipient as a contact if they do not already exist (default: false) |
  | `attachments` | json | No | Array of file attachments. Each object must have filename (string), contentType (MIME type string), and data (base64-encoded string). |

  #### Output [#output-4]

  | Parameter | Type | Description |
  | - | - | - |
  | `success` | boolean | Whether the transactional email was sent successfully |
</ReferenceDetails>

### Loops Send Event [#loops-send-event]

Send an event to Loops to trigger automated email sequences for a contact. Identify the contact by email or userId and include optional event properties and mailing list changes.

<ReferenceDetails>
  #### Input [#input-5]

  | Parameter | Type | Required | Description |
  | - | - | - | - |
  | `apiKey` | string | Yes | Loops API key for authentication |
  | `email` | string | No | The email address of the contact (at least one of email or userId is required) |
  | `userId` | string | No | The userId of the contact (at least one of email or userId is required) |
  | `eventName` | string | Yes | The name of the event to trigger |
  | `eventProperties` | json | No | Event data as key-value pairs (string, number, boolean, or date values) |
  | `mailingLists` | json | No | Mailing list IDs mapped to boolean values (true to subscribe, false to unsubscribe) |

  #### Output [#output-5]

  | Parameter | Type | Description |
  | - | - | - |
  | `success` | boolean | Whether the event was sent successfully |
</ReferenceDetails>

### Loops List Mailing Lists [#loops-list-mailing-lists]

Retrieve all mailing lists from your Loops account. Returns each list with its ID, name, description, and public/private status.

<ReferenceDetails>
  #### Input [#input-6]

  | Parameter | Type | Required | Description |
  | - | - | - | - |
  | `apiKey` | string | Yes | Loops API key for authentication |

  #### Output [#output-6]

  | Parameter | Type | Description |
  | - | - | - |
  | `mailingLists` | array | Array of mailing list objects |
  | ↳ `id` | string | The mailing list ID |
  | ↳ `name` | string | The mailing list name |
  | ↳ `description` | string | The mailing list description (null if not set) |
  | ↳ `isPublic` | boolean | Whether the list is public or private |
</ReferenceDetails>

### Loops List Transactional Emails [#loops-list-transactional-emails]

Retrieve a list of published transactional email templates from your Loops account. Returns each template with its ID, name, created/updated timestamps, and data variables.

<ReferenceDetails>
  #### Input [#input-7]

  | Parameter | Type | Required | Description |
  | - | - | - | - |
  | `apiKey` | string | Yes | Loops API key for authentication |
  | `perPage` | string | No | Number of results per page (10-50, default: 20) |
  | `cursor` | string | No | Pagination cursor from a previous response to fetch the next page |

  #### Output [#output-7]

  | Parameter | Type | Description |
  | - | - | - |
  | `transactionalEmails` | array | Array of published transactional email templates |
  | ↳ `id` | string | The transactional email template ID |
  | ↳ `name` | string | The template name |
  | ↳ `createdAt` | string | Creation timestamp (ISO 8601) |
  | ↳ `updatedAt` | string | Last updated timestamp (ISO 8601) |
  | ↳ `lastUpdated` | string | Deprecated alias of updatedAt, kept for backwards compatibility |
  | ↳ `dataVariables` | array | Template data variable names |
  | `pagination` | object | Pagination information |
  | ↳ `totalResults` | number | Total number of results |
  | ↳ `returnedResults` | number | Number of results returned |
  | ↳ `perPage` | number | Results per page |
  | ↳ `totalPages` | number | Total number of pages |
  | ↳ `nextCursor` | string | Cursor for next page (null if no more pages) |
  | ↳ `nextPage` | string | URL for next page (null if no more pages) |
</ReferenceDetails>

### Loops Create Contact Property [#loops-create-contact-property]

Create a new custom contact property in your Loops account. The property name must be in camelCase format.

<ReferenceDetails>
  #### Input [#input-8]

  | Parameter | Type | Required | Description |
  | - | - | - | - |
  | `apiKey` | string | Yes | Loops API key for authentication |
  | `name` | string | Yes | The property name in camelCase format (e.g., "favoriteColor") |
  | `type` | string | Yes | The property data type (e.g., "string", "number", "boolean", "date") |

  #### Output [#output-8]

  | Parameter | Type | Description |
  | - | - | - |
  | `success` | boolean | Whether the contact property was created successfully |
</ReferenceDetails>

### Loops List Contact Properties [#loops-list-contact-properties]

Retrieve a list of contact properties from your Loops account. Returns each property with its key, label, and data type. Can filter to show all properties or only custom ones.

<ReferenceDetails>
  #### Input [#input-9]

  | Parameter | Type | Required | Description |
  | - | - | - | - |
  | `apiKey` | string | Yes | Loops API key for authentication |
  | `list` | string | No | Filter type: "all" for all properties (default) or "custom" for custom properties only |

  #### Output [#output-9]

  | Parameter | Type | Description |
  | - | - | - |
  | `properties` | array | Array of contact property objects |
  | ↳ `key` | string | The property key (camelCase identifier) |
  | ↳ `label` | string | The property display label |
  | ↳ `type` | string | The property data type (string, number, boolean, date) |
</ReferenceDetails>

### Loops Check Contact Suppression [#loops-check-contact-suppression]

Check whether a Loops contact is on the suppression list (bounced, complained, or unsubscribed) by email address or userId.

<ReferenceDetails>
  #### Input [#input-10]

  | Parameter | Type | Required | Description |
  | - | - | - | - |
  | `apiKey` | string | Yes | Loops API key for authentication |
  | `email` | string | No | The contact email address to check (at least one of email or userId is required) |
  | `userId` | string | No | The contact userId to check (at least one of email or userId is required) |

  #### Output [#output-10]

  | Parameter | Type | Description |
  | - | - | - |
  | `contactId` | string | The Loops-assigned contact ID |
  | `email` | string | The contact email address |
  | `userId` | string | The contact userId |
  | `isSuppressed` | boolean | Whether the contact is on the suppression list |
  | `removalQuotaLimit` | number | Total suppression-removal quota for the team |
  | `removalQuotaRemaining` | number | Remaining suppression-removal quota for the team |
</ReferenceDetails>

### Loops Remove Contact Suppression [#loops-remove-contact-suppression]

Remove a Loops contact from the suppression list by email address or userId, allowing them to receive emails again. Subject to a team removal quota.

<ReferenceDetails>
  #### Input [#input-11]

  | Parameter | Type | Required | Description |
  | - | - | - | - |
  | `apiKey` | string | Yes | Loops API key for authentication |
  | `email` | string | No | The contact email address to remove from suppression (at least one of email or userId is required) |
  | `userId` | string | No | The contact userId to remove from suppression (at least one of email or userId is required) |

  #### Output [#output-11]

  | Parameter | Type | Description |
  | - | - | - |
  | `success` | boolean | Whether the contact was removed from suppression successfully |
  | `message` | string | Status message from the API |
  | `removalQuotaLimit` | number | Total suppression-removal quota for the team |
  | `removalQuotaRemaining` | number | Remaining suppression-removal quota for the team |
</ReferenceDetails>

### Loops Get Transactional Email [#loops-get-transactional-email]

Retrieve a single transactional email template from your Loops account by its ID, including its data variables and draft/published message IDs.

<ReferenceDetails>
  #### Input [#input-12]

  | Parameter | Type | Required | Description |
  | - | - | - | - |
  | `apiKey` | string | Yes | Loops API key for authentication |
  | `transactionalId` | string | Yes | The ID of the transactional email template to retrieve |

  #### Output [#output-12]

  | Parameter | Type | Description |
  | - | - | - |
  | `id` | string | The transactional email template ID |
  | `name` | string | The template name |
  | `draftEmailMessageId` | string | ID of the draft email message, if any |
  | `publishedEmailMessageId` | string | ID of the published email message, if any |
  | `transactionalGroupId` | string | ID of the transactional group this template belongs to, if any |
  | `createdAt` | string | Creation timestamp (ISO 8601) |
  | `updatedAt` | string | Last updated timestamp (ISO 8601) |
  | `dataVariables` | array | Template data variable names |
</ReferenceDetails>

## Triggers [#triggers]

A trigger starts a workflow when a supported event occurs in this service.

### Loops Campaign Email Sent [#loops-campaign-email-sent]

Trigger workflow when a Loops campaign email is sent

<ReferenceDetails label="Configuration and outputs">
  #### Configuration [#configuration]

  | Parameter | Type | Required | Description |
  | - | - | - | - |
  | `signingSecret` | string | Yes | Required to verify the webhook signature from Loops. |

  #### Output [#output-13]

  | Parameter | Type | Description |
  | - | - | - |
  | `eventName` | string | Event type (e.g., campaign.email.sent, loop.email.sent, transactional.email.sent) |
  | `eventTime` | number | Unix timestamp (seconds) when the event occurred |
  | `webhookSchemaVersion` | string | Webhook schema version (e.g., "1.0.0") |
  | `campaignId` | string | Campaign ID, present on campaign.email.sent |
  | `campaignName` | string | Campaign name, present on campaign.email.sent |
  | `loopId` | string | Loop (workflow) ID, present on loop.email.sent |
  | `loopName` | string | Loop (workflow) name, present on loop.email.sent |
  | `transactionalId` | string | Transactional email ID, present on transactional.email.sent |
  | `email` | json | Email object from the payload (id, emailMessageId, subject) |
  | `emailId` | string | Unique email ID (payload `email.id`) |
  | `emailMessageId` | string | Sent email message ID (payload `email.emailMessageId`) |
  | `subject` | string | Email subject line (payload `email.subject`) |
  | `contactIdentity` | json | Contact identity object from the payload (id, email, userId) |
  | `contactId` | string | Contact ID (payload `contactIdentity.id`) |
  | `contactEmail` | string | Contact email address (payload `contactIdentity.email`) |
  | `userId` | string | Contact user ID, when set (payload `contactIdentity.userId`) |
  | `mailingLists` | json | Mailing lists the send targeted (id, name, description, isPublic); present on campaign and loop sends |
</ReferenceDetails>

### Loops Email Clicked [#loops-email-clicked]

Trigger workflow when a link in a Loops email is clicked

<ReferenceDetails label="Configuration and outputs">
  #### Configuration [#configuration-1]

  | Parameter | Type | Required | Description |
  | - | - | - | - |
  | `signingSecret` | string | Yes | Required to verify the webhook signature from Loops. |

  #### Output [#output-14]

  | Parameter | Type | Description |
  | - | - | - |
  | `eventName` | string | Event type (e.g., email.delivered, email.opened, email.clicked) |
  | `eventTime` | number | Unix timestamp (seconds) when the event occurred |
  | `webhookSchemaVersion` | string | Webhook schema version (e.g., "1.0.0") |
  | `sourceType` | string | Source of the email: "campaign", "loop", or "transactional" |
  | `campaignId` | string | Campaign ID, present when sourceType is "campaign" |
  | `loopId` | string | Loop (workflow) ID, present when sourceType is "loop" |
  | `transactionalId` | string | Transactional email ID, present when sourceType is "transactional" |
  | `email` | json | Email object from the payload (id, emailMessageId, subject) |
  | `emailId` | string | Unique email ID (payload `email.id`) |
  | `emailMessageId` | string | Sent email message ID (payload `email.emailMessageId`) |
  | `subject` | string | Email subject line (payload `email.subject`) |
  | `contactIdentity` | json | Contact identity object from the payload (id, email, userId) |
  | `contactId` | string | Contact ID (payload `contactIdentity.id`) |
  | `contactEmail` | string | Contact email address (payload `contactIdentity.email`) |
  | `userId` | string | Contact user ID, when set (payload `contactIdentity.userId`) |
</ReferenceDetails>

### Loops Email Delivered [#loops-email-delivered]

Trigger workflow when a Loops email is delivered

<ReferenceDetails label="Configuration and outputs">
  #### Configuration [#configuration-2]

  | Parameter | Type | Required | Description |
  | - | - | - | - |
  | `signingSecret` | string | Yes | Required to verify the webhook signature from Loops. |

  #### Output [#output-15]

  | Parameter | Type | Description |
  | - | - | - |
  | `eventName` | string | Event type (e.g., email.delivered, email.opened, email.clicked) |
  | `eventTime` | number | Unix timestamp (seconds) when the event occurred |
  | `webhookSchemaVersion` | string | Webhook schema version (e.g., "1.0.0") |
  | `sourceType` | string | Source of the email: "campaign", "loop", or "transactional" |
  | `campaignId` | string | Campaign ID, present when sourceType is "campaign" |
  | `loopId` | string | Loop (workflow) ID, present when sourceType is "loop" |
  | `transactionalId` | string | Transactional email ID, present when sourceType is "transactional" |
  | `email` | json | Email object from the payload (id, emailMessageId, subject) |
  | `emailId` | string | Unique email ID (payload `email.id`) |
  | `emailMessageId` | string | Sent email message ID (payload `email.emailMessageId`) |
  | `subject` | string | Email subject line (payload `email.subject`) |
  | `contactIdentity` | json | Contact identity object from the payload (id, email, userId) |
  | `contactId` | string | Contact ID (payload `contactIdentity.id`) |
  | `contactEmail` | string | Contact email address (payload `contactIdentity.email`) |
  | `userId` | string | Contact user ID, when set (payload `contactIdentity.userId`) |
</ReferenceDetails>

### Loops Email Hard Bounced [#loops-email-hard-bounced]

Trigger workflow when a Loops email hard bounces

<ReferenceDetails label="Configuration and outputs">
  #### Configuration [#configuration-3]

  | Parameter | Type | Required | Description |
  | - | - | - | - |
  | `signingSecret` | string | Yes | Required to verify the webhook signature from Loops. |

  #### Output [#output-16]

  | Parameter | Type | Description |
  | - | - | - |
  | `eventName` | string | Event type (e.g., email.delivered, email.opened, email.clicked) |
  | `eventTime` | number | Unix timestamp (seconds) when the event occurred |
  | `webhookSchemaVersion` | string | Webhook schema version (e.g., "1.0.0") |
  | `sourceType` | string | Source of the email: "campaign", "loop", or "transactional" |
  | `campaignId` | string | Campaign ID, present when sourceType is "campaign" |
  | `loopId` | string | Loop (workflow) ID, present when sourceType is "loop" |
  | `transactionalId` | string | Transactional email ID, present when sourceType is "transactional" |
  | `email` | json | Email object from the payload (id, emailMessageId, subject) |
  | `emailId` | string | Unique email ID (payload `email.id`) |
  | `emailMessageId` | string | Sent email message ID (payload `email.emailMessageId`) |
  | `subject` | string | Email subject line (payload `email.subject`) |
  | `contactIdentity` | json | Contact identity object from the payload (id, email, userId) |
  | `contactId` | string | Contact ID (payload `contactIdentity.id`) |
  | `contactEmail` | string | Contact email address (payload `contactIdentity.email`) |
  | `userId` | string | Contact user ID, when set (payload `contactIdentity.userId`) |
</ReferenceDetails>

### Loops Email Opened [#loops-email-opened]

Trigger workflow when a Loops email is opened

<ReferenceDetails label="Configuration and outputs">
  #### Configuration [#configuration-4]

  | Parameter | Type | Required | Description |
  | - | - | - | - |
  | `signingSecret` | string | Yes | Required to verify the webhook signature from Loops. |

  #### Output [#output-17]

  | Parameter | Type | Description |
  | - | - | - |
  | `eventName` | string | Event type (e.g., email.delivered, email.opened, email.clicked) |
  | `eventTime` | number | Unix timestamp (seconds) when the event occurred |
  | `webhookSchemaVersion` | string | Webhook schema version (e.g., "1.0.0") |
  | `sourceType` | string | Source of the email: "campaign", "loop", or "transactional" |
  | `campaignId` | string | Campaign ID, present when sourceType is "campaign" |
  | `loopId` | string | Loop (workflow) ID, present when sourceType is "loop" |
  | `transactionalId` | string | Transactional email ID, present when sourceType is "transactional" |
  | `email` | json | Email object from the payload (id, emailMessageId, subject) |
  | `emailId` | string | Unique email ID (payload `email.id`) |
  | `emailMessageId` | string | Sent email message ID (payload `email.emailMessageId`) |
  | `subject` | string | Email subject line (payload `email.subject`) |
  | `contactIdentity` | json | Contact identity object from the payload (id, email, userId) |
  | `contactId` | string | Contact ID (payload `contactIdentity.id`) |
  | `contactEmail` | string | Contact email address (payload `contactIdentity.email`) |
  | `userId` | string | Contact user ID, when set (payload `contactIdentity.userId`) |
</ReferenceDetails>

### Loops Email Soft Bounced [#loops-email-soft-bounced]

Trigger workflow when a Loops email soft bounces

<ReferenceDetails label="Configuration and outputs">
  #### Configuration [#configuration-5]

  | Parameter | Type | Required | Description |
  | - | - | - | - |
  | `signingSecret` | string | Yes | Required to verify the webhook signature from Loops. |

  #### Output [#output-18]

  | Parameter | Type | Description |
  | - | - | - |
  | `eventName` | string | Event type (e.g., email.delivered, email.opened, email.clicked) |
  | `eventTime` | number | Unix timestamp (seconds) when the event occurred |
  | `webhookSchemaVersion` | string | Webhook schema version (e.g., "1.0.0") |
  | `sourceType` | string | Source of the email: "campaign", "loop", or "transactional" |
  | `campaignId` | string | Campaign ID, present when sourceType is "campaign" |
  | `loopId` | string | Loop (workflow) ID, present when sourceType is "loop" |
  | `transactionalId` | string | Transactional email ID, present when sourceType is "transactional" |
  | `email` | json | Email object from the payload (id, emailMessageId, subject) |
  | `emailId` | string | Unique email ID (payload `email.id`) |
  | `emailMessageId` | string | Sent email message ID (payload `email.emailMessageId`) |
  | `subject` | string | Email subject line (payload `email.subject`) |
  | `contactIdentity` | json | Contact identity object from the payload (id, email, userId) |
  | `contactId` | string | Contact ID (payload `contactIdentity.id`) |
  | `contactEmail` | string | Contact email address (payload `contactIdentity.email`) |
  | `userId` | string | Contact user ID, when set (payload `contactIdentity.userId`) |
</ReferenceDetails>

### Loops Loop Email Sent [#loops-loop-email-sent]

Trigger workflow when a Loops loop email is sent

<ReferenceDetails label="Configuration and outputs">
  #### Configuration [#configuration-6]

  | Parameter | Type | Required | Description |
  | - | - | - | - |
  | `signingSecret` | string | Yes | Required to verify the webhook signature from Loops. |

  #### Output [#output-19]

  | Parameter | Type | Description |
  | - | - | - |
  | `eventName` | string | Event type (e.g., campaign.email.sent, loop.email.sent, transactional.email.sent) |
  | `eventTime` | number | Unix timestamp (seconds) when the event occurred |
  | `webhookSchemaVersion` | string | Webhook schema version (e.g., "1.0.0") |
  | `campaignId` | string | Campaign ID, present on campaign.email.sent |
  | `campaignName` | string | Campaign name, present on campaign.email.sent |
  | `loopId` | string | Loop (workflow) ID, present on loop.email.sent |
  | `loopName` | string | Loop (workflow) name, present on loop.email.sent |
  | `transactionalId` | string | Transactional email ID, present on transactional.email.sent |
  | `email` | json | Email object from the payload (id, emailMessageId, subject) |
  | `emailId` | string | Unique email ID (payload `email.id`) |
  | `emailMessageId` | string | Sent email message ID (payload `email.emailMessageId`) |
  | `subject` | string | Email subject line (payload `email.subject`) |
  | `contactIdentity` | json | Contact identity object from the payload (id, email, userId) |
  | `contactId` | string | Contact ID (payload `contactIdentity.id`) |
  | `contactEmail` | string | Contact email address (payload `contactIdentity.email`) |
  | `userId` | string | Contact user ID, when set (payload `contactIdentity.userId`) |
  | `mailingLists` | json | Mailing lists the send targeted (id, name, description, isPublic); present on campaign and loop sends |
</ReferenceDetails>

### Loops Transactional Email Sent [#loops-transactional-email-sent]

Trigger workflow when a Loops transactional email is sent

<ReferenceDetails label="Configuration and outputs">
  #### Configuration [#configuration-7]

  | Parameter | Type | Required | Description |
  | - | - | - | - |
  | `signingSecret` | string | Yes | Required to verify the webhook signature from Loops. |

  #### Output [#output-20]

  | Parameter | Type | Description |
  | - | - | - |
  | `eventName` | string | Event type (e.g., campaign.email.sent, loop.email.sent, transactional.email.sent) |
  | `eventTime` | number | Unix timestamp (seconds) when the event occurred |
  | `webhookSchemaVersion` | string | Webhook schema version (e.g., "1.0.0") |
  | `campaignId` | string | Campaign ID, present on campaign.email.sent |
  | `campaignName` | string | Campaign name, present on campaign.email.sent |
  | `loopId` | string | Loop (workflow) ID, present on loop.email.sent |
  | `loopName` | string | Loop (workflow) name, present on loop.email.sent |
  | `transactionalId` | string | Transactional email ID, present on transactional.email.sent |
  | `email` | json | Email object from the payload (id, emailMessageId, subject) |
  | `emailId` | string | Unique email ID (payload `email.id`) |
  | `emailMessageId` | string | Sent email message ID (payload `email.emailMessageId`) |
  | `subject` | string | Email subject line (payload `email.subject`) |
  | `contactIdentity` | json | Contact identity object from the payload (id, email, userId) |
  | `contactId` | string | Contact ID (payload `contactIdentity.id`) |
  | `contactEmail` | string | Contact email address (payload `contactIdentity.email`) |
  | `userId` | string | Contact user ID, when set (payload `contactIdentity.userId`) |
  | `mailingLists` | json | Mailing lists the send targeted (id, name, description, isPublic); present on campaign and loop sends |
</ReferenceDetails>
