Make.com
Make.com (formerly Integromat) is a visual automation platform for building multi-step "scenarios." The official SendSeven Make app provides unified messaging for WhatsApp, Telegram, SMS, Messenger, Instagram & Email — automate conversations, contacts and campaigns from one API. It lets you send messages, upload attachments, manage contacts, conversations and contact methods, send WhatsApp templates, and trigger scenarios from real-time webhook events.
The official SendSeven app is currently completing Make's public review. You don't have to wait — you can add it to your Make account right now using our invitation link:
Once the app is published in Make's app directory you'll be able to find it by searching for SendSeven when adding a module. Until then, the invitation link above is the way to install it.
Connect your account
The SendSeven app offers two connection types — every module and trigger accepts either one, so pick whichever fits your setup when you create the connection:
SendSeven OAuth2 (recommended for most users)
- When you add a SendSeven module to a scenario, click Create a connection and choose SendSeven OAuth2.
- You're redirected to SendSeven at
app.sendseven.comto authorize the app. - Grant the requested permissions; the connection is saved and the access token is refreshed automatically.
That's all an end user does — just click Authorize. There is no client ID or secret to enter; the published app already carries SendSeven's OAuth client.
If you'd rather authorize against your own OAuth app (so consent screens and token audit records carry your app's identity), expand Show advanced settings on the connection and fill in Client ID and Client secret from Settings → OAuth apps. Both fields are optional — left empty, the connection falls back to the SendSeven-managed client. Whichever client you use, the redirect URI to whitelist is https://www.make.com/oauth/cb/app.
This is an OAuth 2.0 Authorization Code + Refresh Token connection. Access tokens are short-lived (1 hour) and Make.com renews them automatically using the refresh token, so the connection stays valid until you disconnect the app.
The OAuth connection runs on one confidential OAuth client owned by SendSeven, whose client_id/client_secret are stored server-side in the Make app's Common data. This client is already registered, public, and verified (write scopes unlocked) and its client_id ships pre-filled in the app's common block. The only remaining manual step is pasting the client_secret:
-
(Reference / re-registration only) In SendSeven, go to Settings → OAuth Apps → Create. Set the name to
Make.com, the allowed scopes to the list the app requests (includingopenidandoffline_access), and add this exact redirect URI to the whitelist:https://www.make.com/oauth/cb/appThis is Make's global OAuth callback for custom apps (legacy Integromat:
https://www.integromat.com/oauth/cb/app). SendSeven exact-matches the redirect URI on authorization, so it must be character-for-character identical. -
Copy the generated
client_idandclient_secret(the secret is shown only once). -
In the Make app editor open the connection's Common data and set
clientSecretto the real secret. TheclientIdis already populated. Never paste the client_secret into docs, code, or version control — Common data is the only place it belongs; Make encrypts it at rest and hides it from end users. The confidential-client token exchange (POST /oauth-apps/token) requires this secret, so OAuth will not complete until it is set.
Public, unverified apps are limited to OIDC + read-only scopes; to grant write scopes, keep the app organization-private or submit it for verification (this client is already verified).
SendSeven API Token (simplest for developers)
- Log in at app.sendseven.com and go to Settings → API Tokens.
- Create a token with the scopes your scenario needs (format
s7_api_…; legacymsgapi_…also accepted). - When you add a SendSeven module, click Create a connection, choose SendSeven API Token, and paste the token.
Both connection types send the token as a Bearer header and validate on save by calling GET /users/me, which accepts both personal API tokens and OAuth access tokens. You can use either connection type with any module or webhook in the app.
Modules
Modules are the action and search steps you add to a scenario. All calls go to https://api.sendseven.com/api/v1.
Actions
| Module | Description |
|---|---|
| Send a message | Send a message on a channel using one of three addressing modes: Recipient + channel (explicit external recipient), Existing conversation (reply to a conversation_id), or Contact + channel (resolve the conversation from a contact). Attachments are an array field — map or add one attachment ID per item (POST /messages). |
| Send a WhatsApp template | Send a pre-approved WhatsApp Business template to a contact (positional or named variables) |
| Upload an attachment | Upload a binary file (multipart POST /attachments/upload, max 50 MB). Returns an attachment ID for Send a message. |
| Upload an attachment from a URL | Fetch a public http(s) URL server-side and store it (POST /attachments/from-url, max 50 MB, stricter MIME allowlist, SSRF-protected). Returns an attachment ID. |
| Create a contact | Create a new contact (POST /contacts). Custom fields and platform IDs are set afterward via Set a custom field / Add a contact method. |
| Update a contact | Update an existing contact's core fields — name, email, phone, languages, avatar (PATCH /contacts/{id}). Fields you leave empty are omitted from the request rather than blanked. |
| Delete a contact (GDPR) | Permanently delete a contact (DELETE /contacts/{id}); associated conversations are anonymized, billing records preserved. Cannot be undone. |
| Set a custom field on a contact | Set a custom field value on a contact (POST /contacts/{id}/fields/{field_id}); the field is picked from your tenant's definitions |
| Add a contact method | Add a contact method — phone, email, whatsapp_id, telegram_id, messenger_id, instagram_id (POST /contacts/{id}/methods). Messenger/Instagram IDs are channel-scoped and require a channel. |
| Delete a contact method | Delete a contact method (DELETE /contacts/{id}/methods/{method_id}); the next method of the same type is auto-promoted to primary if the deleted one was primary |
| Add a tag to a contact | Add a tag to a contact for organization and segmentation (POST /contacts/{id}/tags/{tag_id}) |
| Remove a tag from a contact | Remove a tag from an existing contact (DELETE /contacts/{id}/tags/{tag_id}) |
| Close a conversation | Close a conversation, with optional notes and AI summarization |
| Assign a conversation | Assign a conversation to a team member |
Searches
| Module | Description |
|---|---|
| Get a contact | Retrieve a single contact by ID, including contact methods, tags, and custom fields (GET /contacts/{id}) |
| Search contacts | Search contacts by name, email address, or phone number |
| Get a conversation | Retrieve a single conversation by its unique ID |
| Search conversations | Search conversations by search term, contact, status (open / snoozed / closed), reply state, or channel type. All filters are applied server-side; Status, Channel type and Needs reply each default to Any, which omits the filter. |
| List WhatsApp templates | List your WhatsApp message templates (GET /whatsapp-templates), optionally filtered by channel and approval status |
Dropdown fields in these modules (channels, tags, team members, custom fields, WhatsApp channels and templates) are populated dynamically from your account, so you pick real values instead of pasting IDs. All three search modules default Limit to 10 and page through results automatically when you raise it.
Universal
| Module | Description |
|---|---|
| Make an API call | Call any SendSeven API endpoint with the connection's credentials — pick the method, enter a path relative to https://api.sendseven.com/api/v1, and optionally supply headers, query string and body. Use this for endpoints that don't yet have a dedicated module. |
Webhook triggers
The app ships a single instant trigger, Watch events, which starts a scenario the moment a selected event happens in SendSeven. Add it as the first module of a scenario, then pick one or more event types in the Events to watch field. Add multiple instances of the module to watch different event groups in separate scenarios.
Supported events:
| Group | Events |
|---|---|
| Messages | message.received, message.sent, message.delivered, message.failed, message.read |
email.received, email.sent, email.delivered, email.bounced, email.opened, email.complained | |
| Conversations | conversation.created, conversation.closed, conversation.assigned, conversation.reopened |
| Contacts | contact.created, contact.updated, contact.deleted, contact.subscribed, contact.unsubscribed |
| Engagement | link.clicked |
| Campaign messages | campaign.message.sent, campaign.message.delivered, campaign.message.read, campaign.message.failed |
| Campaign emails | campaign.email.sent, campaign.email.delivered, campaign.email.bounced, campaign.email.opened, campaign.email.complained |
When the trigger is enabled, Make.com registers a webhook subscription via POST /webhook-endpoints pointing at the scenario's Make webhook URL, with subscribed_events set to your selection. Removing or disabling the trigger deletes the subscription (DELETE /webhook-endpoints/{id}).
Ownership-verification challenge
To prove you control the URL it delivers to, SendSeven verifies every new endpoint. Immediately after registration it posts a one-time challenge to the Make webhook URL — {"type":"sendseven_verification","challenge":"…"} with header X-Sendseven-Event: verification. The official Watch events trigger answers this automatically: it responds 200 and echoes the challenge back, so the endpoint verifies and activates, and the challenge itself is not emitted as a scenario event.
This is why a hand-rolled generic Make.com Custom webhook module can't be used as a substitute — it has no way to echo the challenge, so the endpoint never verifies and stays paused. Use the Watch events trigger instead.
Required scopes
| Module | Scopes |
|---|---|
| Send a message | messages:create |
| Upload an attachment / Upload an attachment from a URL | messages:create |
| Create a contact / Update a contact | contacts:create, contacts:update |
| Get a contact / Search contacts | contacts:read |
| Delete a contact (GDPR) | contacts:delete |
| Set a custom field on a contact | contacts:update (custom-field dropdown reads contacts:read) |
| Add / Delete a contact method | contacts:update |
| Add / Remove a tag | contacts:update (tag dropdown reads contacts:read) |
| Get a conversation / Search conversations | conversations:read |
| Close / Assign a conversation | conversations:update |
| Send a WhatsApp template | messages:create |
| List WhatsApp templates | channels:read |
| Watch events (instant trigger) | webhooks:create, webhooks:delete |
Example scenario
Auto-respond to incoming WhatsApp messages
- Watch events — select
message.receivedto trigger on each inbound message. - Router — branch on message content or channel.
- Send a message — reply using Existing conversation mode with the conversation ID from the trigger, or Add a tag to a contact to flag the conversation for a human.
Next steps
- Zapier — no-code automation across 7,000+ apps
- n8n — self-hostable workflows with an AI-agent tool
- Webhooks — the event layer behind the Watch events trigger
- Authentication — API tokens and OAuth