> ## Documentation Index
> Fetch the complete documentation index at: https://docs.sequenzy.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Make Integration

> Use Sequenzy subscribers, lists, campaigns, email, and events in Make scenarios

# Make Integration

Connect Sequenzy to Make scenarios to react to subscriber, email, SMS, campaign, and sequence activity, manage contacts and lists, record events, send email, enroll contacts in sequences, schedule campaigns, and report on results.

<Note>
  The connector is currently available as a private Make custom app while its
  public Marketplace review is completed. Your workspace administrator must
  install the custom app before you can create a Sequenzy connection.
</Note>

## Connect a workspace

The Make connector accepts only a workspace-scoped API key:

1. Open **Workspace Settings → API Keys** in Sequenzy.
2. Create a key for the Make scenario. New workspace keys start with `seq_live_`.
3. Select the permissions the scenario needs.
4. Create a Sequenzy connection in Make and paste the key.

Account-wide `seq_user_` keys are intentionally rejected. A Make connection stays bound to one workspace, preventing a scenario from silently operating on a different workspace.

| Scenario capability                         | Required permissions                                                   |
| ------------------------------------------- | ---------------------------------------------------------------------- |
| Connect                                     | `account:read`                                                         |
| Read subscribers, notes, and imports        | `subscribers:read`                                                     |
| Create, update, unsubscribe, or import      | `subscribers:write`                                                    |
| Permanently delete subscribers              | `subscribers:delete`                                                   |
| Tag one subscriber                          | `subscribers:write`                                                    |
| Bulk tag or untag many subscribers          | `subscribers:tag`, plus `tags:write` for a tag that does not exist yet |
| Read or create tags                         | `tags:read`, `tags:write`                                              |
| Read or create lists                        | `lists:read`, `lists:write`                                            |
| Add or remove list members                  | `lists:write`, `subscribers:write`                                     |
| Read segments and counts                    | `segments:read`                                                        |
| Record subscriber events                    | `subscribers:write`, `events:write`                                    |
| Start automations from writes or events     | `automations:trigger`                                                  |
| Read sequences                              | `sequences:read`                                                       |
| Enroll or cancel sequence enrollments       | `sequences:enroll`                                                     |
| Read campaigns                              | `campaigns:read`                                                       |
| Schedule or test-send campaigns             | `campaigns:send`                                                       |
| Read metrics, email sends, and suppressions | `analytics:read`                                                       |
| Send transactional or marketing email       | `transactional:send`, plus `transactional:read` for template choices   |
| Push orders and checkouts                   | `commerce:write`                                                       |
| Any instant trigger                         | `webhooks:write`, `webhooks:delete`                                    |

A valid key that lacks a permission produces the API's specific 403 message in Make, not a generic connection error.

## Triggers

Every trigger is instant. Adding it registers a Sequenzy outbound webhook scoped to the events you select, and deleting the trigger removes that endpoint.

| Trigger                               | Starts the scenario when                                                                                       |
| ------------------------------------- | -------------------------------------------------------------------------------------------------------------- |
| **Watch subscriber activity**         | A contact is created, updated, unsubscribed, joins or leaves a list, or is reported invalid                    |
| **Watch email activity**              | An email is sent, delivered, delayed, bounced, fails, is marked as spam, opened, clicked, or unsubscribed from |
| **Watch email replies**               | A recipient replies to a tracked email                                                                         |
| **Watch poll answers**                | A recipient answers a poll or NPS block                                                                        |
| **Watch SMS activity**                | An SMS is sent, delivered, fails, or a contact opts out                                                        |
| **Watch sent campaigns**              | A campaign finishes sending, with its final counts                                                             |
| **Watch finished sequences**          | A contact finishes a sequence, or a sequence run fails                                                         |
| **Watch finished subscriber imports** | An import completes, with reconciled counts and failure reasons                                                |

Select only the event types your scenario needs - opens and clicks are high volume on large sends. If the scenario writes back to Sequenzy, add a filter so its own writes do not retrigger it.

## Actions and searches

**Subscribers**

* **Get a subscriber** and **Get a subscriber by external ID** return one contact's profile, lists, sequence enrollments, notes, email statistics, and recent activity. A missing contact returns a 404 error you can handle with an error route.
* **List subscribers** returns one bundle per contact, filtered by status, search term, tags, list, segment, custom attribute, or opt-out window.
* **Create or update a subscriber** creates a contact or updates the fields mapped in the scenario. Its existing-subscriber behavior can instead fill only empty fields or skip profile changes.
* **Add a note to a subscriber** records an internal note on the profile.
* **Unsubscribe a subscriber** performs the full opt-out workflow while retaining the contact record.
* **Delete a subscriber** permanently deletes the contact. Use unsubscribe for normal customer opt-outs.
* **Import subscribers** queues up to 5,000 full records; **Get a subscriber import** reports progress and per-reason failures.

**Tags, lists, and segments**

* **Add a tag to a subscriber** and **Remove a tag from a subscriber** work on one contact and create it when necessary.
* **Add tags to many subscribers** and **Remove tags from many subscribers** reconcile up to 25 tags across 500 existing contacts without creating anyone.
* **List tags** and **Create a tag** manage tag definitions and their dashboard colors.
* **List subscriber lists**, **Create a subscriber list**, **Add subscribers to a list**, and **Remove subscribers from a list** manage list membership. Removing membership never deletes the contact.
* **List segments** and **Get a segment count** read saved segments and their current size.

**Events, sequences, and campaigns**

* **Create a trigger event** records a live or historical event using a required idempotency key.
* **List sequences**, **Enroll subscribers in a sequence**, and **Cancel sequence enrollments** drive automations from outside Sequenzy.
* **List campaigns**, **Schedule a campaign**, **Send a campaign test**, and **Get campaign metrics** cover the send and reporting loop.

**Email, deliverability, and commerce**

* **Send an email** queues a transactional or single-recipient marketing email from a saved template or direct HTML.
* **Get an email send** returns the delivery snapshot and recorded events for one send ID.
* **Check a suppressed recipient** and **List suppressed recipients** show who Sequenzy cannot reach and why.
* **Push an order** and **Track a started checkout** feed commerce automations such as order confirmation, replenishment, and abandoned checkout.
* **Make an API call** reaches any other authenticated Sequenzy endpoint when no dedicated module exists.

Existing private-app scenarios that used the former **Search subscribers** module remain compatible. The deployment helper hides that retired module without deleting it; use **Get a subscriber** or **List subscribers** when building new scenarios.

## Choosing values without pasting IDs

Lists, tags, segments, sequences, campaigns, and transactional templates load as live dropdowns from your workspace. Each dropdown is still mappable, so a scenario can supply an ID from an earlier module instead.

## Retry-safe writes

Make retries a failed step, so every module that could duplicate work exposes a way to stay idempotent:

* **Create a trigger event** requires an **Idempotency key**. Map a stable source ID such as a webhook, invoice, or order ID. Historical retries with the same subscriber, event name, and key are strictly deduplicated. Live-event deduplication is best-effort for nearly simultaneous requests, so a producer that needs a strict guarantee should also keep its own source ledger. The output reports `duplicate` for a repeated live event and exposes any `sideEffectFailures`. When `occurredAt` is more than one hour in the past, the event is imported as history and the output reports `historical`, `inserted`, and `duplicates`.
* **Send an email** accepts an **Idempotency key**. Reusing the same key and content returns the original send for 14 days instead of delivering twice.
* **Import subscribers** requires an **Idempotency key** and reports `deduplicated` when a retry reuses the queued import.
* **Push an order** deduplicates on your order ID, so pushing the same order twice never double counts revenue.
* **Delete a subscriber** succeeds with `alreadyMissing: true` when the contact is already gone.

## Partial results

Bulk modules report per-record outcomes instead of failing the whole scenario:

* **Add tags to many subscribers** and **Remove tags from many subscribers** expose `matched`, `updated`, `failed`, `failures`, and `notFound`.
* **Add subscribers to a list** exposes per-email `results` alongside the counts.
* **Enroll subscribers in a sequence** reports `enrolled`, `skipped`, and `notFound`.
* **Cancel sequence enrollments** is capped at 1,000 enrollments per call. Repeat the module while `remainingCount` is above zero.

## Rate limits

The connector converts HTTP 429 responses into Make rate-limit errors, allowing Make to delay and retry the scenario. Current API limits and response headers are documented in [Rate Limiting](/api-reference/introduction#rate-limiting).

## Reading large audiences

**List subscribers** returns up to 1,000 contacts per execution, which is the API's own page size. To export an entire audience, use **Make an API call** against `/api/v1/subscribers` and follow `pagination.nextCursor`. Cursor pagination keeps results stable while contacts are created or deleted mid-pull.

## Campaign audiences

**Schedule a campaign** sends to the lists you select, or reuses the campaign's saved audience when you leave the list field empty - which falls back to every active subscriber if the campaign has no saved targeting. Segment and rule audiences are configured on the campaign in Sequenzy, or through **Make an API call** with a `targetLists` object.

A campaign held for safety review returns a normal success with `waitingApproval: true` and status `waiting_approval`. Retrying the schedule step does not clear the hold, so branch on the status instead of retrying.
