Manage Iterable users, events, lists, campaigns, templates, catalogs and subscriptions, and send email, SMS and push messages.
Iterable ships in the w6w first-party pack. It declares 54 actions, 2 health checks, and the host runs its code in a sandbox that never sees the credential.
io.w6w.iterableIterable is a cross-channel marketing platform: it holds user profiles, records the events they generate, and uses lists, campaigns and journeys to message them over email, SMS, push and in-app. This app exposes Iterable’s server-side REST API to a workflow.
A workflow can create and update user profiles, record custom events and purchases, manage static lists and user subscriptions, trigger campaigns and journeys, send an individual email, SMS or push message through a triggered campaign (and cancel it while scheduled), and read campaigns, templates, channels and message types. It also manages catalogs and their items, the product or content data that templates draw on.
Iterable runs two separate data centers, US and EU. A project and its API keys live in exactly one, so the data center is chosen once on the connection, and only those two hosts are ever called. Several endpoints are asynchronous or have strict rate limits (list membership reads allow five requests a minute), which the action descriptions call out.
Three routes to the same 54 actions. The Workflow tab is generated from Iterable's own manifest and carries its real ids, so it is copy-pasteable; the Code and CLI examples are the same call for any action on any app, so every app-specific value in them is a blank you fill in.
bulk-update-subscriptions Update subscriptions for many users. Overwrites each field supplied per user.
bulk-update-users Update up to many user profiles in one call. Overwrites the profile fields you send; top-level fields you omit are untouched.
bulk-upsert-catalog-items Asynchronously create or update up to 1000 items. `documents` maps item id to its fields.
cancel-email Cancel a scheduled email: give `scheduledMessageId`, or `campaignId` plus an email or userId.
cancel-push Cancel a scheduled push notification: give `scheduledMessageId`, or `campaignId` plus an email or userId.
cancel-sms Cancel a scheduled sms: give `scheduledMessageId`, or `campaignId` plus an email or userId.
create-catalog Create a catalog (name: letters, digits and dashes, 255 characters max).
delete-user-by-email Asynchronously delete a user by email. Does not stop future data collection about them. Email-based and hybrid projects only.
delete-user-by-id Asynchronously delete a user by userId (every user sharing that userId). Does not stop future data collection about them.
get-campaign-metrics Metrics for campaigns, returned by Iterable as CSV text. Rate limit: 10 requests/minute per project.
get-list-users Members of a list, one per line. Rate limit: 5 requests/minute per project.
get-sent-messages Messages sent to a user (default 10, up to 1000). Rate limit 3 requests/second per project.
get-user-by-email Get a user profile by email address. Returns `user: null` when Iterable has no such user.
get-user-by-id Get a user profile by userId. Returns `user: null` when Iterable has no such user.
list-campaigns Campaign metadata, paginated. Always pass page/pageSize: the unpaginated form is deprecated by Iterable.
list-templates Templates in the project, paginated. Always pass page/pageSize: the unpaginated form is deprecated by Iterable.
merge-users Merge a source user into a destination user, migrating profile data and events. Give exactly one source identifier and exactly one destination identifier.
replace-catalog-item Asynchronously create an item, or replace it entirely if it exists.
send-email Send a email to one user via a triggered campaign. Give a recipient email or userId.
send-push Send a push notification to one user via a triggered campaign. Give a recipient email or userId.
send-sms Send a sms to one user via a triggered campaign. Give a recipient email or userId.
track-event Record a custom event for a user. Events are created asynchronously. Pass an `id` to make retries safe (Iterable dedupes on it).
track-purchase Record a purchase. Clears the user's shopping cart and creates or updates the user profile from `user`.
trigger-journey Enter a user (or every user of a list) into a journey that starts with an API trigger.
update-cart Replace the `shoppingCartItems` on a user profile (creating the user when needed).
update-catalog-item Asynchronously create an item, or update only the supplied fields if it exists.
update-user Create or update a user profile. Data is merged: fields you omit are not deleted. Field types must match what the project already holds.
update-user-email Change a user's email, migrating profile data and events. Email-based projects only; in userId-based or hybrid projects use Update User.
update-user-subscriptions Set a user's list and message-type subscriptions. OVERWRITES (does not merge) each list field you supply.
A workflow step names the app and the action, and the editor fills in the
connection when you pick one. This is the Step shape from the
workflow spec, carrying Iterable's real ids.
{
"manifestVersion": "2",
"name": "iterable-example",
"steps": [
{
"id": "abort-campaign",
"uses": {
"app": "io.w6w.iterable",
"action": "abort-campaign",
"connection": "conn_YOUR_CONNECTION_ID"
},
"with": {
"campaignId": "<campaignId>"
}
}
]
}abort-campaign bulk-update-subscriptions bulk-update-users bulk-upsert-catalog-items create-catalog +49 more actions available
Every app-specific value here is a blank you have to fill in. An
app action is reached through the connection that authenticates it, so the
address is a connection id, not the app id — and connections belong to your account,
so a public page cannot know yours. Create one for Iterable, then fill in
the three blanks: conn_YOUR_CONNECTION_ID, the action key, and the
parameters that action declares. The call itself is real — the shape is transcribed
from the studio's own snippet builder, which prints the same kind of blanks — but
nothing in it is specific to Iterable. The Workflow tab is where this app's
real ids are.
npm install @w6w/sdkyarn add @w6w/sdkpnpm add @w6w/sdkdeno add npm:@w6w/sdkimport { W6wClient, isActionRun } from "@w6w/sdk";
// Reads W6W_BASE_URL and W6W_TOKEN from the environment when omitted.
const client = new W6wClient();
const envelope = await client.run({
urn: "conn_YOUR_CONNECTION_ID",
action: "abort-campaign",
payload: {
campaignId: "<value>",
},
});
if (isActionRun(envelope)) console.log(envelope.value); npm install -g @w6w/cli w6w run conn_YOUR_CONNECTION_ID --action abort-campaign --payload '{"campaignId":"<value>"}' Give an AI agent Iterable — without giving it Iterable's credentials. One MCP endpoint exposes every app, function and workflow the caller is entitled to, as tools it can discover and run. Access is granted per team while we onboard.
One tool call{
"name": "w6w_invoke",
"arguments": {
"ref": "app:io.w6w.iterable#abort-campaign",
"input": {
"campaignId": "<campaignId>"
}
}
}
Every tool names its target with a single ref. The
app: form above doesn't name a connection at all — the
host resolves which of the caller's Iterable connections to sign
with, and refuses rather than guesses when the answer is ambiguous.
The token is attached host-side, at the moment of the call. It is never a tool argument, never in the model's context, and never in a transcript — so a prompt injection has nothing to exfiltrate.
Tools are derived per end user from what that person has actually connected and is entitled to — not one shared bot identity carrying the union of everyone's access.
Multi-step work runs on the workflow engine and returns a run handle the agent can poll — retries, branching and state survive the conversation that started them.
Iterable's declared health checks are on the surface too, so an agent can tell "the vendor is down" from "your credential expired" before it burns a retry on either.
The MCP surface is part of the hosted platform. Iterable itself is MIT, and the runtime that executes it is source-available (FSL).
Iterable declares its own checks, so its health is a property of the app rather than something the host guesses at.
Atlassian Statuspage for status.iterable.com, judged on the global (non-cluster) components. Unauthenticated and unsigned.