First-party app
Iterable

Iterable

Manage Iterable users, events, lists, campaigns, templates, catalogs and subscriptions, and send email, SMS and push messages.

stable MarketingEmail

About

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.

App id
io.w6w.iterable
Version
0.1.0
Author
w6w
Licence
MIT
Categories
Marketing · Email

Overview

Iterable 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.

Build with Iterable

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.

Abort Campaign

abort-campaign

Abort a running campaign.

Bulk Update Subscriptions

bulk-update-subscriptions

Update subscriptions for many users. Overwrites each field supplied per user.

Bulk Update Users

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

bulk-upsert-catalog-items

Asynchronously create or update up to 1000 items. `documents` maps item id to its fields.

Cancel Scheduled Email

cancel-email

Cancel a scheduled email: give `scheduledMessageId`, or `campaignId` plus an email or userId.

Cancel Scheduled Push Notification

cancel-push

Cancel a scheduled push notification: give `scheduledMessageId`, or `campaignId` plus an email or userId.

Cancel Scheduled SMS

cancel-sms

Cancel a scheduled sms: give `scheduledMessageId`, or `campaignId` plus an email or userId.

Create Catalog

create-catalog

Create a catalog (name: letters, digits and dashes, 255 characters max).

Create Static List

create-list

Create a static list. Returns its `listId`.

Delete Catalog

delete-catalog

Delete a catalog and every collection that references it.

Delete Catalog Item

delete-catalog-item

Asynchronously delete an item.

Delete List

delete-list

Delete a list by id.

Delete User by Email

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 User ID

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

get-campaign

One campaign by id.

Get Campaign Metrics

get-campaign-metrics

Metrics for campaigns, returned by Iterable as CSV text. Rate limit: 10 requests/minute per project.

Get Catalog Item

get-catalog-item

One catalog item.

Get Email Template

get-email-template

One Email template by id.

Get List Size

get-list-size

Number of users in a list. Rate limit: 5 requests/minute per project.

Get List Members

get-list-users

Members of a list, one per line. Rate limit: 5 requests/minute per project.

Get Push Template

get-push-template

One Push template by id.

Get Messages Sent to a User

get-sent-messages

Messages sent to a user (default 10, up to 1000). Rate limit 3 requests/second per project.

Get SMS Template

get-sms-template

One SMS template by id.

Get User by Email

get-user-by-email

Get a user profile by email address. Returns `user: null` when Iterable has no such user.

Get User by User ID

get-user-by-id

Get a user profile by userId. Returns `user: null` when Iterable has no such user.

Get User Events by Email

get-user-events-by-email

Recent events for a user, by email.

Get User Events by User ID

get-user-events-by-id

Recent events for a user, by userId.

List User Fields

get-user-fields

List every user data field in the project with its type.

List Campaigns

list-campaigns

Campaign metadata, paginated. Always pass page/pageSize: the unpaginated form is deprecated by Iterable.

List Catalog Items

list-catalog-items

Items in a catalog, paginated.

List Catalogs

list-catalogs

Catalog names, paginated.

List Channels

list-channels

Message channels in the project.

List Journeys

list-journeys

Journeys (workflows) in the project, paginated (page size max 50).

List Lists

list-lists

All lists in the project.

List Message Types

list-message-types

Message types in the project.

List Templates

list-templates

Templates in the project, paginated. Always pass page/pageSize: the unpaginated form is deprecated by Iterable.

Merge Users

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.

Create or Replace Catalog Item

replace-catalog-item

Asynchronously create an item, or replace it entirely if it exists.

Send Campaign Now

send-campaign

Send an existing campaign immediately.

Send Email

send-email

Send a email to one user via a triggered campaign. Give a recipient email or userId.

Send Push Notification

send-push

Send a push notification to one user via a triggered campaign. Give a recipient email or userId.

Send SMS

send-sms

Send a sms to one user via a triggered campaign. Give a recipient email or userId.

Subscribe Users to List

subscribe-to-list

Add users to a static list.

Track Events in Bulk

track-bulk-events

Record many custom events in one call.

Track Event

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

track-purchase

Record a purchase. Clears the user's shopping cart and creates or updates the user profile from `user`.

Trigger Campaign to Lists

trigger-campaign

Send a triggered campaign to one or more lists.

Trigger Journey

trigger-journey

Enter a user (or every user of a list) into a journey that starts with an API trigger.

Unsubscribe Users from List

unsubscribe-from-list

Remove users from a list.

Update Shopping Cart

update-cart

Replace the `shoppingCartItems` on a user profile (creating the user when needed).

Create or Update Catalog Item

update-catalog-item

Asynchronously create an item, or update only the supplied fields if it exists.

Update User

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

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

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>"
      }
    }
  ]
}

Here are some of the things you can do

  • Abort Campaign

    perform
    abort-campaign
  • Bulk Update Subscriptions

    perform
    bulk-update-subscriptions
  • Bulk Update Users

    perform
    bulk-update-users
  • Bulk Upsert Catalog Items

    perform
    bulk-upsert-catalog-items
  • Create Catalog

    perform
    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.

Install
npm install @w6w/sdk
yarn add @w6w/sdk
pnpm add @w6w/sdk
deno add npm:@w6w/sdk
Code
import { 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);
Install the CLI
npm install -g @w6w/cli
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.

What the agent gets

Credentials it can't read

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.

A tool surface scoped to the caller

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.

A durable workflow in one call

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.

Health-aware discovery

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).

Request MCP access

Health checks

Iterable declares its own checks, so its health is a property of the app rather than something the host guesses at.

service

Iterable platform status

Atlassian Statuspage for status.iterable.com, judged on the global (non-cluster) components. Unauthenticated and unsigned.

quota

API quota