- Documentation
Loops integration
Sync contacts, trigger event-based emails, and send transactional messages on behalf of your clients' Loops accounts.
What it does
The Loops integration lets your agency drive a client's email program from inside a workflow. Connect a client's Loops API key once and your workflows can create, update, look up, and delete contacts in Loops, send events that fire Loops workflows ("loops"), dispatch transactional emails against published templates, and react in real time when Loops posts an outbound webhook (transactional delivery, opens, clicks, contact lifecycle).
Connect a Loops account
- Open your workspace in TaskJuice and navigate to Connections.
- Choose Loops and click Connect.
- In a new tab, open the Loops API settings page signed in as the client (or as your agency, if the client has delegated key creation to you).
- Click Generate Key, name it for the workspace, copy the value, and paste it into TaskJuice.
- Save the connection.
To rotate or revoke the key, return to the Loops API settings page, delete the entry, generate a new key, and update the TaskJuice connection.
Triggers
loops/email-eventfires when Loops posts an outbound webhook for an email-lifecycle event (delivered, bounced, opened, clicked, unsubscribed) on a transactional send, campaign, or workflow message. One POST is one event.loops/contact-eventfires when Loops posts an outbound webhook for a contact-lifecycle event (created, unsubscribed, deleted, mailing-list subscription changed). One POST is one event.
Each trigger publishes an inbound URL. Paste it into Loops under Settings, Webhooks, subscribe the event types you care about, and set the inbound Authorization header to a shared secret you also paste into the TaskJuice trigger. Loops sends that exact header value on every POST and TaskJuice verifies it before activating the workflow.
Actions
loops/create-contactcreates a new contact with an email and optional contact properties.loops/update-contactupdates an existing contact identified by email or userId, or creates one when no match is found.loops/find-contactlooks up a contact by email or userId. Returns an empty array when no contact matches.loops/delete-contactpermanently deletes a contact by email or userId.loops/send-eventsends an event with optional event and contact properties, triggering any matching workflows in Loops.loops/send-transactionalsends a transactional email through a published transactional template, with optional data variables, attachments, and an Idempotency-Key.
Known limitations
- Loops enforces a global outbound webhook rate ceiling of 10 events per second. When traffic spikes above that ceiling, Loops queues events on its side and delivers them at the limit. The inbound activation cadence in TaskJuice mirrors that queue.
- Transactional sends accept an optional
Idempotency-Keyheader. Reusing the same key within 24 hours returns 409 Conflict, which the action surfaces as a non-retryableALREADY_EXISTSerror. Pick a stable key per send (e.g., the workflow run ID) when you want at-most-once delivery. - The contact creation endpoint returns 409 Conflict when a contact with the email already exists. Use Update Contact instead when you want upsert semantics.
- The Find Contact action returns at most one matching contact and an empty array when none match. There is no list-all-contacts endpoint in the Loops API, so polling across the full audience is not supported.
- Inbound webhook verification uses a shared
Authorizationheader value (configured per trigger). Loops' native HMAC-SHA256 signing requires unwrapping a prefixed base64 secret and parsing multi-signature rotation headers, which sits outside the declarative integration envelope. Treat the shared header value as the secret and rotate it alongside the API key.