Documentation

theMarketer MCP Server · 82 tools

Endpoint: https://mcp.themarketer.com/mcp

Overview

The theMarketer MCP Server lets an AI assistant (Claude, ChatGPT, OpenClaw or any MCP-compatible client) work with your theMarketer account through natural language: look up and manage subscribers, review campaign performance, pull e-commerce and audience reports, send transactional messages and more.

Every action runs under your own theMarketer identity via OAuth 2.1, scoped to the domains you have access to. Read tools never change data. Write tools create or update records. Destructive tools delete or irreversibly alter data and always require confirmation in the assistant.

Setup instructions for each client are on the setup guide.

Example prompts

  • What's the status of subscriber ana@example.com and which tags does she have?
  • Show me the email report for the latest campaign on shop.example - opens, clicks and unsubscribes.
  • How did our subscriber count evolve over the last 30 days?
  • Add john@example.com to the newsletter list with the tags "vip" and "b2b".
  • What's the e-commerce revenue attributed to theMarketer this month, and how many visitors are on the site right now?
  • Send the order-confirmation transactional email for order #10422 to the customer.

Tool reference

Read reads data only Write creates or updates data Destructive deletes or irreversibly changes data

Shared parameters

Parameters that keep one meaning across tools; the tools that take them reuse these descriptions.

ParameterTypeDescription
domain_idstringtheMarketer domain to operate on: its name/hostname (e.g. 'shop.example') or domain id, as returned by list_domains. Pass it whenever the user names a shop or site; it may be omitted only on a single-domain account, which is then used automatically.
emailstringEmail address that identifies the subscriber (case-insensitive; matched as stored, lowercase).
pageintegerPage number, starting at 1.
per_pageintegerItems per page, between 1 and 100.

Assets1

Upload image

upload_imageWrite

Upload an image into theMarketer's gallery and get a URL for campaigns and popups.

Use when the user wants a picture (a banner, a logo, a product shot) in a campaign or a popup and has it as a link or as a file. The image is stored in the account's newsletter file manager, in the folder My uploads / From MCP, and the returned URL goes into the image field of a popup or a campaign. Give exactly one source: image_url, a public https link the image is downloaded from, or image_base64, the file's bytes encoded in base64 (a data: URL prefix is fine). The gallery takes PNG, JPEG, GIF and WebP images of up to 2 MB; the format is read from the file itself, so the name or the link's extension does not matter.

The image stays in the gallery until it is deleted there in the app; deleting the From MCP folder removes every image in it, also from the campaigns and popups that show them. Uploading the same file twice stores two copies.

Parameters
ParameterTypeDescription
image_urlstringPublic https address of the image to download and store, e.g. https://cdn.example.com/banner.png. Not with image_base64.
image_base64stringThe image file encoded as base64, with or without a data:image/...;base64, prefix. Not with image_url.
file_namestringName to store the image under in the gallery, e.g. 'spring-banner'; the extension is set from the image format. Omitted, the name comes from the link, else from the time of upload.
domain_idstringTarget domain.
Returns
FieldTypeDescription
urlstringPublic URL of the stored image, ready for an image field of a campaign or popup.
file_namestringName the image is stored under in the gallery.
mime_typestringImage format as read from the file itself (image/png, image/jpeg, image/gif or image/webp).
size_bytesintegerSize of the stored file, in bytes.
resolutionobjectWidth x height in pixels as the gallery reports it (e.g. '1200x628'); null when not reported.
gallery_folderstringWhere the image sits in the gallery, as the app labels it.
notestringWhat the upload means and what deleting the folder does.

Audience24

List contacts

list_contactsRead

List or count the contacts in the audience that match a set of filters.

Use when the user asks who is in the audience, how many contacts match some criteria, or when another tool needs a contact id. Filters combine with AND; run separate calls for alternatives. For a "how many" question set count_only=true and read total. For the headcount per channel and the last 7 days' joins and losses use get_audience_evolution instead, and get_contact_details for everything about one contact.

Results come 15 per page with total, pages and per_page; narrow the filters rather than paging through a large result. Bounds are inclusive: *_after includes the named day and *_before stops at the start of it, so a calendar month is created_after="2026-05-01", created_before="2026-06-01". Emails and phones come back masked when the account anonymises contacts. list_segments gives the segment_id values.

For geographic audiences, select an existing segment with list_segments and pass its segment_id; do not supply raw personal locations.

Parameters
ParameterTypeDescription
searchstringText to look for in the first name, last name, email or phone; a contact matches when any of them contains it.
email_statusenumEmail consent: subscribed, unsubscribed, or not_subscribed (never opted in). One of: subscribed, unsubscribed, not_subscribed.
sms_statusenumSMS consent, same values as email_status. One of: subscribed, unsubscribed, not_subscribed.
loyalty_statusenumLoyalty programme consent, same values as email_status. On an account with no loyalty programme set up it matches the consent setting alone, and note says so. One of: subscribed, unsubscribed, not_subscribed.
has_phonebooleanTrue for contacts that have a phone number, False for contacts without one.
engagementenumEngagement status: active, inactive or cleaned. One of: active, inactive, cleaned.
genderenummale, female or unknown. One of: male, female, unknown.
acquisitionenumWhere the contact came from, e.g. website (on-site tracking), import, popup, order or api. One of: website, import, popup, order, embedded_form, landing_page, api, launcher.
tagstringOnly contacts carrying this tag, matched as spelled in the account's tag list; case is corrected when only one tag matches, and note says so. A tag the account's list does not have is matched exactly as typed, and the note says so.
first_namestringFirst name, substring match; % is a wildcard and ---empty--- selects contacts with no first name.
last_namestringLast name, substring match like first_name.
rfm_groupenumThe RFM group the contact is in, e.g. champions, loyal, at_risk or lost. One of: champions, loyal, at_risk, cant_lose, potential_loyalist, promising, hibernating, new_customer, needs_attention, lost, many_time_buyer_high_aov, many_time_buyer_low_aov, one_time_buyer_high_aov, one_time_buyer_low_aov.
funnel_stageenumLast funnel stage the contact reached, from awareness to purchase. One of: awareness, interest, consideration, intent, evaluation, purchase.
min_ratingintegerLowest contact rating to include, 1-5 (inclusive).
max_ratingintegerHighest contact rating to include, 1-5 (inclusive).
min_loyalty_pointsintegerLowest loyalty points balance to include (inclusive).
max_loyalty_pointsintegerHighest loyalty points balance to include (inclusive).
created_afterstringContacts added on or after this day (YYYY-MM-DD).
created_beforestringContacts added before this day (YYYY-MM-DD); the day itself is excluded.
subscribed_afterstringEmail subscription date on or after this day (YYYY-MM-DD); only contacts currently subscribed to email.
subscribed_beforestringEmail subscription date before this day (YYYY-MM-DD, excluded); only contacts currently subscribed to email.
unsubscribed_afterstringEmail unsubscription date on or after this day (YYYY-MM-DD); only contacts currently unsubscribed from email.
unsubscribed_beforestringEmail unsubscription date before this day (YYYY-MM-DD, excluded); only contacts currently unsubscribed from email.
custom_fieldstringLabel of a custom column defined for this account (e.g. "Marime"); give it together with custom_field_value.
custom_field_valuestringExact value the custom column must hold; give it together with custom_field.
segment_idstringRestrict the list to one custom segment of this domain: its id as list_segments returns it, 24 hex characters. An id that names no custom segment here is an error, not an empty list. System segments (ids starting with system-) are not accepted here; use the matching filter instead, e.g. rfm_group for the RFM ones.
sort_byenumField to order by; created_at by default, which with sort_desc puts the newest contacts first. One of: created_at, email, firstname, lastname, phone, country, city, acquisition, loyalty_points, rfm_group, funnel. Default: 'created_at'.
sort_descbooleanTrue for descending order (default), False for ascending. Default: True.
count_onlybooleanReturn only the counters and no contact rows: the cheap answer to "how many contacts ..." questions. Default: False.
pageintegerPage number, starting at 1. Default: 1.
fieldsenumsummary returns eleven fields per contact; full adds every column (gender, acquisition, RFM group, loyalty tier and points, rating, per-channel flags and the account's custom columns). One of: summary, full. Default: 'summary'.
domain_idstringTarget domain.
Returns
FieldTypeDescription
totalintegerContacts matching the filters, across all pages.
pageintegerPage returned, starting at 1.
pagesintegerTotal pages at 15 contacts each.
per_pageintegerContacts per page, always 15; narrow the filters rather than paging through a large result.
contactsobject[]Contacts on this page: eleven summary fields each, or every column when fields is full. Empty when count_only is set.
idobjecttheMarketer contact id.
emailobjectEmail address; masked when the domain anonymizes.
firstnameobjectFirst name.
lastnameobjectLast name.
phoneobjectPhone number; masked when the domain anonymizes.
cityobjectCity.
countryobjectCountry.
tagsstring[]Tags on the contact.
created_atobjectAcquisition date, DD.MM.YYYY.
statusobjectEngagement status: active, inactive or cleaned.
unsubscribedstring[]Channels the contact has opted out of: any of email, sms, push, mobile_push, loyalty. Only channels the contact can use are listed (sms needs a phone, push a push token), matching what get_contact_details and update_contact show.
has_morebooleanTrue when a later page exists; the note says which to ask for.
noteobjectHow to get the next page when there is one, why rows are missing when they were omitted on request, which tag a differently cased tag was matched to or that tag is not in the account's tag list, and what loyalty_status matched on an account without a loyalty programme; null when none of these applies.

Get contact details

get_contact_detailsRead

Everything about one contact, by section: profile, purchases, loyalty, activity and deliverability.

Use when the user asks about a specific person: who they are, what they buy, their loyalty standing, what they did recently, or why an email did not reach them. Find people with list_contacts first; change what this tool shows with update_contact or unsubscribe_contact. By default it returns profile, rfm, ecommerce and loyalty; ask for other sections only when the question needs them, because each one is a separate lookup and "all" fetches every section.

A section that could not be loaded reads {"unavailable": <reason>} while the rest still answer; loyalty and loyalty_history read so on accounts without a loyalty programme. Long lists come one page at a time, newest first: orders (25 per page), the onsite and offsite activity timelines, the profile's consent_history and the delivery_log (30 each). One page walks them all together, so ask for page 2 only with the section you need. onsite holds the newest 100 events. Emails and phone numbers come back masked when the account anonymises contacts.

Parameters
ParameterTypeDescription
emailstringEmail address of the contact. Use contact_id instead when the account masks addresses or several contacts match.
contact_idstringtheMarketer contact id (24 hex characters, as list_contacts returns it). Pass this or email, not both.
sectionsenum[]Which sections to fetch; omit for profile, rfm, ecommerce and loyalty. Any of: profile (identity, consent and its history, tags, custom columns, device and session facts), rfm (RFM group and the moves between groups), ecommerce (order totals, rates and averages), orders (the order list, 25 per page), favorites (favourite brand, category and products), engagement (when the contact opens email and SMS), loyalty (points, tier, status), loyalty_history (points, tier and rewards history), feedback (NPS group and review ratings), activity (onsite and offsite event timelines, 30 per page each), referrals (referred contacts and the refer-a-friend link), deliverability (automatic-cleanup status plus the email delivery log, 30 per page). "all" fetches every section.
pageintegerPage number, starting at 1. Default: 1.
domain_idstringTarget domain.
Returns
FieldTypeDescription
contact_idstringtheMarketer id of the contact described.
sections_returnedstring[]The sections fetched on this call, in the order the keys below are listed.
profileobjectIdentity (name, email, phone, gender code M/F/U, birthday Y-m-d, country/county/city), consent (unsubscribed, applicable_channels and marketing_preferences), is_owner, anonymized, notes, custom_columns (only the columns this contact has a value in), tags, acquisition source, preferred email format, device/session facts (browser, device, subscribe and last-seen datetimes) and consent_history: the subscribe/unsubscribe log, newest first, each entry with date d.m.Y, time and message, 30 per page (items for the requested page, total, pages, has_more and a note saying which page to ask for next). Reads {"unavailable": <reason>} when it could not be loaded.
rfmobjectThe RFM group the contact is in (Champions, Loyal customer, At risk, ...), time_in_group, last_purchase and the history of moves between groups. Reads {"unavailable": <reason>} when it could not be loaded.
ecommerceobjectLifetime e-commerce figures: open, click and conversion rates in percent, transactions (orders placed), average_order_value, total_revenue and last_order. Reads {"unavailable": <reason>} when it could not be loaded.
ordersobjectThe contact's orders, newest first, each with its product list, 25 per page (items for the requested page, total, pages, has_more and a note saying which page to ask for next). The list is complete: total is every order. Reads {"unavailable": <reason>} when it could not be loaded.
favoritesobjectThe favourite brand and category (name, purchases, views, share of purchases in percent) and the favourite products (name, image, category, orders, views), from the contact's purchases and browsing. Reads {"unavailable": <reason>} when it could not be loaded.
engagementobjectWhen the contact opens messages, for email and sms: the preferred_hour and the opens per half hour of the day (opens_by_half_hour, 48 counts from 00:00). Reads {"unavailable": <reason>} when it could not be loaded.
loyaltyobjectThe loyalty card: points, tier with its range and next_tier (null on a points programme), redeemed_points, about_to_expire, joined_on, last_update and member. Unavailable on accounts without a loyalty programme. Reads {"unavailable": <reason>} when it could not be loaded.
loyalty_historyobjectFour sub-keys - points_history and rewards_history (the last 10 rows each, newest first), tier_evolution and points_evolution (charts over days) - each reading {"unavailable": <reason>} on its own when it could not be loaded. Unavailable on accounts without a loyalty programme. Reads {"unavailable": <reason>} when it could not be loaded.
feedbackobjectWhat the contact told the account: nps_group (promoter, passive, detractor or null), the number of reviews, last_rating and average_rating. Reads {"unavailable": <reason>} when it could not be loaded.
activityobjectTwo timelines, onsite (website events: views, carts, orders, forms) and offsite (campaign and automation events: delivered, opened, clicked, bounced), each as items newest first with date (d M Y), time (H:i), message (what happened), message_continuation (the product, category, search term, campaign subject or automation it happened to) and action (the path of that campaign or product in the theMarketer app, or null), 30 per page (items for the requested page, total, pages, has_more and a note saying which page to ask for next). offsite is complete; onsite holds the newest 100 events, so its total tops out at 100. Either sub-key reads {"unavailable": <reason>} on its own when it could not be loaded. Reads {"unavailable": <reason>} when it could not be loaded.
referralsobjectreferred: the contacts this one referred; referral_link: this contact's refer-a-friend URL, or null when there is none for the address (a masked address has none). Either sub-key reads {"unavailable": <reason>} on its own when it could not be loaded. Reads {"unavailable": <reason>} when it could not be loaded.
deliverabilityobjectcleanup: whether automatic cleanup is on and how close the address is to being cleaned. delivery_log: every send, open and click on the contact's emails, newest first, each with date d.m.Y, time and message, 30 per page (items for the requested page, total, pages, has_more and a note saying which page to ask for next). Either sub-key reads {"unavailable": <reason>} on its own when it could not be loaded. Reads {"unavailable": <reason>} when it could not be loaded.

Create contact

create_contactWrite

Add one new contact to the audience by email address.

Use when the user wants a single person added, after a call, an event or a manual sign-up. Creates only: an address that already exists fails and points at update_contact, and the existing contact is left untouched. For more than a handful of contacts use import_contacts. Only name, phone and the three consents can be set here; birthday, tags and custom fields go through update_contact afterwards. Manage residence/location in the authenticated theMarketer web app.

The phone is saved in international form: +40722123456, 0040 722 123 456 and, on a domain whose store profile country is Romania, 0722 123 456 all become +40722123456. Letters, or fewer than 7 or more than 15 digits with the country code, stop the call with the fix to make.

The contact is saved quietly: no automations fire and no double opt-in email is sent, so the consent given here is final. Loyalty consent applies on plans that include the loyalty program. Only email consent is on by default; turn SMS or loyalty on only when the user asked for them, because a subscription implied from a conversation is not a ticked box.

Parameters
ParameterTypeDescription
emailrequiredstringEmail address that identifies the contact (case-insensitive; matched as stored, lowercase).
first_namestringFirst name of the contact, at most 120 characters.
last_namestringLast name of the contact, at most 120 characters.
phonestringPhone number, such as +40722123456; spaces, dashes, dots and brackets are dropped. A number without + or 00 gets the country code of the domain's store profile country. SMS consent needs one.
subscribed_to_emailbooleanEmail marketing consent. On by default. Default: True.
subscribed_to_smsbooleanSMS marketing consent. Off unless the user explicitly asked for SMS; needs phone, and the call stops without one. Default: False.
subscribed_to_loyaltybooleanLoyalty programme consent. Off unless the user explicitly asked; applies on plans with the loyalty program. Default: False.
domain_idstringTarget domain.
Returns
FieldTypeDescription
createdbooleanTrue when the contact now exists in this audience.
contact_idstringtheMarketer id of the new contact (24 hex characters).
contactobjectThe new contact as list_contacts shows it: identity, opted-out channels and acquisition date.
idobjecttheMarketer contact id.
emailobjectEmail address; masked when the domain anonymizes.
firstnameobjectFirst name.
lastnameobjectLast name.
phoneobjectPhone number; masked when the domain anonymizes.
cityobjectCity.
countryobjectCountry.
tagsstring[]Tags on the contact.
created_atobjectAcquisition date, DD.MM.YYYY.
statusobjectEngagement status: active, inactive or cleaned.
unsubscribedstring[]Channels the contact has opted out of: any of email, sms, push, mobile_push, loyalty. Only channels the contact can use are listed (sms needs a phone, push a push token), matching what get_contact_details and update_contact show.

Update contact

update_contactDestructive

Change an existing contact's details, tags or channel consent.

Use when the user wants to correct or complete a contact's record: name, email, phone, gender, birthday, a custom field, the set of tags, or a subscription change including re-subscribing. Pass only what should change; every field you omit keeps its value. For an opt-out alone prefer unsubscribe_contact; for a contact that does not exist yet use create_contact. Manage residence/location in the authenticated theMarketer web app; this tool preserves existing location fields.

tags replaces the whole set: to add one, pass the current tags plus the new one (get_contact_details shows them). Tag changes fire the account's tag automations. Consent changes are logged as manual changes and can re-subscribe someone, so confirm intent first. The result carries the contact as it is after the change, updated the groups written (details the contact already has are not written again, and note says when nothing changed), and warnings names anything that could not be applied, such as an email or phone edit on an account that anonymises contacts.

Parameters
ParameterTypeDescription
contact_idstringtheMarketer contact id (24 hex characters, as list_contacts returns it). Pass this or email, not both.
emailstringEmail address that identifies the contact to change. Use contact_id instead when the account masks addresses or several contacts match. To change the address itself, pass new_email.
new_emailstringNew email address for the contact. An address already used by another contact is not accepted and nothing is changed. Cannot be changed on accounts that anonymise contacts; warnings says so.
first_namestringNew first name for the contact, at most 120 characters.
last_namestringNew last name for the contact, at most 120 characters.
phonestringNew phone number, such as +40722123456 or 0040 722 123 456; spaces, dashes, dots and brackets are dropped. A number without + or 00 gets the country code of the domain's store profile country. It must have 7 to 15 digits with its country code; letters are not accepted. A phone can be replaced but not removed, and needs the domain's store-profile country to be set. Cannot be changed on accounts that anonymise contacts; warnings says so.
genderenumNew gender: male, female or unknown. One of: male, female, unknown.
birthdaystringNew date of birth as an ISO date, YYYY-MM-DD.
tagsstring[]The complete set of tags the contact should have; replaces the current tags. Pass an empty list to remove them all. A tag that differs only in case from one in the account's tag list is saved under the listed spelling and warnings says so; new tags are added to the list.
subscribed_to_emailbooleanTrue to subscribe the contact to email marketing, False to opt it out.
subscribed_to_smsbooleanTrue to subscribe the contact to SMS marketing, False to opt it out. Needs a phone on the contact.
subscribed_to_pushbooleanTrue to subscribe the contact to web push, False to opt it out. Needs a push token on the contact.
subscribed_to_mobile_pushbooleanTrue to subscribe the contact to mobile push, False to opt it out. Needs a mobile push token on the contact.
subscribed_to_loyaltybooleanTrue to enrol the contact in the loyalty program, False to opt it out.
custom_fieldsobjectOrdinary marketing custom field values, as {label: value}. Never include health, biometric, government ID, payment-card or authentication data. Each label must be one of the domain's custom fields (get_audience_options kind=custom_fields lists them); a label that differs only in case is saved under the exact name and warnings says so. Fields you do not name keep their values.
domain_idstringTarget domain.
Returns
FieldTypeDescription
contact_idstringtheMarketer id of the contact changed.
updatedstring[]Groups of fields a write was issued for, in write order: profile (names, email, phone, gender, birthday, custom fields), tags, subscriptions; profile is left out when the contact already had every detail given.
contactobjectThe contact re-read after the change: identity, location, tags and the channels it is opted out of. created_at and status are not part of this read and stay null.
idobjecttheMarketer contact id.
emailobjectEmail address; masked when the domain anonymizes.
firstnameobjectFirst name.
lastnameobjectLast name.
phoneobjectPhone number; masked when the domain anonymizes.
cityobjectCity.
countryobjectCountry.
tagsstring[]Tags on the contact.
created_atobjectAcquisition date, DD.MM.YYYY.
statusobjectEngagement status: active, inactive or cleaned.
unsubscribedstring[]Channels the contact has opted out of: any of email, sms, push, mobile_push, loyalty. Only channels the contact can use are listed (sms needs a phone, push a push token), matching what get_contact_details and update_contact show.
noteobjectSet when the contact already had every value given, so nothing was written and updated is empty.
warningsstring[]Requested changes that could not be applied, and why: a consent change for a channel the contact cannot use, or an email or phone edit on an account that anonymises contacts. Also names a custom field saved under its exact name when the case given differed.

Unsubscribe contact

unsubscribe_contactDestructive

Opt one contact or many out of marketing channels, keeping the records.

First know which channels the user means. If they did not say, ask them before calling: every channel, or only some of email, SMS, push, loyalty? Use when the user explicitly wants contacts to stop receiving email, SMS, push or loyalty communication; confirm intent first, because this changes consent. Use delete_contact to remove the records themselves, and update_contact to re-subscribe.

One contact, chosen channels: pass email or contact_id, and channels. Only the requested channels change; existing opt-outs stay as they are. Channels the contact cannot use, such as SMS without a phone, come back in skipped. A channel in already_unsubscribed was already off before this call, opted out earlier or never opted in, not this call's doing: re-subscribing it is a separate, deliberate action through update_contact, never a repair of this result. To take many contacts off one channel only (for example SMS but not email), call this once per contact.

Many contacts at once, always every channel: pass contact_ids, a tag or a segment_id (several combine with AND). The first call answers needs_user_input with the one question to ask the user, even when they already named every channel: how many contacts match, what they lose and the first of them to check. Call again with the same selection, channels=["email", "sms", "push", "loyalty"] (as resume_arguments says), decision_token and decision_answers once they agreed. Nothing changes before that, and if the selection has changed meanwhile the question is asked again with the new count. A bulk unsubscribe replaces each contact's earlier choices with these four opt-outs, so an earlier opt-out from mobile push is cleared.

Parameters
ParameterTypeDescription
emailstringOne contact: email address of the contact. Use contact_id instead when the account masks addresses or several contacts match.
contact_idstringOne contact: theMarketer contact id (24 hex characters, as list_contacts returns it). Pass this or email, not both.
channelsenum[]One contact: channels to opt out of, any of email, sms, push, mobile_push, loyalty; omit to opt out of every channel the contact can use. Bulk: optional on the first call, required with decision_token, and then exactly email, sms, push and loyalty.
contact_idsstring[]Bulk: theMarketer contact ids (24 hex characters each, as list_contacts returns them), up to 1000.
tagstringBulk: every contact carrying this tag, matched as spelled in the account's tag list; case is corrected when only one tag matches; a tag the account's list does not have is matched exactly as typed. The question says so either way.
segment_idstringBulk: every contact in this custom segment, its id as list_segments returns it (24 hex characters).
decision_tokenstringFrom a needs_user_input result of this tool, together with decision_answers, the same selection and the four channels; leave it out otherwise.
decision_answersobjectThe user's answer by decision key, e.g. {"confirm": "proceed"}; only with decision_token.
domain_idstringTarget domain.
Returns

The operation's result, pending user questions, or cancellation.

Delete contact

delete_contactDestructive

Delete one contact, or many at once: records are hidden and suppressed, not erased.

Use when the user wants contacts gone and never contacted again; confirm intent first, because the records cannot be restored from here. To keep a record but stop marketing to it use unsubscribe_contact; to see what it holds first use get_contact_details.

One contact: pass email or contact_id; it is deleted at once.

Many contacts: pass contact_ids, a tag or a segment_id (several combine with AND). The first call answers needs_user_input with the one question to ask the user: how many contacts match, what the delete does to them and the first of them to check; call again with the same selection, decision_token and decision_answers once they agreed. Nothing is deleted before that, and if the selection has changed meanwhile the question is asked again with the new count. theMarketer then deletes the contacts in the background; the tool checks a few of them after a short wait, and deleted is false with a note when they were still listed or could not be read back, so check again with list_contacts a few minutes later.

The contacts are opted out of every channel, their names are reduced to initials, their other personal fields are cleared and the records are hidden from the audience. Email addresses and phone numbers stay on file so the addresses remain suppressed, so this is not erasure: when the user asks for personal data to be erased, say plainly that this tool suppresses the records and keeps the email and phone. The account owner's own contact cannot be deleted.

Parameters
ParameterTypeDescription
emailstringSingle delete: email address of the contact. Use contact_id instead when the account masks addresses or several contacts match.
contact_idstringSingle delete: theMarketer contact id (24 hex characters, as list_contacts returns it). Pass this or email, not both.
contact_idsstring[]Bulk: theMarketer contact ids (24 hex characters each, as list_contacts returns them), up to 1000.
tagstringBulk delete: every contact carrying this tag, matched as spelled in the account's tag list; case is corrected when only one tag matches; a tag the account's list does not have is matched exactly as typed. The question says so either way.
segment_idstringBulk delete: every contact in this custom segment, its id as list_segments returns it (24 hex characters).
decision_tokenstringFrom a needs_user_input result of this tool, together with decision_answers and the same selection; leave it out otherwise.
decision_answersobjectThe user's answer by decision key, e.g. {"confirm": "proceed"}; only with decision_token.
domain_idstringTarget domain.
Returns

The operation's result, pending user questions, or cancellation.

Import contacts

import_contactsDestructive

Add or refresh many contacts at once, as the import wizard does.

Use when the user has a list of contacts to add, from a spreadsheet, another tool or the conversation, and there are more than a handful; for a single contact use create_contact, which never overwrites. Every row needs an email or a phone, and every email must be a valid address. Send at most 1000 rows per call, and keep rows with an email and phone-only rows in separate calls; a phone-only batch creates SMS-only contacts.

Location fields are not accepted here; manage them in the authenticated theMarketer web app.

New contacts are imported without double opt-in, so a subscribed batch is live at once: confirm the user has permission. With update_existing=true, a row matching an existing contact overwrites the standard fields that row fills and keeps the ones it leaves out, replaces the contact's custom columns with the ones the row names (a row without custom clears them), resets its consent to the batch's and restores a contact removed with delete_contact. To do that, rows that fill different fields are sent as separate imports, at most 10 per call, each listed in imports. Tags apply to the whole call; without tags, updated contacts keep the tags they have. Sign-up automations fire; tag automations do not. Custom column labels must already exist in the account: unknown ones come back in columns_ignored. Addresses on placeholder domains such as example.com count as blacklisted, so test with real-looking domains.

The imports run in the background. status completed means the counts are in report; processing means contacts were still being written when this tool stopped waiting, and list_contacts will show them; awaiting_approval means a file was parked for manual approval and its rows were not imported yet; incomplete means the call stopped after some imports had started: never send the whole batch again, only the rows in rows_not_sent.

Parameters
ParameterTypeDescription
contactsrequiredobject[]The rows to import, 1 to 1000. Each needs email or phone; the other fields are optional. A row with an email that is not a valid address stops the call before anything is sent, and the error names its index. On updated contacts only the standard fields a row fills change.
subscribebooleanTrue imports the batch as subscribed to every channel the plan allows; False imports it as unsubscribed from all channels, which is how a suppression list is loaded. Default: True.
update_existingbooleanTrue overwrites contacts already in the audience with the batch's data (see above for how much that changes); False leaves them untouched and counts them as duplicated. Default: True.
tagsstring[]Tags for the whole call, applied to every new contact and replacing the tags of every updated one. A tag that differs only in case from one the account has takes the account's spelling; tags the account does not have yet are added to its tag list. Omit, or pass an empty list, to import without tags: updated contacts then keep their tags. An import cannot remove tags; update_contact with tags=[] does that per contact.
domain_idstringTarget domain.
Returns
FieldTypeDescription
statusstringcompleted: every import finished and the counts are in report. processing: some contacts were still being written when this tool stopped waiting; they keep landing and list_contacts shows them. awaiting_approval: an import was parked for manual approval and its rows were not imported yet. incomplete: the call stopped after some imports had started; those keep running, and the rows in rows_not_sent were not imported.
importsobject[]The imports this call prepared, one per set of fields the rows fill when existing contacts are updated, otherwise one.
import_idstringtheMarketer id of this import; its report page in the theMarketer app is /audience/contacts/import/report/<import_id>.
statusstringThis import's own status: completed, processing and awaiting_approval mean what they mean for the overall status; not_started means the call stopped before this import ran, so none of its rows were imported.
rows_sentintegerRows in this import.
columns_sentstring[]The fields every row of this import fills, as the column labels sent.
reportobjectWhen completed: this import's counts per outcome.
rows_sentintegerRows in the imports that started, across every import.
rows_not_sentinteger[]Indexes in contacts of the rows that were not imported because the call stopped part way; send only these rows again, never the ones already sent. Empty when every import started.
recognized_contactsintegerRows theMarketer counted before importing, across the imports that started, invalid and blacklisted ones included; normally equals rows_sent. What became of each row is in report.
columns_matchedstring[]Columns that will be imported, under the labels the account uses for them.
columns_ignoredstring[]Columns sent that will not be imported: custom labels that do not exist as columns in this account, or that would have been read as a standard field.
reportobjectWhen every import that started has completed: the counts summed over them; each import's own counts and CSV links are under imports.
notestringWhat the status means for this call, how the rows were split into imports, and anything that was imported differently from what was sent.

Get automation entries

get_entered_automationRead

List the contacts who entered an automation on a given day.

Use to audit automation triggers: who entered which automation on a day. Use get_contact_details to look at one of the contacts, and get_automation_report for how many contacts an automation counted as entered: its entered is the settled count, while this list may also include contacts queued to enter.

Each entry is one contact entering one automation, ordered by entry time, with the contact's email, campaign_segment (the automation's name), barcode, mobile_install and subscribed_push; repeats of the same contact and automation name within a page are left out (rows of a deleted automation, which have no name, are all kept). Some days have no entry list, and note then says to use get_automation_report. No total is reported for this listing: has_more is true when the page came back full, so request the next page while it is true; the last page may turn out empty.

Parameters
ParameterTypeDescription
dayrequiredstringThe day to inspect, YYYY-MM-DD.
pageintegerPage number, starting at 1. Default: 1.
per_pageintegerItems per page, between 1 and 100. Default: 50.
domain_idstringTarget domain.
Returns
FieldTypeDescription
entriesobject[]Entries on this page, ordered by entry time, one per contact and automation name: the contact's email, campaign_segment (the automation's name), barcode, mobile_install and subscribed_push. May include contacts queued to enter.
countintegerEntries returned on this page, after repeats of the same contact and automation name were left out. Not a total for the day: get_automation_report's entered is the settled count.
pageintegerPage returned, starting at 1.
has_morebooleanTrue when this page came back full, so a further page may exist. No total is reported for this listing, so the next page can turn out empty.
notestringWhat this page can and cannot tell: whether the day has an entry list at all, that the list may include contacts queued to enter, and how many repeated rows were left out.

Get audience options

get_audience_optionsRead

Look up the values this domain uses (tags, countries, counties, cities, custom fields) and the conditions and values create_segment accepts here.

Use before list_contacts (its tag and custom_field filters), update_contact (its tags) or create_segment (its tag, country, county, city and custom:<label> conditions) whenever the exact spelling of a tag, country, county, city or custom field matters: filters and rules match values as stored, so a filter on "vip" finds nothing when the tag is "VIP Clienti". Countries are the codes stored on the contacts (usually ISO codes such as RO), not the ISO reference list. Before create_segment on an unfamiliar domain, call kind="segment_conditions", then kind="segment_values" with condition. Not for a parameter's fixed choices (channels, genders, statuses): those are in each tool's schema.

Without kind everything comes at once: tags, countries and custom fields in full, cities and counties 50 per page (one page walks both; see cities_total and counties_total), and the RFM groups with the name the tools accept, the label and the code. With kind only that list comes back, narrowed by search, 200 values per page with total, pages and has_more. kind="segment_conditions" reads the domain's live catalogue, 50 per page: only the conditions its plan allows plus its custom attributes (custom:<label>), each with its operators, what the value must be and a preview of the domain's values; unavailable names the conditions this domain cannot use and why. kind="segment_values" returns the domain's list for a condition, the fixed words of a choice condition, or, for products, categories and custom attributes (searched, not listed), the hits for search, required there; a condition that takes free text, a number or a window returns no values and a note saying what to pass.

Parameters
ParameterTypeDescription
kindenumWhich list to return: tags, countries, counties, cities or custom_fields for the domain's stored values; segment_conditions for the create_segment conditions this domain can use; segment_values for the values one condition accepts (needs condition). Omit for the overview of every stored-value list plus the RFM groups. One of: tags, countries, counties, cities, custom_fields, segment_conditions, segment_values.
searchstringText to look for, in the kind list or in every list when kind is omitted. Case-insensitive: exact spellings and substrings match, and when nothing does the closest spellings come back instead, so kind="cities", search="cra" finds Craiova and search="Bucharest" still finds Bucuresti. With kind="segment_conditions" it matches the condition key, label or tab; with kind="segment_values" it narrows the values and is required for product, category and custom-attribute conditions, which are searched by name (or SKU / id for products), up to 20 hits.
conditionstringOnly with kind="segment_values": the create_segment condition whose values you want, as its key from segment_conditions (e.g. tag, segment, favorite_brand, purchased_product, custom:Loyalty card).
pageintegerPage number, starting at 1. Default: 1.
domain_idstringTarget domain.
Returns
FieldTypeDescription
kindobjectThe one list requested, or null when every list was returned.
searchobjectThe text the lists were narrowed by, or null.
tagsstring[]Tags defined in this domain, spelled exactly as stored: the values list_contacts.tag, update_contact.tags and create_segment's tag condition take. theMarketer matches tags ignoring case but nothing else.
countriesstring[]Country values actually stored on this domain's contacts (usually ISO codes such as RO), not the ISO reference list: the values create_segment's country condition takes, case-sensitive.
countiesstring[]County or region values stored on this domain's contacts, spelled as create_segment's county condition compares them. One page: 50 in the overview, 200 with kind="counties"; see counties_total.
counties_totalintegerDistinct counties in the domain (after search, when given), across all pages of counties.
citiesstring[]City values stored on this domain's contacts, as spelled there: what create_segment's city condition must equal exactly. One page: 50 in the overview, 200 with kind="cities"; see cities_total.
cities_totalintegerDistinct cities in the domain (after search, when given), across all pages of cities.
custom_fieldsstring[]Labels of the domain's custom contact columns: the values list_contacts.custom_field takes, and the <label> in create_segment's custom:<label> conditions.
conditionsobject[]With kind="segment_conditions": the create_segment conditions this domain can use, 50 per page - only what its plan allows, with its custom attributes (custom:<label>) and, for conditions that take a value from a domain list, how many values exist and the first few. Empty otherwise.
conditionstringThe key to pass as create_segment's condition, e.g. tag, purchased_product or custom:Loyalty card for a custom attribute.
tabstringThe web app's segment-builder tab the condition sits in, e.g. Subscriber data, E-commerce, Campaign activity.
labelstringThe condition's name in the web app.
operatorsstring[]The operators create_segment accepts for this condition; a single-operator condition may leave operator out.
valuestringWhat create_segment's value must be for this condition, in words: a fixed set of choices, a value from a domain list, a number, a window, text, or nothing.
options_totalobjectFor a condition that takes a value from one of the domain's lists (tags, brands, segments, cities, stores...): how many values exist; kind="segment_values" with this condition lists them. Null for other conditions, including products, categories and custom attributes, whose values are searched rather than listed.
options_previewstring[]The first 10 of those values, by label. Empty when options_total is null.
noteobjectHow the condition is evaluated (window, case, what 'favorite' means), or null.
unavailablestring[]With kind="segment_conditions": the conditions of the static catalogue this domain cannot use, as condition: reason (e.g. 'nps: needs Ecommerce Pro'); create_segment answers those with the same reason. Not narrowed by search.
conditionobjectWith kind="segment_values": the condition the values belong to, as its catalogue key (an alias or raw rule id is resolved to it).
valuesstring[]With kind="segment_values": what create_segment accepts as value for condition - the domain's values, as label (id) when the id differs from the label (create_segment takes either), the search hits for a product, category or custom-attribute condition, or the fixed words of a choice condition. Empty when the condition takes free text, a number or a window: the note then says what to pass.
totalobjectWith kind: how many values (or conditions) matched, across all pages. Null in the overview, where cities_total and counties_total carry the counts.
pageintegerPage returned, starting at 1.
pagesintegerTotal pages: of the kind list at 200 per page (50 for kind="segment_conditions"), or in the overview of whichever of cities (50 per page) and counties (50 per page) has more.
has_morebooleanTrue when a later page of a paged list exists; the note says which to ask for.
noteobjectWhich page to ask for next when a list has more, and with kind="segment_values" what to pass as the value when the condition has no list to choose from; null when there is nothing to add.
rfm_groupsobject[]Overview only: the RFM groups, each with the name the tools accept, the label shown in theMarketer and its code. The same for every domain.
namestringThe value list_contacts.rfm_group and create_segment's rfm_group rule accept, e.g. champions, at_risk.
labelstringHow theMarketer labels the group in the web app and in list_contacts rows with fields='full', e.g. 'Can't lose them'.
codestringtheMarketer's two-letter code for the group, as stored on the contact and inside segment rules, e.g. CH.

List segments

list_segmentsRead

List segments by name, inspect custom rules or get a recipient estimate.

Use when the user asks which segments exist, how large one is, or what rules define a custom segment, and before create_segment, to reuse a segment that already exists. To see who is in a custom segment, use list_contacts with its segment_id.

The listing comes 50 segments per page, newest first (built-in segments last), with total, pages and has_more; the note names the next page, and search narrows the list by name before paging. Names longer than 200 characters are shortened in the listing and end in …; segment_id returns the full name. Set include_rules=true to inspect custom criteria. Review all rules and how they combine before suggesting a segment; names alone do not establish a match.

Passing segment_id returns one custom or system segment and includes stored custom rules. It ignores page. Set include_count=true to get its email recipients_estimate before campaign exclusions and smart sending. Count lookup requires segment_id; it never counts an entire listing. The separate count values come from the last background evaluation, not from now: -1 means the count was not computed in this listing, which is not zero. System segments have ids starting with system-; their rules are not exposed by this tool. A rule_count of 0 for a system segment does not mean an unrestricted audience. System ids cannot be used as list_contacts.segment_id; custom segments (24-hex ids) can.

Parameters
ParameterTypeDescription
searchstringText the segment name must contain, case-insensitive; applies to system and custom segments alike. Omit to list every segment.
segment_idstringId from this listing: 24 hex characters for a custom segment, or system-... for a built-in segment. Returns one segment with its stored custom rules; ignores page and search.
include_rulesbooleanAlso return each custom segment's rules in readable form when listing. Off by default to keep the list short. Default: False.
include_countbooleanLoad the email recipients_estimate for segment_id. Requires a single segment id. Does not overwrite stored count. Default: False.
pageintegerPage number, starting at 1. Default: 1.
domain_idstringTarget domain.
Returns
FieldTypeDescription
segmentsobject[]The segments on this page, newest first; built-in segments come after the custom ones.
idobjectSegment id. Custom segments have a 24-hex id usable as list_contacts.segment_id; system segments have a 'system-...' id that list_contacts cannot filter by.
nameobjectSegment name as shown in theMarketer.
typestring'Custom' for segments built from rules, 'System' for theMarketer's built-in ones (activity, gender, RFM, frequency, ...).
is_systembooleanTrue for built-in segments. Their rules are not exposed by this tool; their ids cannot be used with list_contacts.
recipients_estimateobjectEmail recipient estimate loaded on request for one segment with include_count=true. Before campaign exclusions and smart sending; null when not requested or unavailable. Separate from stored count values.
lockedbooleanTrue when membership is frozen: theMarketer refreshes the count but no longer adds or removes contacts.
healthobjectAverage engagement health of the members, 0-10.
last_processedobjectWhen theMarketer last evaluated the segment; null for a custom segment whose first background run has not happened yet.
countmap<integer>Members per channel (email, sms, push, mobile_push) from the last evaluation. -1 means the count was not computed in this listing, not zero; system segments can report -1 here.
rule_countintegerNumber of stored custom rules; 0 for system segments, whose rules are not exposed by this tool.
rulesobjectThe rules in readable form, one per line, only when include_rules or segment_id was passed; null otherwise.
rule_operatorobjectHow the rules combine: 'all' (every rule must match) or 'any' (one is enough); null for system segments.
totalintegerSegments matching the supplied filters, across all pages.
pageintegerPage returned, starting at 1.
pagesintegerTotal pages at 50 segments each.
per_pageintegerSegments per page, fixed at 50.
has_morebooleanTrue when a later page exists; the note says which to ask for.
noteobjectPagination instructions, and whether long names were shortened; null when no further guidance is needed.

Create segment

create_segmentWrite

Create a custom segment from rules; theMarketer evaluates membership in the background.

Use when the user requests an independent segment. For a campaign needing a new segment, pass new_segment to campaign_wizard instead. Never create one for a one-off count or list; use list_contacts with filters. Check list_segments for an existing match. The first call writes nothing and asks for confirmation; return segment_operation, decision_token and decision_answers.create_segment='create' after the user confirms. Name and rules may be omitted on resume.

Rules take a condition, an operator (omit when only one exists) and a value; some also take unit, campaign_id or max_value. Discover conditions and operators with get_audience_options(kind="segment_conditions"), and values with get_audience_options(kind="segment_values", condition=..., search=...). Names resolve to ids; ambiguous or unknown values return suggestions. Examples: {"condition":"tag","operator":"is","value":"VIP"}; {"condition":"shopper_status","operator":"did_not_buy_in_last","value":6,"unit":"months"}; {"condition":"purchased_category","value":["Shoes > Men"]}.

An equivalent segment is reused unless allow_duplicate=true. The result lists the resolved rules. identity_pending means the id or creation result could not be verified: do not repeat creation. Evaluation is asynchronous; list_segments shows its last_processed and counts. Membership updates can trigger existing automations. lock freezes membership after evaluation. With match="all" every rule must hold; with match="any" one is enough.

Parameters
ParameterTypeDescription
namestringSegment name, at most 120 characters. Required on the first call; omit on resume to keep the prepared name.
rulesobject[]Conditions for membership. Required on the first call; omit on resume to keep the prepared rules.
matchenum'all' requires every rule; 'any' requires one. Defaults to 'all' for a new operation; omitted on resume keeps its choice. One of: all, any.
lockbooleanFreeze membership after its first evaluation. Defaults to false; omitted on resume keeps its choice.
allow_duplicatebooleanCreate even when equivalent rules and lock already exist. Defaults to false; omitted on resume keeps its choice.
skip_value_checkbooleanSkip domain value lookups only for known stored values, such as a tag an unfinished import is creating. Defaults to false; omitted on resume keeps its choice.
segment_operationstringShort handle returned in resume_arguments; pass it unchanged on every continuation, even after an error.
decision_tokenstringToken returned with the pending confirmation.
decision_answersobjectUser answers by question key; create_segment=create only after the user confirms the displayed rules and effects.
domain_idstringTarget domain.
Returns

The operation's result, pending user questions, or cancellation.

Get audience evolution

get_audience_evolutionRead

Get the audience headcount per channel and the last 7 days' joins and losses.

Use when the user asks how many contacts they have on email, SMS, push or loyalty, or how many joined or left recently. Use get_audience_breakdown for list health (active, inactive, bounced, cleaned) rather than headcount, and get_audience_history for a day-by-day history over a custom date range.

For each channel, contacts is the current headcount (contacts with that channel's identifier who are not opted out of it), and joined_last_7_days and lost_last_7_days count subscriptions and unsubscriptions in a rolling 7-day window ending now. The loyalty headcount is 0 on plans without the loyalty program. A metric that could not be computed reads {"unavailable": <reason>} while the others still answer, and note names it.

Parameters
ParameterTypeDescription
domain_idstringTarget domain.
Returns
FieldTypeDescription
emailobjectEmail channel: contacts with an address who are not opted out of email.
contactsobjectContacts currently subscribed on this channel: they have the channel's identifier (email address, phone, push token) and are not opted out of it. An integer, or {"unavailable": <reason>} when this one metric could not be computed (the others are unaffected).
joined_last_7_daysobjectContacts who subscribed to this channel in the last 7 days (rolling window ending now). An integer, or {"unavailable": <reason>} when this one metric could not be computed (the others are unaffected).
lost_last_7_daysobjectContacts who unsubscribed from this channel in the last 7 days (rolling window ending now). An integer, or {"unavailable": <reason>} when this one metric could not be computed (the others are unaffected).
smsobjectSMS channel: contacts with a phone number who are not opted out of SMS.
contactsobjectContacts currently subscribed on this channel: they have the channel's identifier (email address, phone, push token) and are not opted out of it. An integer, or {"unavailable": <reason>} when this one metric could not be computed (the others are unaffected).
joined_last_7_daysobjectContacts who subscribed to this channel in the last 7 days (rolling window ending now). An integer, or {"unavailable": <reason>} when this one metric could not be computed (the others are unaffected).
lost_last_7_daysobjectContacts who unsubscribed from this channel in the last 7 days (rolling window ending now). An integer, or {"unavailable": <reason>} when this one metric could not be computed (the others are unaffected).
loyaltyobjectLoyalty channel: contacts with an address who are not opted out of loyalty; 0 on plans without the loyalty program.
contactsobjectContacts currently subscribed on this channel: they have the channel's identifier (email address, phone, push token) and are not opted out of it. An integer, or {"unavailable": <reason>} when this one metric could not be computed (the others are unaffected).
joined_last_7_daysobjectContacts who subscribed to this channel in the last 7 days (rolling window ending now). An integer, or {"unavailable": <reason>} when this one metric could not be computed (the others are unaffected).
lost_last_7_daysobjectContacts who unsubscribed from this channel in the last 7 days (rolling window ending now). An integer, or {"unavailable": <reason>} when this one metric could not be computed (the others are unaffected).
pushobjectWeb push channel: contacts with a push token who are not opted out of push.
contactsobjectContacts currently subscribed on this channel: they have the channel's identifier (email address, phone, push token) and are not opted out of it. An integer, or {"unavailable": <reason>} when this one metric could not be computed (the others are unaffected).
joined_last_7_daysobjectContacts who subscribed to this channel in the last 7 days (rolling window ending now). An integer, or {"unavailable": <reason>} when this one metric could not be computed (the others are unaffected).
lost_last_7_daysobjectContacts who unsubscribed from this channel in the last 7 days (rolling window ending now). An integer, or {"unavailable": <reason>} when this one metric could not be computed (the others are unaffected).
noteobjectSet when at least one metric is unavailable, naming which. Null when all twelve numbers are present.

Get audience breakdown

get_audience_breakdownRead

Get the health of the email list: engaged, dormant, bounced, blacklisted and cleaned contacts.

Use when the user asks how healthy or clean their list is, how many contacts are active versus inactive, or how many bounced, were blacklisted, were cleaned or unsubscribed from everything. These are deliverability counts, not headcounts: use get_audience_evolution for how many contacts each channel has, and list_contacts with engagement="active", "inactive" or "cleaned" to see who is in a bucket.

active_email and inactive_email split the reachable email contacts (address present, not opted out, not blacklisted, not cleaned) by whether they ever opened, clicked or were tracked on site. bounced are hard-bounced addresses opted out of email, manually_unsubscribed are contacts opted out of every channel, and blacklisted and cleaned are the addresses flagged by the blacklist and by the automatic list cleanup. A bucket that could not be computed reads {"unavailable": <reason>} while the others still answer.

Parameters
ParameterTypeDescription
domain_idstringTarget domain.
Returns
FieldTypeDescription
active_emailobjectReachable email contacts (address present, not opted out of email, not blacklisted, not cleaned) that have engaged at least once: more than zero opens, clicks or tracked site views. An integer, or {"unavailable": <reason>} when this one bucket could not be computed (the others are unaffected).
inactive_emailobjectThe same reachable email contacts with no engagement at all: zero opens, clicks and site views. active_email + inactive_email is the reachable email list. An integer, or {"unavailable": <reason>} when this one bucket could not be computed (the others are unaffected).
bouncedobjectContacts whose address hard-bounced: they are flagged bounced and opted out of email. An integer, or {"unavailable": <reason>} when this one bucket could not be computed (the others are unaffected).
manually_unsubscribedobjectContacts opted out of every channel at once (email, SMS, push and loyalty) after having been subscribed; contacts that never subscribed are not counted. An integer, or {"unavailable": <reason>} when this one bucket could not be computed (the others are unaffected).
blacklistedobjectContacts flagged blacklisted; they are excluded from active_email and inactive_email. An integer, or {"unavailable": <reason>} when this one bucket could not be computed (the others are unaffected).
cleanedobjectContacts removed by the automatic list cleanup: they ignored the configured number of recent campaigns and the plain-text re-engagement emails that follow, so they were flagged cleaned and opted out of email. An integer, or {"unavailable": <reason>} when this one bucket could not be computed (the others are unaffected).
noteobjectSet when at least one bucket is unavailable, naming which. Null when all six counts are present.

Analyze audience

analyze_audienceRead

Analyze the customer base: RFM groups, purchase frequency and the on-site funnel.

Use for "how do my customers look" questions: how customers spread across RFM groups (champions, loyal, at risk, lost...), how many buy once versus repeatedly, and where visitors drop out between the homepage and an order. To see the contacts behind a number use list_contacts with rfm_group or funnel_stage; for headcounts use get_audience_evolution and for list health get_audience_breakdown.

These are the three analyses of the Audience pages RFM analysis, Frequency analysis and Funnels, read as the account computes them: RFM and frequency are refreshed at most every two hours over the analysis period configured in the account, and the funnel covers the last three months. This tool only reads them and never changes that period. An analysis that could not be loaded reads {"unavailable": <reason>} while the other two still answer.

Parameters
ParameterTypeDescription
domain_idstringTarget domain.
Returns
FieldTypeDescription
rfmobjectRFM analysis (Audience > RFM analysis): aov is the average order value over the analysis period; chart is the distribution of customers across the RFM groups (champions, loyal, at risk, hibernating, lost... - the same groups list_contacts filters by with rfm_group), with each group's count and average order value; flow is how customers moved between groups; timespan is the number of years of orders considered. Refreshed at most every two hours. As the Audience page shows it, or {"unavailable": <reason>} when this one analysis could not be loaded (the others are unaffected).
frequencyobjectPurchase-frequency analysis (Audience > Frequency analysis): chart has one entry per band F1 to F6 - customers with exactly 1, 2, 3, 4, 5 and more than 5 orders - each with its count; timespan is the number of years of orders considered. As the Audience page shows it, or {"unavailable": <reason>} when this one analysis could not be loaded (the others are unaffected).
funnelsobjectOn-site funnel over the last three months (Audience > Funnels): one entry per stage - view_homepage, view_category, search, view_product, add_to_cart, initiate_checkout, order - with visitors (contacts who reached the stage), dropOffs (contacts whose last event was this stage), percentage and dropOffsPercentage. As the Audience page shows it, or {"unavailable": <reason>} when this one analysis could not be loaded (the others are unaffected).
noteobjectSet when at least one analysis is unavailable, naming which. Null when all three are present.

List popups

list_popupsRead

List the domain's signup popups (newsletter popups, wheel of fortune, scratch and win, choose a gift) with their status and how they did in a period.

Use when the user asks which popups exist, which are live, how a popup performs, or whenever you need a popup id for the other popup tools. For one popup's texts, fields, rewards and display rules use get_popup_details; the daily series for all popups together is in get_report.

Each row carries the id, name, status (draft, active, paused) with status_label, links.app_url to open it in the app, and stats for the chosen period: impressions, signups and the signup rate in percent. status=active lists the popups currently live on the shop. The list has no total: rows come 20 per page, newest first, and has_more says whether to ask for the next page (the note names it). The period changes the figures only, never which popups are listed. The row does not say which kind of popup it is, when it shows or when it was created or last saved; get_popup_details does.

Parameters
ParameterTypeDescription
statusenumWhich popups to list: all (the default), active (live on the shop now), paused or draft. One of: all, active, paused, draft. Default: 'all'.
searchstringText the popup name must contain. Omit to list every popup.
periodenumThe window the stats cover: today, yesterday, this_week, last_week, this_month, last_month, last_30_days (default), last_60_days or last_90_days. One of: today, yesterday, this_week, last_week, this_month, last_month, last_30_days, last_60_days, last_90_days. Default: 'last_30_days'.
pageintegerPage number, starting at 1. Default: 1.
domain_idstringTarget domain.
Returns
FieldTypeDescription
popupsobject[]The popups on this page.
idstringtheMarketer id of the popup.
nameobjectThe popup's name.
statusobjectdraft, active or paused.
status_labelobjectThe status as the theMarketer app words it.
statsobjectFigures for the period the list covers.
impressionsintegerTimes the popup was shown.
signupsintegerContacts who signed up through it.
signup_rateobjectSignups per hundred impressions, in percent; null when it was not shown.
linksobjectWhere to open this popup in the theMarketer web app.
app_urlobjectLink to this object in the theMarketer web app, for the user to review or edit it there. Null when the app URL is not configured on this MCP server.
switch_domain_urlobjectOnly for accounts with several domains: open this first if the app is currently on another domain, then follow app_url. The app keeps one current domain per user and app_url only works on the domain this object belongs to.
periodobjectThe window the stats cover, resolved to its dates.
presetstringThe named period applied (e.g. 'last_30_days'), or 'custom' when start and end were given.
startstringFirst day the figures cover (YYYY-MM-DD), inclusive: the window actually applied, a named period resolved to its dates.
endstringLast day the figures cover (YYYY-MM-DD), inclusive: the window actually applied.
stats_unavailablebooleanTrue when the figures for the requested period could not be summed this time and the rows show today's figures instead; the period then says today and the note explains.
pageintegerPage returned, starting at 1.
per_pageintegerPopups per page, fixed at 20.
has_morebooleanTrue when this page came back full, the only signal theMarketer gives: it reports no total, so the next page may still be empty.
noteobjectWhich page to ask for next when there may be more, or why the figures are today's; null otherwise.

Get popup details

get_popup_detailsRead

Everything configured on one signup popup: its kind (classic, wheel of fortune, scratch and win, choose a gift), layout and motion, status, the texts, form fields, rewards, colours, image, countdown and display rules, and whether it can go live.

Use when the user asks what a popup says or shows, before update_popup to see the current content and the reward ids to keep, before enable_popup to see the blockers, or to check why a popup is not showing. Find the id with list_popups. Figures for a period are on list_popups, not here.

The result carries the name, status with status_label (needs_attention when its status needs a look in the app or it was never fully set up), family, layout, motion, game, the template, ready_to_publish with the blockers enable_popup would report (missing discount codes, chances not adding up, a missing device, a tag switched on without a tag...), the stored counters as stats, created and updated times, links.app_url to open the builder, and content: the popup decoded into what update_popup takes, including each reward's id. The look of the template (fonts, sizes, effects) is not part of the result.

Parameters
ParameterTypeDescription
popup_idrequiredstringThe popup's id from list_popups (24 hex characters).
domain_idstringTarget domain.
Returns
FieldTypeDescription
popup_idstringtheMarketer id of the popup.
nameobjectThe popup's name.
statusobjectdraft, active or paused; needs_attention when its status is inconsistent and needs a look in the app, or it was never fully set up, in which case blockers says what to do.
status_labelobjectThe status as the theMarketer app words it.
familyobjectstandard (a classic signup popup), wheel_of_fortune, scratch_and_win or choose_a_gift; null when unknown.
family_labelobjectThe family as the app names it.
layoutobjectlightbox, fullscreen, slidein, floating or halfscreen.
motionobjectstatic or animated.
gameobjectwof, saw or cag for a game; null for a classic.
template_idobjectThe library template it was created from.
ready_to_publishbooleanTrue when enable_popup would accept it as it is.
blockersstring[]What stops it from going live, all at once; empty when ready. The same checks enable_popup makes.
statsobjectThe counters stored on the popup: impressions and signups with the rate. Figures for a period are on list_popups.
created_atobjectWhen the popup was created (UTC).
updated_atobjectWhen the popup was last renamed or its status last changed (UTC); saving its content does not move it.
linksobjectWhere to open this popup in the theMarketer web app: app_url opens its builder, and switch_domain_url comes first for accounts with several domains.
app_urlobjectLink to this object in the theMarketer web app, for the user to review or edit it there. Null when the app URL is not configured on this MCP server.
switch_domain_urlobjectOnly for accounts with several domains: open this first if the app is currently on another domain, then follow app_url. The app keeps one current domain per user and app_url only works on the domain this object belongs to.
contentobjectWhat the popup says and does, in the vocabulary update_popup takes: texts, success and losing steps, after-submit behaviour, the visible fields in order, countdown, tag, colours, image, devices, rewards (with the ids to keep when editing) and the display rules of the active trigger. needs_attention and notes say what could not be read back.
familyobjectstandard, wheel_of_fortune, scratch_and_win or choose_a_gift.
layoutobjectlightbox, fullscreen, slidein, floating or halfscreen.
motionobjectstatic or animated.
gameobjectwof, saw or cag for a game; null for a classic.
templateobjectThe template the popup was created from.
template_idobjectThe library template it was created from.
statusobjectdraft, active or paused.
headlineobjectThe headline, as HTML.
descriptionobjectThe text under the headline, as HTML.
button_textobjectThe signup button.
close_textobjectThe close link's text; null when there is none.
successobjectThe step shown after a signup (or a win).
loseobjectWheel only: the step shown on a losing slice.
after_submitobjectWhat happens on submit: show_success_step, redirect or close.
redirect_urlobjectWhere after_submit=redirect sends the visitor.
fieldsobject[]The visible form fields, in order.
countdownobjectThe countdown timer; null when hidden.
tagobjectTag added to every signup; null when none.
colorsobjectBackground, button and overlay colours.
imageobjectThe popup's picture; null when hidden.
devicesobjectWhere it shows: desktop, mobile or both.
rewardsobject[]Games: the wheel slices, scratch cards or gifts, with ids.
idobjectKeep the id from get_popup_details when editing a reward; omit for a new one.
labelstringText on the slice, card or gift.
chanceobjectWheel and scratch: win percentage; all rewards add up to 100. Not used for choose-a-gift (the visitor picks).
losingbooleanWheel only: a slice with no prize.
codeobjectThe discount the winner gets; required unless losing.
tagobjectWheel and choose-a-gift: tag added to contacts who win this reward (instead of the popup-level tag).
gift_iconobjectChoose-a-gift: the gift picture (get_popup_options kind=gift_icons).
display_rulesobjectWhen and to whom it shows (the active trigger).
needs_attentionbooleanThe stored popup is incomplete or holds values this tool cannot read; notes say what.
notesstring[]What could not be read back exactly, if anything.

Get popup options

get_popup_optionsRead

Look up what a signup popup can be built from on this domain: the triggers and the words the display rules take, the form fields and the contact columns a custom field can save into, the tags, the gift pictures for a choose-a-gift popup, whether unique discount codes can be generated, and the industries and languages the template library is filtered by.

Use before create_popup or update_popup to pick a valid trigger, field kind, contact column, tag, country, category or gift picture, and whenever a value's exact spelling matters. Not for a popup's own content: that is in get_popup_details.

kind=triggers lists each trigger with its key, when it fires and the display_rules parameters it takes, plus rule_parameters, the ones every trigger takes. kind=rule_values needs field and lists that vocabulary as value and label: audiences, frequencies, page_kinds, traffic_sources, weekdays, countries (code and name) or categories (the full path, with its id in the value). kind=fields lists the field kinds with their parameters, the custom field among them. kind=columns lists the domain's contact columns a custom field can save into, by name. kind=tags, kind=gift_icons, kind=industries and kind=languages are plain value lists. kind=coupon_webhook says whether the shop's coupon connection is set up. Lists come 200 per page, narrowed by search.

Parameters
ParameterTypeDescription
kindrequiredenumWhich list: triggers, rule_values (with field), fields, columns, tags, gift_icons, coupon_webhook, industries or languages. One of: triggers, rule_values, fields, columns, tags, gift_icons, coupon_webhook, industries, languages.
fieldenumWith kind=rule_values, which vocabulary: audiences, frequencies, page_kinds, traffic_sources, weekdays, countries or categories. One of: audiences, frequencies, page_kinds, traffic_sources, weekdays, countries, categories.
searchstringText to narrow the list by, matched in labels and values regardless of case; when nothing contains it, the closest spellings are listed instead and the note says so.
pageintegerPage number, starting at 1. Default: 1.
domain_idstringTarget domain.
Returns
FieldTypeDescription
kindstringThe list requested.
fieldobjectWith kind=rule_values: the list returned.
searchobjectThe text the list was narrowed by, or null.
triggersobject[]kind=triggers: when a popup can appear, each with the parameters it takes.
keystringThe trigger to pass in display_rules.
labelstringWhen it fires, in words.
parametersobject[]The display_rules parameters this trigger takes besides the common ones in rule_parameters.
namestringThe parameter name to pass in display_rules.
descriptionstringWhat it means and accepts.
values_fieldobjectWhen it takes values from a list: the field to pass with kind=rule_values to see them.
rule_parametersobject[]kind=triggers: the display_rules parameters every trigger takes (audience, pages, traffic, schedule, countries...).
namestringThe parameter name to pass in display_rules.
descriptionstringWhat it means and accepts.
values_fieldobjectWhen it takes values from a list: the field to pass with kind=rule_values to see them.
valuesobject[]kind=rule_values, columns, tags, gift_icons, industries, languages: the values, as what to pass and what the app shows.
valuestringWhat to pass to the popup tools.
labelstringThe value as the app shows it.
fieldsobject[]kind=fields: the kinds of field a popup form can carry, each with its parameters.
kindstringThe kind to pass in fields.
labelstringThe field as the builder names it.
descriptionstringWhat the field collects and takes.
parametersobject[]The parameters the field takes besides kind.
namestringThe parameter name to pass in display_rules.
descriptionstringWhat it means and accepts.
values_fieldobjectWhen it takes values from a list: the field to pass with kind=rule_values to see them.
coupon_webhookobjectkind=coupon_webhook: the coupon connection.
totalintegerEntries matched, across all pages.
pageintegerPage returned, starting at 1.
pagesintegerTotal pages.
per_pageintegerEntries per page, fixed at 200.
has_morebooleanTrue when a later page exists.
noteobjectWhich page to ask for next, or how the list applies; null otherwise.

List popup templates

list_popup_templatesRead

The library templates a signup popup can be created from: one family at a time (classic, wheel of fortune, scratch and win, choose a gift), optionally one layout, motion or industry, in the store's template language unless another is asked for.

Use before create_popup: the template fixes the popup's layout, motion and look for good (a different layout means a new popup), so show the user the preview pictures and pass the chosen template_id. For what a popup can then say and do, use get_popup_options; for the popups that already exist, list_popups.

Each row carries the template id, name, preview image URL, layout, motion, image position, game and industry, 20 per page. Templates come in the store's template language (Settings > Store profile); when the store has none, or no template of this family exists in it, the result is needs_user_input asking which language to use, with the languages that do have templates as options: ask the user, then call again with decision_token and decision_answers, or pass language directly.

Parameters
ParameterTypeDescription
familyrequiredenumstandard (a classic signup popup), wheel_of_fortune, scratch_and_win or choose_a_gift. One of: standard, wheel_of_fortune, scratch_and_win, choose_a_gift.
layoutenumOnly this layout: lightbox, fullscreen, slidein, floating (standard); lightbox, slidein, halfscreen (wheel); slidein (scratch); lightbox, slidein (gift). Omit for all. One of: lightbox, fullscreen, floating, slidein, halfscreen.
motionenumstandard only: static or animated. Omit for both. One of: static, animated.
industrystringOnly templates made for this industry, by name as get_popup_options kind=industries lists them. Omit or pass "all" for every industry.
languagestringThe language the templates are in, by name as get_popup_options kind=languages lists them. Omit for the store's template language.
pageintegerPage number, starting at 1. Default: 1.
decision_tokenstringFrom a needs_user_input result of this tool, together with decision_answers; leave it out otherwise.
decision_answersobjectThe user's answer by decision key, e.g. {"language": "<option value>"}; only with decision_token.
domain_idstringTarget domain.
Returns

The operation's result, pending user questions, or cancellation.

Create popup

create_popupWrite

Create a signup popup as a draft from a library template: a classic signup popup, a wheel of fortune, a scratch and win or a choose a gift, with its texts, form fields, rewards, colours, image, countdown and display rules.

Use when the user wants a new popup on the shop: pick the template with list_popup_templates first (show them the preview pictures), because the template fixes the popup's layout, motion and look for good; a different layout means a new popup. Every section besides template_id and name is optional: what is left out stays as the template has it, and a popup created from a template alone is valid. The popup is always created as a draft; enable_popup publishes it, update_popup changes it later. Names (tags, categories, countries, contact columns, gift pictures) are matched for you, and an unknown one is answered with the closest matches; get_popup_options lists them all.

Texts take plain text or simple HTML (bold, italic, underline, links, colours, line breaks); the shop shows anything else as plain text. In a game's success headline {{reward_label}} is replaced by the reward won. A game created without rewards carries the template's example rewards and codes, which must be replaced with update_popup before enabling it. The result carries the new popup_id, the content as stored, ready_to_publish with the blockers enable_popup would report, warnings for what was taken from the template, a name read loosely or text saved differently than sent, and links.app_url to open the builder.

Parameters
ParameterTypeDescription
template_idrequiredstringThe template from list_popup_templates (24 hex characters); it fixes the family, layout and motion.
namerequiredstringThe popup's name in the app, 1 to 120 characters; plain text without HTML (links and slashes are removed).
headlinestringThe headline, plain text or simple HTML.
descriptionstringThe text under the headline, plain text or simple HTML.
button_textstringThe signup button's text, plain text.
close_textstringThe close link's text, e.g. "No thanks"; plain text.
successobjectThe step shown after a signup (or a win): headline, description, button text and, on a classic popup, what the button does (close or redirect) and the step's image.
loseobjectWheel of fortune only: the headline and description shown on a losing slice.
after_submitenumClassic popups: show_success_step (default), redirect to redirect_url, or close the popup. A game always shows its success step. One of: show_success_step, redirect, close.
redirect_urlstringWhere after_submit=redirect sends the visitor; an https address.
fieldsobject[]The form's inputs, in order, replacing the template's; always include the email field (kind=email). Kinds: email, name (or first_name and last_name), phone, birthday, gender, consent (a checkbox) and custom (a contact column as get_popup_options kind=columns lists them, up to three). Omit to keep the template's fields.
countdownobjectA countdown timer: dynamic (days, hours, minutes, seconds from the first view) or until a moment, with what happens at zero. Omit to keep the template's.
tagstringTag added to every contact who signs up, by name as get_popup_options kind=tags lists them.
colorsobjectBackground, button and overlay colours as #RRGGBB or #RRGGBBAA; the rest of the look stays with the template.
imageobjectThe popup's picture (an https URL, e.g. from upload_image) with an optional one for phones; static, non-fullscreen classic popups and choose a gift only.
devicesobjectWhere it shows: desktop, mobile or both (the default).
rewardsobject[]Games: the wheel slices, scratch cards or gifts, in order, each with a label, a discount code (fixed, or unique through the shop's coupon connection), a win chance on the wheel and scratch (adding up to 100), and a gift picture on choose a gift. A wheel takes 4, 6, 8 or 12; scratch 3 or 6; gift 3 or 4.
display_rulesobjectWhen and to whom it shows: the trigger (page_landing with a delay, exit_intent, scroll_depth, click_count, inactivity), audience and frequency, pages, traffic sources, schedule and countries. Omit for the template's rule: on page landing, to everyone.
removeenum[]Parts of the template to leave off the popup: countdown (no timer), image (no picture), tag (no tag on signup), close_text (no close link) or success_image (no picture on the success step). A part cannot be both removed and given.
domain_idstringTarget domain.
Returns
FieldTypeDescription
popup_idstringtheMarketer id of the new popup (24 hex characters), for update_popup, enable_popup and get_popup_details.
nameobjectThe name as stored.
statusstringAlways draft: a new popup never shows by itself.
status_labelobjectThe status as the theMarketer app words it.
familyobjectstandard (a classic signup popup), wheel_of_fortune, scratch_and_win or choose_a_gift, as the template fixed it.
layoutobjectlightbox, fullscreen, slidein, floating or halfscreen, as the template fixed it.
motionobjectstatic or animated, as the template fixed it.
contentobjectWhat the popup says and does, as stored: texts, success and losing steps, fields in order, countdown, tag, colours, image, devices, rewards (with the ids to keep when editing) and the display rules of the active trigger.
familyobjectstandard, wheel_of_fortune, scratch_and_win or choose_a_gift.
layoutobjectlightbox, fullscreen, slidein, floating or halfscreen.
motionobjectstatic or animated.
gameobjectwof, saw or cag for a game; null for a classic.
templateobjectThe template the popup was created from.
template_idobjectThe library template it was created from.
statusobjectdraft, active or paused.
headlineobjectThe headline, as HTML.
descriptionobjectThe text under the headline, as HTML.
button_textobjectThe signup button.
close_textobjectThe close link's text; null when there is none.
successobjectThe step shown after a signup (or a win).
loseobjectWheel only: the step shown on a losing slice.
after_submitobjectWhat happens on submit: show_success_step, redirect or close.
redirect_urlobjectWhere after_submit=redirect sends the visitor.
fieldsobject[]The visible form fields, in order.
countdownobjectThe countdown timer; null when hidden.
tagobjectTag added to every signup; null when none.
colorsobjectBackground, button and overlay colours.
imageobjectThe popup's picture; null when hidden.
devicesobjectWhere it shows: desktop, mobile or both.
rewardsobject[]Games: the wheel slices, scratch cards or gifts, with ids.
idobjectKeep the id from get_popup_details when editing a reward; omit for a new one.
labelstringText on the slice, card or gift.
chanceobjectWheel and scratch: win percentage; all rewards add up to 100. Not used for choose-a-gift (the visitor picks).
losingbooleanWheel only: a slice with no prize.
codeobjectThe discount the winner gets; required unless losing.
tagobjectWheel and choose-a-gift: tag added to contacts who win this reward (instead of the popup-level tag).
gift_iconobjectChoose-a-gift: the gift picture (get_popup_options kind=gift_icons).
display_rulesobjectWhen and to whom it shows (the active trigger).
needs_attentionbooleanThe stored popup is incomplete or holds values this tool cannot read; notes say what.
notesstring[]What could not be read back exactly, if anything.
ready_to_publishbooleanTrue when enable_popup would accept it as it is.
blockersstring[]What stops it from going live, all at once; empty when ready. The same checks enable_popup makes.
warningsstring[]What was taken from the template because it was not given (example rewards on a game, the template's fields, the template's texts), names read loosely, such as a category matched ignoring accents, text that was saved differently than sent (for example HTML the popup cannot show), and rules that only some visitors can meet.
linksobjectWhere to open this popup in the theMarketer web app: app_url opens its builder, and switch_domain_url comes first for accounts with several domains.
app_urlobjectLink to this object in the theMarketer web app, for the user to review or edit it there. Null when the app URL is not configured on this MCP server.
switch_domain_urlobjectOnly for accounts with several domains: open this first if the app is currently on another domain, then follow app_url. The app keeps one current domain per user and app_url only works on the domain this object belongs to.
notestringWhat happens next and how to follow it.

Update popup

update_popupDestructive

Change a signup popup's name, texts, form fields, rewards, colours, image, countdown, devices or display rules, or take a part off it; sections left out stay as they are.

Use when the user wants to edit an existing popup: new wording, other fields, real discount codes on a game, a different trigger or audience. Read it first with get_popup_details: fields, rewards and display_rules replace the whole list, so pass every item to keep together with the change, and keep each reward's id from the details so winners' codes stay attached to it; success, lose and colors change only the keys given. remove takes the countdown, image, tag, close link or success image off the popup. The layout, motion and look come from the template and cannot change here; a different layout means a new popup with create_popup. Not for publishing or pausing (enable_popup, pause_popup).

A draft or paused popup is saved directly. A popup that is live on the shop is saved only after the user confirms: the result is then needs_user_input with the one question and pending_changes listing what will change; ask the user, then call again with the same arguments plus decision_token and decision_answers. Once saved, the change shows to visitors on their next page load. Nothing is written while the question is pending or when the user cancels. Texts take plain text or simple HTML (bold, italic, underline, links, colours, line breaks), and in a game's success headline {{reward_label}} is replaced by the reward won. The result lists what was applied (changed), the content as stored, ready_to_publish with the blockers enable_popup would report, and warnings for a name read loosely or text saved differently than sent.

Parameters
ParameterTypeDescription
popup_idrequiredstringThe popup to change, by id from list_popups (24 hex characters).
namestringA new name for the popup in the app, 1 to 120 characters; plain text without HTML (links and slashes are removed).
headlinestringThe headline, plain text or simple HTML.
descriptionstringThe text under the headline, plain text or simple HTML.
button_textstringThe signup button's text, plain text.
close_textstringThe close link's text, e.g. "No thanks"; plain text.
successobjectThe step shown after a signup (or a win): headline, description, button text and, on a classic popup, what the button does (close or redirect) and the step's image.
loseobjectWheel of fortune only: the headline and description shown on a losing slice.
after_submitenumClassic popups: show_success_step, redirect to redirect_url, or close the popup. A game always shows its success step. One of: show_success_step, redirect, close.
redirect_urlstringWhere after_submit=redirect sends the visitor; an https address.
fieldsobject[]The form's inputs, in order, replacing the current ones; always include the email field (kind=email). Kinds: email, name (or first_name and last_name), phone, birthday, gender, consent (a checkbox) and custom (a contact column as get_popup_options kind=columns lists them, up to three).
countdownobjectA countdown timer: dynamic (days, hours, minutes, seconds from the first view) or until a moment, with what happens at zero.
tagstringTag added to every contact who signs up, by name as get_popup_options kind=tags lists them.
colorsobjectBackground, button and overlay colours as #RRGGBB or #RRGGBBAA; the rest of the look stays with the template.
imageobjectThe popup's picture (an https URL, e.g. from upload_image) with an optional one for phones; static, non-fullscreen classic popups and choose a gift only.
devicesobjectWhere it shows: desktop, mobile or both.
rewardsobject[]Games: the wheel slices, scratch cards or gifts, in order, replacing the current ones; keep each id from get_popup_details for a reward that stays. Each has a label, a discount code (fixed, or unique through the shop's coupon connection), a win chance on the wheel and scratch (adding up to 100), and a gift picture on choose a gift. A wheel takes 4, 6, 8 or 12; scratch 3 or 6; gift 3 or 4.
display_rulesobjectWhen and to whom it shows, replacing the current rule as a whole: the trigger (page_landing with a delay, exit_intent, scroll_depth, click_count, inactivity), audience and frequency, pages, traffic sources, schedule and countries. Parts left out are turned off, so re-send the audience, show_to_subscribed, pages, traffic, schedule and countries to keep (get_popup_details shows them).
removeenum[]Parts to take off the popup: countdown (no timer), image (no picture), tag (no tag on signup), close_text (no close link) or success_image (no picture on the success step). A part cannot be both removed and given.
decision_tokenstringFrom a needs_user_input result of this tool for this popup, together with decision_answers; leave it out on the first call.
decision_answersobjectThe user's answer by decision key, e.g. {"confirm": "proceed"} or {"confirm": "cancel"}; only with decision_token.
domain_idstringTarget domain.
Returns

The operation's result, pending user questions, or cancellation.

Enable popup

enable_popupWrite

Publish a draft or paused signup popup on the shop, after the user confirms: from the next page load visitors see it.

Use when the user wants a popup live, or back after a pause. Before anything changes the popup is checked the way the app's Enable button expects it: set up from a template, rewards complete for a game (real discount codes, chances adding up to 100, a gift picture per gift, the shop's coupon connection for unique codes), at least one device, a tag when tagging is on, and the shop able to render it; everything that stops it is reported at once and nothing is enabled (get_popup_details shows the same blockers without trying). A popup that is already active is reported as such. To stop it later, pause_popup; to edit it while it is live, update_popup.

The first call answers needs_user_input with one question, the trigger and the audience the popup will show to: ask the user, then call again with decision_token and decision_answers. Once enabled the result gives the status before and after, whether the shop's popup feed already lists it, warnings (another active popup on the same trigger, which visitors see one at a time; the first active popup of a domain can take up to 5 minutes to appear) and links.app_url.

Parameters
ParameterTypeDescription
popup_idrequiredstringThe popup to publish, by id (24 hex characters, from list_popups).
decision_tokenstringFrom a needs_user_input result of this tool, together with decision_answers; leave it out otherwise.
decision_answersobjectThe user's answer by decision key, e.g. {"confirm": "proceed"}; only with decision_token.
domain_idstringTarget domain.
Returns

The operation's result, pending user questions, or cancellation.

Pause popup

pause_popupWrite

Take a live signup popup off the shop: visitors stop seeing it on their next page load, and everything about it is kept.

Use when the user wants a popup to stop showing for a while, before deleting it (delete_popup takes only popups that are not live), or to edit it without visitors seeing the steps. Pausing changes nothing else: the texts, rewards, rules and figures stay, and enable_popup brings it back as it was. Only an active popup can be paused: a draft was never enabled, so there is nothing to pause; a paused one is reported as such. No confirmation is asked, as the app pauses in one click and the step is reversible.

The result gives the status before and after, with links.app_url to open the popup in the app.

Parameters
ParameterTypeDescription
popup_idrequiredstringThe popup to pause, by id (24 hex characters, from list_popups).
domain_idstringTarget domain.
Returns
FieldTypeDescription
popup_idstringThe popup acted on.
nameobjectIts name.
pausedbooleanTrue when this call paused the popup; false when it was already paused, in which case nothing changed.
status_beforestringThe status when the tool read it.
status_afterstringThe status read back after the call: paused once it is off the shop; needs_attention when its status needs a look in the app, which the note says.
status_labelobjectstatus_after as the theMarketer app words it.
linksobjectWhere to open this popup in the theMarketer web app: app_url, and switch_domain_url for accounts with several domains.
app_urlobjectLink to this object in the theMarketer web app, for the user to review or edit it there. Null when the app URL is not configured on this MCP server.
switch_domain_urlobjectOnly for accounts with several domains: open this first if the app is currently on another domain, then follow app_url. The app keeps one current domain per user and app_url only works on the domain this object belongs to.
notestringWhat happened and what to do next.

Delete popup

delete_popupDestructive

Delete a draft or paused signup popup for good, after the user confirms.

Use when the user wants a popup gone: an abandoned draft, a test, a popup that was replaced. Only a popup that is not live can be deleted, as in the app: an active one needs pause_popup first. The popup disappears from list_popups and cannot be restored from here (duplicate_popup beforehand keeps a copy); its statistics stay in the reports (get_report channel=forms). To stop a popup without losing it, pause_popup is enough.

The first call answers needs_user_input with the one question to ask the user; call again with decision_token and decision_answers once they agreed. Nothing is deleted before that.

Parameters
ParameterTypeDescription
popup_idrequiredstringThe popup to delete, by id (24 hex characters, from list_popups).
decision_tokenstringFrom a needs_user_input result of this tool, together with decision_answers; leave it out otherwise.
decision_answersobjectThe user's answer by decision key, e.g. {"confirm": "proceed"}; only with decision_token.
domain_idstringTarget domain.
Returns

The operation's result, pending user questions, or cancellation.

Duplicate popup

duplicate_popupWrite

Copy a signup popup as a new popup that is not live, on the same domain or on another domain of the account.

Use when the user wants a variant without touching the original, a backup before a big edit, or the same popup on another of their shops. The copy has the same template, texts, fields, rewards and display rules; statistics are not copied. On the same domain the copy keeps the original's status unless that is live, in which case the copy is paused at once, so no second popup starts showing; the copy is named name or "Copy of <original>". On another domain (target_domain_id) the copy is created as a draft from the same template and filled with the original's content; rewards get fresh ids, and a tag, custom field column or category that does not exist there is left out and listed in warnings. A copy to another domain is made only after the user confirms: the first call answers needs_user_input with the question, and the next call carries decision_token and decision_answers. Not for publishing the copy (enable_popup does that) or for changing it (update_popup).

The result carries the copy's id, name, domain, status and links.app_url; calls about a copy on another domain pass that domain as domain_id.

Parameters
ParameterTypeDescription
popup_idrequiredstringThe popup to copy, by id (24 hex characters, from list_popups).
namestringName for the copy, plain text up to 120 characters; omit for "Copy of <original name>".
target_domain_idstringAnother domain of the account to copy into, by name (hostname) or id as list_domains shows them; omit to copy within the same domain.
decision_tokenstringFrom a needs_user_input result of this tool, together with decision_answers; leave it out otherwise.
decision_answersobjectThe user's answer by decision key, e.g. {"confirm": "proceed"}; only with decision_token.
domain_idstringTarget domain.
Returns

The operation's result, pending user questions, or cancellation.

Automations14

List automations

list_automationsRead

List the account's automated journeys (automations) with their status, trigger, objective and headline results, newest first.

Use when the user asks which automations exist, which are running or paused, how a journey is doing, or whenever you need an automation id for the other automation tools. For one journey's steps and content use get_automation_details; for its per-step and per-contact figures use get_automation_report.

Each row carries the id, name, status (draft, running, paused) with status_label, the objective, the trigger key and its editor label, created and updated times, currency and stats for the chosen period: contacts entered, waiting in the journey (in_progress), completed, messages sent with unique opens and clicks (summed over the channels), transactions, revenue and its growth against the previous period, and under channels each channel's own sent, unique opens and clicks, their rates in percent, transactions, conversion rate and revenue; only channels with activity are listed, so a channel absent from channels sent nothing in the period. Rows come 20 per page; theMarketer reports no total, so has_more is true when the page came back full and the note names the next page. The period changes the figures only, never which journeys are listed; start_date and end_date give the calendar days it covered.

Parameters
ParameterTypeDescription
statusenumWhich journeys to list: all, running, paused or draft. Omit for all. One of: all, running, paused, draft. Default: 'all'.
searchstringCase-insensitive text the journey name must contain. Omit to list every journey.
objectivestringOnly journeys with this objective, spelled as get_automation_options kind=objectives lists them (e.g. "Recover abandoned carts"). Omit for every objective.
periodenumThe window the stats cover: today, yesterday, this_week, last_week, this_month, last_month, last_30_days (default), last_60_days or last_90_days. One of: today, yesterday, this_week, last_week, this_month, last_month, last_30_days, last_60_days, last_90_days. Default: 'last_30_days'.
pageintegerPage number, starting at 1. Default: 1.
domain_idstringTarget domain.
Returns
FieldTypeDescription
automationsobject[]The journeys on this page, newest created first.
idstringtheMarketer id of the automation.
nameobjectJourney name.
statusobjectdraft, running or paused.
status_labelobjectThe status as the theMarketer app words it.
objectiveobjectThe objective chosen for the journey, if any.
triggerobjectTrigger key as get_automation_options kind=triggers lists it (e.g. cart_abandonment); null until the journey is saved.
trigger_labelobjectThe trigger's name in the editor.
created_atobjectWhen the journey was created (UTC).
updated_atobjectWhen it was last saved (UTC).
statsobjectFigures for the requested period: the journey as a whole, and each channel under channels.
enteredintegerContacts that entered the journey in the period.
in_progressintegerContacts waiting inside the journey right now (in a delay or before a webhook), whatever the period; meaningful for running journeys.
completedintegerContacts that reached the end in the period.
sentintegerMessages sent, every channel together.
unique_opensintegerContacts who opened at least one message, summed over the channels.
unique_clicksintegerContacts who clicked at least one message, summed over the channels.
transactionsintegerOrders attributed to the journey.
revenuenumberAttributed revenue in currency.
growthobjectRevenue change against the previous period of the same length, in percent.
channelsmap<object>The figures per channel (email, sms, push, mobile_push), with the open, click and conversion rates. Only channels with activity are listed: a channel absent from here sent nothing in the period.
currencyobjectCurrency of stats.revenue.
periodstringThe period the stats cover.
start_datestringFirst day period covers (YYYY-MM-DD, inclusive).
end_datestringLast day period covers (inclusive).
pageintegerPage returned, starting at 1.
per_pageintegerJourneys per page, fixed at 20.
has_morebooleanTrue when this page came back full, the only signal theMarketer gives: it reports no total, so the next page may still be empty.
noteobjectWhich page to ask for next when there may be more; null when this page is the last.

Get automation details

get_automation_detailsRead

Everything configured on one automated journey: its trigger with settings, the steps in flow order with their ids, which email steps have a saved body, and on request the HTML of one email step.

Use when the user asks what an automation does or how it is set up, before update_automation to see the current trigger and steps (the flow is in the exact shape those tools take, ids included), or to read an email's copy. Whether a journey is ready to start is not decided here: start_automation with dry_run=true runs every start check and never starts it, and its real call asks the user before anything starts. Find the id with list_automations. Performance figures are in get_automation_report.

The result carries name, status with status_label, objective, created and updated times, links.app_url to open the editor, and flow: the trigger (type, run mode, entry window in the shop's timezone, trigger-specific fields) and nested steps - email, sms, push, mobile_push, delay, filter (with yes / no branches), split (a / b), add_tags, remove_tags, unsubscribe, start_automation, webhook - plus orphans not connected to the trigger and notes (what could not be read back exactly, a filter condition that checks a message step which is not in this journey, and a start_automation step whose journey was deleted). A step the tools do not edit reads as type 'kept' with a summary. Email steps in flow carry has_content, not their body; the body is read with email_step_id. email_steps lists each email step with its subject, branch, has_content and the blocks its body holds. With email_step_id the saved HTML of that step comes as email_content, 80 lines per page (a line longer than 200 characters is cut only where a line break changes nothing) with pages and a note naming the next page; each block in it shows as its placeholder and its options come in email_content.blocks, so the lines joined with newlines and the blocks can be passed back to update_automation as they are, unless notes name a block the tools cannot write back in that email. Without it the body is not fetched.

Parameters
ParameterTypeDescription
automation_idrequiredstringThe automation's id from list_automations (24 hex characters).
email_step_idstringId of one email step of this journey (from email_steps) whose saved HTML you want; omit to skip the body.
pageintegerPage number, starting at 1. Default: 1.
domain_idstringTarget domain.
Returns
FieldTypeDescription
automation_idstringtheMarketer id of the automation.
nameobjectJourney name.
statusobjectdraft, running or paused.
status_labelobjectThe status as the theMarketer app words it.
objectiveobjectThe objective chosen for the journey, if any.
created_atobjectWhen the journey was created (UTC).
updated_atobjectWhen it was last saved (UTC).
linksobjectWhere to open this journey in the theMarketer web app: app_url opens its editor, and switch_domain_url comes first for accounts with several domains.
flowobjectThe journey as create_automation / update_automation take it: trigger with its settings and trigger_label, steps nested in flow order (a filter carries yes / no, a split a / b), each step with its id; a step of a kind these tools do not edit reads as type 'kept' with a summary. An email step carries has_content instead of its body. orphans are steps not connected to the trigger; notes say what could not be read back exactly. The whole flow can be passed back to update_automation as it is: an email step passed back without html keeps its saved body (read it with get_automation_details email_step_id).
steps_countintegerSteps reachable from the trigger, orphans excluded.
email_stepsobject[]Every email step with its subject and whether a body is saved; a journey cannot start while an email step has no body.
email_contentobjectThe saved HTML of the step named by email_step_id, 80 lines per page; null when no step was asked for.

Preview automation email

preview_automation_emailRead

Show one email step of an automation as a contact would receive it: placeholders filled in, products taken from the shop's catalogue, links resolved.

Use after create_automation or update_automation saved an email body, and before start_automation, to see the real result and whether anything is still wrong; get_automation_details shows the saved source instead. The email is rendered for a sample contact (the signed-in user's address) with real products from the catalogue, and nothing is sent. rendered carries the HTML 80 lines per page (a line longer than 200 characters cut only where a line break changes nothing) with pages and a note naming the next page. check says whether the email is fit to send: placeholders left unfilled, product slots that stayed empty, a missing unsubscribe link, and a note on what to fix; it covers the whole email whatever page is shown. Its warnings name each filtered product block that too few products in stock meet, with at most how many do (the remaining places are filled with the newest products in stock), each one with a price no product of the catalogue reaches, and each one whose filters the rendering cannot confirm otherwise, such as a price some products may meet; a block that enough products meet needs no warning. A products-from-the-trigger block is warned only for a price no product of the catalogue reaches, since its filters apply only when the event that started the journey carries no products.

The step must be an email step of this journey with a saved body; without one the call says so and names update_automation. Products come from the shop's catalogue rather than from one contact's cart or orders, so a block fed by the trigger shows catalogue products here and the contact's own once the journey runs. When the email has a countdown block, previewing also prepares its countdown images.

Parameters
ParameterTypeDescription
automation_idrequiredstringThe automation's id from list_automations (24 hex characters).
step_idrequiredstringId of the email step to render, as get_automation_details lists it under email_steps.
pageintegerPage number, starting at 1. Default: 1.
domain_idstringTarget domain.
Returns
FieldTypeDescription
automation_idstringThe automation the step belongs to.
step_idstringThe email step that was rendered.
subjectobjectSubject line saved on the step; null when none is saved yet.
renderedobjectThe rendered HTML, 80 lines per page, with the page counters and a note naming the next page.
linesstring[]Lines of the rendered email for this page; join them with newlines to get the HTML back; a line longer than 200 characters is cut only where a line break changes nothing (between table tags or at a space), so a line with no such place stays longer.
total_linesintegerLines in the whole rendered email.
content_total_charsintegerCharacters in the whole rendered email.
pageintegerPage returned, starting at 1.
pagesintegerTotal pages of lines.
per_pageintegerLines per page, fixed at 80 (about 16000 characters at most, more when a line cannot be cut).
has_morebooleanTrue when a later page exists.
noteobjectWhich page to ask for next when there is one; null otherwise.
checkobjectWhether the email is fit to send, and what to fix when not; it covers the whole email whatever page was asked for.
okbooleanTrue when nothing needs fixing: every placeholder was filled, every product slot shows a product and the unsubscribe link works.
unresolved_tokensstring[]Placeholders left as written in the rendered email, such as {{first_name}} inside an attribute or a block where it is not filled, each once in order of appearance; a contact would see them as text. A misspelt placeholder is not listed here: it renders as nothing, and the email step's warnings name it when the body is written.
empty_product_slotsstring[]Product slots that rendered without a product image or name, named by block and position: the catalogue had nothing to put there, or the slot asks for more products than the block provides.
missing_unsubscribebooleanTrue when the rendered email has no working unsubscribe link; every marketing email needs one.
noteobjectOne sentence on what to fix and how; null when the email is fit to send.
warningsstring[]What is worth checking by eye: a filtered product block that too few products meet, so the newest products in stock fill the remaining places, one with a price no product reaches, or one whose filters the rendering cannot confirm; empty when there is nothing to check.
notestringWhat the preview shows (a sample contact, catalogue products, nothing sent), the verdict of check, and what the email's discount codes read as here.

Get automation report

get_automation_reportRead

How one automated journey performed over a period: contacts entered and completed, sends, opens, clicks, orders and revenue per channel and per step, and on request who a message step reached.

Use when the user asks how an automation is doing, which step loses contacts, how a specific email or SMS in the journey performs, or who received it. Find the id with list_automations, whose rows already carry headline figures; come here for the breakdown. For the journey's setup use get_automation_details.

The result carries totals (entered, completed, waiting inside the journey right now, about_to_enter), channels (email, sms, push, mobile_push with counters and rates in percent) and steps: one entry per step in flow order with its id, kind, a readable label, the branch it sits in and its counters (entered, exited, yes/no for filters, sends, opens, clicks, orders, revenue and rates for message steps; 0 where no contact reached the step in the period, which the note then says). With step_id the recipients of that message step come 25 per page with email or phone, opened, clicked, orders and revenue; theMarketer reports no total, so has_more means the page came back full. Dates are whole days in Romanian time (Europe/Bucharest).

Parameters
ParameterTypeDescription
automation_idrequiredstringThe automation's id from list_automations (24 hex characters).
start_datestringFirst day of the period (YYYY-MM-DD). Give it with end_date, or omit both for the last 30 days.
end_datestringLast day of the period (YYYY-MM-DD), inclusive; not before start_date.
step_idstringId of an email, sms, push or mobile_push step of this journey (from steps or get_automation_details) whose recipients you want; omit to skip the per-contact rows. The recipient list is kept for about 180 days, so a period older than that lists no one while the step's figures still count its sends.
pageintegerPage number, starting at 1. Default: 1.
domain_idstringTarget domain.
Returns
FieldTypeDescription
automation_idstringtheMarketer id of the automation.
nameobjectJourney name.
statusobjectdraft, running or paused.
status_labelobjectThe status as the theMarketer app words it.
trigger_labelobjectThe trigger's name in the editor.
start_datestringFirst day of the period (inclusive).
end_datestringLast day of the period (inclusive).
totalsobjectContacts entered, completed, waiting.
enteredintegerContacts that entered the journey.
completedintegerContacts that reached the end.
waitingobjectContacts inside the journey right now (in a delay or before a webhook), whatever the period; null when it could not be read this time.
about_to_enterintegerContacts whose trigger event is scheduled and will enter once its wait window passes (cart and checkout abandonment, form abandonment, inactivity).
noteobjectSet when waiting is null: the number of contacts waiting could not be read this time; the other figures are complete.
channelsobjectSends, opens, clicks, orders, revenue and rates per channel.
emailobjectEmail.
sentintegerMessages sent.
opensintegerTotal opens, repeats included.
unique_opensintegerContacts who opened at least once.
clicksintegerTotal clicks, repeats included.
unique_clicksintegerContacts who clicked at least once.
ordersintegerOrders attributed to the channel.
revenuenumberAttributed revenue.
undeliveredintegerBounces.
complaintsintegerSpam complaints.
unsubscribesintegerUnsubscribes.
aovobjectAverage value of the attributed orders.
delivery_rateobjectDelivered / sent, in percent.
open_rateobjectOpens / delivered, in percent.
unique_open_rateobjectUnique opens / delivered, in percent.
click_rateobjectClicks / opens for email and mobile push, clicks / sent for SMS and web push, in percent.
unique_click_rateobjectUnique clicks on the same basis, in percent.
bounce_rateobjectUndelivered / sent, in percent.
conversion_rateobjectOrders / clicks, in percent.
unsubscribe_rateobjectUnsubscribes / sent, in percent.
smsobjectSMS.
sentintegerMessages sent.
opensintegerTotal opens, repeats included.
unique_opensintegerContacts who opened at least once.
clicksintegerTotal clicks, repeats included.
unique_clicksintegerContacts who clicked at least once.
ordersintegerOrders attributed to the channel.
revenuenumberAttributed revenue.
undeliveredintegerBounces.
complaintsintegerSpam complaints.
unsubscribesintegerUnsubscribes.
aovobjectAverage value of the attributed orders.
delivery_rateobjectDelivered / sent, in percent.
open_rateobjectOpens / delivered, in percent.
unique_open_rateobjectUnique opens / delivered, in percent.
click_rateobjectClicks / opens for email and mobile push, clicks / sent for SMS and web push, in percent.
unique_click_rateobjectUnique clicks on the same basis, in percent.
bounce_rateobjectUndelivered / sent, in percent.
conversion_rateobjectOrders / clicks, in percent.
unsubscribe_rateobjectUnsubscribes / sent, in percent.
pushobjectWeb push notifications.
sentintegerMessages sent.
opensintegerTotal opens, repeats included.
unique_opensintegerContacts who opened at least once.
clicksintegerTotal clicks, repeats included.
unique_clicksintegerContacts who clicked at least once.
ordersintegerOrders attributed to the channel.
revenuenumberAttributed revenue.
undeliveredintegerBounces.
complaintsintegerSpam complaints.
unsubscribesintegerUnsubscribes.
aovobjectAverage value of the attributed orders.
delivery_rateobjectDelivered / sent, in percent.
open_rateobjectOpens / delivered, in percent.
unique_open_rateobjectUnique opens / delivered, in percent.
click_rateobjectClicks / opens for email and mobile push, clicks / sent for SMS and web push, in percent.
unique_click_rateobjectUnique clicks on the same basis, in percent.
bounce_rateobjectUndelivered / sent, in percent.
conversion_rateobjectOrders / clicks, in percent.
unsubscribe_rateobjectUnsubscribes / sent, in percent.
mobile_pushobjectMobile push notifications.
sentintegerMessages sent.
opensintegerTotal opens, repeats included.
unique_opensintegerContacts who opened at least once.
clicksintegerTotal clicks, repeats included.
unique_clicksintegerContacts who clicked at least once.
ordersintegerOrders attributed to the channel.
revenuenumberAttributed revenue.
undeliveredintegerBounces.
complaintsintegerSpam complaints.
unsubscribesintegerUnsubscribes.
aovobjectAverage value of the attributed orders.
delivery_rateobjectDelivered / sent, in percent.
open_rateobjectOpens / delivered, in percent.
unique_open_rateobjectUnique opens / delivered, in percent.
click_rateobjectClicks / opens for email and mobile push, clicks / sent for SMS and web push, in percent.
unique_click_rateobjectUnique clicks on the same basis, in percent.
bounce_rateobjectUndelivered / sent, in percent.
conversion_rateobjectOrders / clicks, in percent.
unsubscribe_rateobjectUnsubscribes / sent, in percent.
stepsobject[]One entry per step in flow order (a branch right after its step, yes before no), each labelled; a step no contact reached in the period shows 0 in the counters its kind has, and null marks a counter the kind does not have.
step_idstringThe step's id, as get_automation_details shows it; for a message step pass it as step_id to list its recipients.
typestringStep kind: email, sms, push, mobile_push, delay, filter, split, add_tags, remove_tags, unsubscribe, start_automation, webhook or kept.
labelstringThe step in words (subject, wait, conditions).
branchstring'' on the main path, else the branch path such as 'no' or 'yes.a' ('branch_1' / 'branch_2' under a kept filter or split); 'orphan' when the step is not connected to the trigger.
enteredobjectContacts that reached the step.
exitedobjectContacts that moved on from the step.
yesobjectFilter steps: contacts that matched.
noobjectFilter steps: contacts that did not match.
sentobjectMessage steps: sent.
opensobjectMessage steps: opens.
unique_opensobjectMessage steps: contacts who opened.
clicksobjectMessage steps: clicks.
unique_clicksobjectMessage steps: contacts who clicked.
ordersobjectMessage steps: attributed orders.
revenueobjectMessage steps: attributed revenue.
undeliveredobjectMessage steps: bounces.
unsubscribesobjectMessage steps: unsubscribes.
open_rateobjectIn percent.
unique_open_rateobjectIn percent.
click_rateobjectIn percent.
unique_click_rateobjectIn percent.
conversion_rateobjectIn percent.
unsubscribe_rateobjectIn percent.
surveyobjectEmail steps that carry a poll: one entry per question with type, options, interactions, responses and stat (count and percent per option); null otherwise.
recipientsobjectWith step_id: the contacts that message step reached in the period, 25 per page; null otherwise.
noteobjectSet when some steps have no figures for the period: no contact reached them, and their counters read 0. Null otherwise.

Get automation options

get_automation_optionsRead

Look up what this domain can build automated journeys from: the triggers, filter conditions and step kinds its plan allows (with the fields each takes), the objectives, the email senders, and the domain's own value lists (tags, segments, products, categories, brands, campaigns, order statuses, forms, surveys, custom events, attributes, loyalty tiers, email providers, locations, journeys that can be started by another journey).

Use before create_automation or update_automation to pick a valid trigger key, condition key, step type or sender, and whenever a value's exact spelling matters (a tag, a segment, an order status). Not for a journey's own steps: those are in get_automation_details.

kind=triggers lists each trigger with its key, category, when it fires and needs_tracking (it fires on website activity reported by the theMarketer tracking script); with search (e.g. the trigger key) each one found also carries its fields (required first, with the values_field to look values up) and the general settings it offers. kind=conditions lists each filter condition with operators, what value must be, fixed choices, what an operator or choice word stands for when the word alone does not say it (operator_meanings, choice_meanings), the values_field for list values, and applies_to when it only works after certain triggers; the domain's contact attributes (custom:<Label>) and product attributes (product_attribute:<Label>) are included. kind=actions lists the step kinds with their fields and consequences. Triggers, conditions and actions show only what the domain can use; the unavailable lines say which groups need a plan or feature it lacks. kind=objectives and kind=senders are short lists. kind=email_blocks lists the blocks an automation email can hold (products filled in for each contact) with their options, the personalisation placeholders and the rules for placing blocks in the HTML, and the account's brand (logo, social links, contact e-mail, colours, whether it saved a footer, whether Aqurate recommendations are connected, the language its emails are set to) for HTML that matches it; the blocks' default texts follow that language, so write the email's own text in it too. With trigger, it says whether that trigger's event carries products. kind=discount_templates lists the designs a Discount block can show, 20 per page, in the account's language, narrowed by industry, event and tags, with the values those filters take; the filters combine, so a design shows only when it matches all of them. Each design is a picture behind its preview_url link, which you cannot see: give the user the links and wait for their pick before writing the block; choose one yourself only when the user left the choice to you. kind=values needs field and returns id and label pairs, 200 per page, narrowed by search; products are searched (search required), categories and campaigns are searched when search is given and listed otherwise.

Parameters
ParameterTypeDescription
kindrequiredenumWhich list: triggers, conditions, actions, objectives, senders, values (with field), email_blocks (the blocks and placeholders an automation email can use), or discount_templates (the designs of the Discount block). One of: triggers, conditions, actions, objectives, senders, values, email_blocks, discount_templates.
fieldenumWith kind=values, which list: tags, segments, brands, categories, products, campaigns_email, campaigns_sms, campaigns_push, order_statuses, forms, surveys, custom_events, custom_attributes, product_attributes, loyalty_tiers, email_providers, countries, counties, cities or automations (journeys another journey can start). One of: tags, segments, brands, categories, products, campaigns_email, campaigns_sms, campaigns_push, order_statuses, forms, surveys, custom_events, custom_attributes, product_attributes, loyalty_tiers, email_providers, countries, counties, cities, automations.
searchstringText to narrow the list by, case-insensitive: for triggers it matches key, label or category, or whole words of when the trigger fires (e.g. coupon finds code_expiration); for actions key, label or category; for conditions also, as whole words, an operator that names a state (e.g. buyer finds shopper_status) or one of the fixed choices and its editor label; for values it matches the label (closest spellings when nothing contains it), and for products, categories and campaigns it is sent to the search itself.
triggerstringWith kind=email_blocks, the trigger key of the journey the email is for (e.g. cart_abandonment), to learn whether its event carries products. Omit when that does not matter.
industrystringWith kind=discount_templates, only the designs made for this industry, by name or id (the result lists them); with event or tags too, a design must match every filter.
eventstringWith kind=discount_templates, only the designs made for this occasion (e.g. Black Friday), by name or id.
tagsstring[]With kind=discount_templates, only the designs with any of these tags (e.g. red), as the result lists them, and that match industry and event when given.
pageintegerPage number, starting at 1. Default: 1.
domain_idstringTarget domain.
Returns
FieldTypeDescription
kindstringThe list requested.
searchobjectThe text the list was narrowed by, or null.
fieldobjectWith kind=values: the list returned.
triggersobject[]kind=triggers: the triggers this domain can use; with search, also the fields and settings each one takes.
keystringThe type to pass in create_automation's trigger.
labelstringThe trigger's name in the editor.
categorystringCategory key, e.g. website_events.
category_labelstringCategory as the editor shows it.
descriptionstringWhen the trigger fires.
needs_trackingbooleanTrue when the trigger fires on what the theMarketer tracking script reports from the website (visits, carts, product views): without the script on the site it never starts. get_integration_health shows whether website events arrive.
fieldsobjectTrigger-specific fields it takes, required ones first. Null in the list given without search: search for the trigger key to see them.
settingsobjectGeneral settings this trigger offers (run mode, smart sending, entry window, ...); all optional. Null in the list given without search, like fields.
conditionsobject[]kind=conditions: the filter conditions this domain can use, its contact and product attributes included.
conditionstringThe condition key for a filter step, e.g. customer_tag, or custom:<Label> / product_attribute:<Label> for an attribute.
labelstringThe condition's name in the editor.
categorystringCategory key, e.g. contact_data.
category_labelstringCategory as the editor shows it.
operatorsstring[]Operators the condition accepts; with a single one, operator may be left out.
operator_meaningsmap<string>What an operator stands for, for the operators whose word alone does not say it (e.g. buyer_within: placed an order in the last value days); empty when every operator is plain.
valuestringWhat value must be, in words.
choicesstring[]The fixed words value can take, when the condition has a closed list.
choice_meaningsmap<string>What a choice stands for, for the choices whose word alone does not say it; empty otherwise.
values_fieldobjectWhen value comes from a domain list: the field to pass to kind=values to see it.
applies_toobjectWhen the condition only works in journeys started by certain triggers: which ones. Null when it works everywhere.
noteobjectHow the condition is evaluated, or null.
actionsobject[]kind=actions: the step kinds a journey can contain here, with their fields.
keystringThe step type to pass.
labelstringThe step's name in the editor.
consequenceobjectWhat to know before using it (cost, irreversibility, data leaving the account); null when there is nothing special.
fieldsobject[]The fields the step takes.
namestringThe field name to pass.
requiredbooleanTrue when the field must be given.
descriptionstringWhat the field means and accepts.
values_fieldobjectWhen the field takes a value from a domain list: the field to pass to kind=values to see them (e.g. products, tags).
objectivesstring[]kind=objectives: the objectives a journey can be given.
sendersobjectkind=senders: verified senders, reply-tos and defaults.
valuesobject[]kind=values: the domain's values for field, as id and label.
idstringThe value's id; the tools accept it or the label.
labelstringThe value as the editor shows it.
email_blocksobjectkind=email_blocks: the blocks an automation email can hold, the placeholders its HTML may use and the rules they follow.
triggerobjectWith kind=email_blocks: the trigger key given, or null.
discount_templatesobjectkind=discount_templates: the designs a Discount block can show, with a preview picture each, and the filters that narrow them.
unavailablestring[]With kind=triggers, conditions or actions: entries this domain cannot use yet, grouped by what they need (a plan, the loyalty program, SMS credit, push set up). Not narrowed by search.
totalintegerEntries matched, across all pages.
pageintegerPage returned, starting at 1.
pagesintegerTotal pages.
per_pageintegerEntries per page: 200 for values and objectives, 50 for triggers, conditions and actions, 20 for discount templates.
has_morebooleanTrue when a later page exists.
noteobjectWhich page to ask for next, what to pass when the list is searched rather than listed, or null.

List automation templates

list_automation_templatesRead

The journeys an automation can be created from without describing every step: theMarketer's pre-built library by category, the popular picks for this account, and the account's own saved journeys.

Use when the user wants a ready-made automation (welcome series, cart recovery, win-back, birthday...) or asks what templates exist; then pass the chosen template_id or saved_flow_id to create_automation, which sets it up as a draft to review in get_automation_details. For a journey built step by step, use get_automation_options instead.

source=library returns groups by category, each card with its template_id, name, description, objective, impact and the card's copy (what the journey will do, who enters, what you need); only categories and cards this account's plan offers are listed, and a card names its trigger when the same journey is among the popular picks. source=popular returns up to four library journeys whose trigger no running journey of the account uses yet, each with its trigger named. source=saved returns the account's saved journeys with their trigger and step count, 50 per page. search narrows the library and the popular picks by name or description, and the saved journeys by name (they have no description).

Parameters
ParameterTypeDescription
sourceenumlibrary (the pre-built journeys by category), popular (suggested for this account), or saved (the account's own saved journeys). Omit for the library. One of: library, popular, saved. Default: 'library'.
searchstringCase-insensitive text the name must contain, or the description for library and popular cards. Omit for everything.
pageintegerPage number, starting at 1. Default: 1.
domain_idstringTarget domain.
Returns
FieldTypeDescription
sourcestringThe list requested.
searchobjectThe text the list was narrowed by, or null.
groupsobject[]source=library: the cards by category, in the library's order; only what this account's plan offers.
categorystringCategory label as the library shows it.
templatesobject[]The cards in this category.
template_idstringPass it as create_automation's template_id to set the journey up as a draft.
nameobjectThe journey's name.
categoryobjectLibrary category the card sits in.
descriptionobjectWhat the journey is for, in the card's words.
objectiveobjectThe objective the journey is created with.
impactobjectThe card's impact rating, e.g. high.
triggerobjectTrigger key the journey starts with (see get_automation_options kind=triggers). Always given for the popular picks; for a library card only when the same journey is among the popular picks, null otherwise (the contacts_added lines say who enters).
trigger_labelobjectThe trigger's name in the editor; given together with trigger.
journey_willstring[]What the journey does, step by step.
contacts_addedstring[]Who enters the journey.
you_needstring[]What the account needs before the journey can run.
templatesobject[]source=popular: up to four library journeys whose trigger no running journey of the account uses yet.
template_idstringPass it as create_automation's template_id to set the journey up as a draft.
nameobjectThe journey's name.
categoryobjectLibrary category the card sits in.
descriptionobjectWhat the journey is for, in the card's words.
objectiveobjectThe objective the journey is created with.
impactobjectThe card's impact rating, e.g. high.
triggerobjectTrigger key the journey starts with (see get_automation_options kind=triggers). Always given for the popular picks; for a library card only when the same journey is among the popular picks, null otherwise (the contacts_added lines say who enters).
trigger_labelobjectThe trigger's name in the editor; given together with trigger.
journey_willstring[]What the journey does, step by step.
contacts_addedstring[]Who enters the journey.
you_needstring[]What the account needs before the journey can run.
savedobject[]source=saved: the account's saved journeys, 50 per page.
saved_flow_idstringPass it as create_automation's saved_flow_id to set the journey up again as a draft.
nameobjectName it was saved under.
triggerobjectTrigger key the saved journey starts with.
trigger_labelobjectThe trigger's name in the editor.
steps_countintegerSteps connected to the trigger.
created_atobjectWhen it was saved (UTC).
updated_atobjectWhen it was last updated (UTC).
totalintegerEntries matched, across all pages.
pageintegerPage returned, starting at 1.
pagesintegerTotal pages.
has_morebooleanTrue when a later page exists.
noteobjectWhich page to ask for next when there is one; null otherwise.

Create automation

create_automationWrite

Create a marketing automation (a journey) as a draft, from a trigger and steps, from a pre-built template, or from a saved journey.

Use when the user wants a new automated flow: a welcome series, a cart-recovery sequence, a post-purchase follow-up, a birthday message. Pass exactly one source. (1) trigger plus steps: the trigger says what starts the journey (get_automation_options kind=triggers lists the keys; searched by key it shows the fields one takes) and steps is the ordered list of what happens next; a filter step branches into yes/no, a split into a/b, and on create each branch has its own steps (repeat a step in both branches when both should do it): joining the branches into one shared filter or delay step is done afterwards with update_automation, with a kept step marked shared=true where the other branch reaches it. Names (tags, segments, products, categories, campaigns, forms) are resolved for you and an unknown name is answered with the closest matches. (2) template_id from list_automation_templates: the pre-built journey is copied with its emails. (3) saved_flow_id from list_automation_templates source=saved: one of the account's own saved journeys is copied under new step ids, email bodies included. Not for editing an existing journey (update_automation) or for sending a one-off message (campaign_wizard).

Every email step you write needs html: the full email body with an <a> whose href is exactly {{unsubscribe_link}}. Products that theMarketer fills for each contact go in as blocks: an empty <div data-block="<slot>"></div> in the HTML and an entry in the step's blocks (get_automation_options kind=email_blocks lists them). On save each slot is renamed to the block's id: each email step written comes back in flow.steps with its blocks under their new slots, which later updates use, and a render_check of the email rendered for a sample contact. Some steps have consequences worth telling the user: a webhook step sends contact data to the given URL and stores its credentials with the journey, an unsubscribe step cannot be undone from the journey, SMS steps spend SMS credit, and a start_automation step sends contacts into another journey. SMS and push text is plain text (product blocks go in email steps), a split needs at least one step in one of its branches, a filter condition takes one value unless it is one of the list conditions, and no path from the trigger runs through more than 50 steps. The result is always a draft with the stored flow and the id of every step; start_automation makes it live.

When a draft with exactly this name was created in the last 10 minutes, the call answers needs_user_input first: use that draft or create another. If a call fails without an answer, check list_automations for the draft before creating it again.

Parameters
ParameterTypeDescription
namerequiredstringName shown in the automations list, at most 120 characters; plain text without <. Links and slashes are removed.
triggerTriggerInputWhat starts the journey: type (a trigger key such as cart_abandonment, order_placed, new_email_subscriber, tag_added) plus the fields that trigger takes, e.g. wait for abandonment windows, tag for tag_added, products for product_ordered, run once or multiple. Required with steps; omit with template_id or saved_flow_id.
stepsobject[]The steps after the trigger, in order, each with a type: email (subject, preview_text, html, optional blocks), sms (text, optional discount), push / mobile_push (title, text, url), delay (amount, unit, optional at_time), filter (conditions with yes and no branches), split (percent_a with a and b branches), add_tags / remove_tags (tags), unsubscribe (channels), start_automation (automation), webhook (url, auth, body). Message steps may carry a ref label that an automation_activity condition later in the flow refers to as step_id. The yes/no and a/b branches each hold their own steps and do not continue into one shared step here (repeat the step in both, or join them later with update_automation). May be empty to create the trigger alone and add steps later.
template_idstringId of a pre-built journey from list_automation_templates (source=library or popular); the journey is copied with its steps and email designs and takes the template's objective.
saved_flow_idstringId or exact name of one of the account's saved journeys (list_automation_templates source=saved); its steps and email bodies are copied under fresh step ids.
objectivestringOptional goal shown in the list, one of: Assist conversions, Assist recurrence, Assist retention and recurrence, Convert members to buyers, Convert subscribers to buyers, Enhance loyalty and engagement, Increase engagement, Increase loyalty engagement, Increase loyalty purchases, Nurture relationships, Recover abandoned carts, Recover inactive users, Request feedback, Use discount codes. Not with template_id.
decision_tokenstringFrom a needs_user_input result of this tool, together with decision_answers; leave it out otherwise.
decision_answersobjectThe user's answer by decision key, e.g. {"earlier_draft": "use"}; only with decision_token.
domain_idstringTarget domain.
Returns

The operation's result, pending user questions, or cancellation.

Update automation

update_automationDestructive

Change an automation's name, trigger or steps; the steps given replace the whole flow.

Use when the user wants to rename a journey, change what starts it, or edit its steps: add a message, change a delay, rewrite an email, adjust a condition. Read the current flow with get_automation_details first: every step there carries an id, and a step passed back with its id is kept, with its statistics and its saved email body; passed back exactly as it reads, it is stored as it is, names and all. A step without an id is new; a step left out of steps is removed. An email step with an id and no html keeps the body it has; html given replaces it; a new email step needs html with an <a> whose href is exactly {{unsubscribe_link}}. Products theMarketer fills for each contact go in as blocks: an empty <div data-block="<slot>"></div> in the HTML and an entry in the step's blocks (get_automation_options kind=email_blocks lists them). On save each new slot is renamed to the block's id, as the result's blocks show; later updates use those slots. On an email step with an id, pass only blocks (with the ids get_automation_details gives as slots) to change blocks' options: list only the blocks to change; the others keep their saved options. Give each block's slot, type and the options to change, and the options left out keep their saved values; the rest of the saved body stays exactly as it is, even when it was made in the web app's email editor. Pass html too to change the email's text or layout, or to swap a block for one of another type: a block listed with its saved slot and type still keeps the options left out; a new slot of the same type as one saved block the HTML no longer holds, with no option set differently, takes over that block and its saved options; any other new slot starts from the defaults. The HTML (its lines joined with newlines) and blocks get_automation_details gives for a step can be passed back as they are, unless its notes name a block the tools cannot write back. Every email step comes back in flow.steps with its blocks and body: written, with a render_check of the email rendered for a sample contact, or kept when its saved body stayed as it was. Steps shown as type kept are passed back as they came; a kept filter or split passed back without branch_1 or branch_2 keeps the saved steps there, and [] removes them. Not for starting, pausing or deleting (use start_automation, pause_automation, delete_automation) and not for creating one (create_automation).

A draft or paused journey takes any change. A running journey takes changes live, and contacts already in it continue on the new flow, except for changes that would leave them stranded: removing or retyping a delay or webhook step they may be waiting at, or changing the trigger type. Those need the journey paused first, which ends the journey for the contacts currently in it. The result lists what changed (empty, with nothing saved, when everything passed matches the journey as stored) and the flow as stored, with the id of every step. No path from the trigger may run through more than 50 steps.

A nested edit works the same way: pass the whole flow back and change only the step in question. To make the delay inside a filter's yes branch 2 days, with the flow read as steps=[email a1b2c3d4e5, filter f6g7h8i9j0 whose yes branch is [delay k1l2m3n4o5 of 1 day, sms p6q7r8s9t0] and whose no branch is empty], send steps=[{"type": "email", "id": "a1b2c3d4e5", "subject": ..., "preview_text": ...}, {"type": "filter", "id": "f6g7h8i9j0", "conditions": [... as read ...], "yes": [{"type": "delay", "id": "k1l2m3n4o5", "amount": 2, "unit": "days"}, {"type": "sms", "id": "p6q7r8s9t0", "text": ...}], "no": []}]: every other step is passed back as read with its id, so it is kept, and only the delay changes.

Parameters
ParameterTypeDescription
automation_idrequiredstringThe automation to change, by id (24 hex characters, from list_automations or create_automation).
namestringNew name shown in the automations list, at most 120 characters; plain text without <. Links and slashes are removed.
triggerTriggerInputNew trigger (type plus the fields it takes, as in create_automation). Omit to keep the current trigger; required when the current one is shown as not editable.
stepsobject[]The complete new list of steps after the trigger, nested like in create_automation. Replaces the whole flow: include every step to keep, each with its id from get_automation_details; omit the parameter to keep the steps as they are.
domain_idstringTarget domain.
Returns
FieldTypeDescription
automation_idstringId of the automation that was updated.
namestringThe name as stored after the update.
statusstringStatus after the update: draft, paused or running (a running journey keeps running on the new flow).
status_labelobjectThe status as the theMarketer app words it.
changedstring[]What differs from the journey as it was: name, trigger, steps (an email body written counts as a change to the steps). Empty when what was passed matches what is stored; nothing is saved then.
flowobjectThe journey as stored now: trigger and one line per step with its id.
triggerstringThe trigger as the editor names it, e.g. 'Cart abandonment'; 'not set' when the journey has no start yet.
trigger_typeobjectThe trigger key (cart_abandonment, order_placed, ...); null when not set or not editable from here.
stepsobject[]Every step reachable from the trigger, in flow order, branches nested by path.
pathstringWhere the step sits, in the vocabulary of create_automation and update_automation: steps[0], steps[1].yes[0], steps[2].a[1].
idobjectThe step's id: pass it back in update_automation to keep the step (and its statistics and email body), or as step_id in an automation_activity condition.
typestringemail, sms, push, mobile_push, delay, filter, split, add_tags, remove_tags, unsubscribe, start_automation, webhook, or kept for a step this tool cannot edit.
summarystringWhat the step does, in one line.
bodyobjectOn an email step: 'written' when this call wrote its body, 'kept' when its saved body stayed as it was (passed back without html, or with the same HTML and blocks it has). Null on every other step.
blocksobjectOn an email step: each block in its body, with its options, named by the id the saved body gives it as both slot and id: the slot to pass in later updates to keep or change the block's options (get_automation_details names it the same way). The note says which slot given in this call became which id. Null on every other step, and when the saved body could not be read (the step's warnings say so).
render_checkobjectOn an email step whose body this call wrote: the email rendered for a sample contact and what it still lacks, as preview_automation_email reports it. Null on every other step, on a kept body, or when the rendered email was not available yet; preview_automation_email checks it again.
warningsobjectOn an email step: what to check before it sends, such as a {{placeholder}} theMarketer does not fill (usually misspelt), which would show as nothing, or a saved body that could not be read just now. Null on every other step.
noteobjectOn an email step this call wrote: a tip for the web app's email editor, such as where to pick another footer design by sight. Null otherwise.
step_countintegerHow many steps the journey has.
notesstring[]What could not be read back exactly, and steps on the canvas that are not connected to the trigger (they never run).
entry_windowobjectWhen the trigger lets contacts in, in the shop's timezone; null when it has no entry window.
linksobjectWhere to open this journey in the theMarketer web app: app_url, and switch_domain_url for accounts with several domains.
app_urlobjectLink to this object in the theMarketer web app, for the user to review or edit it there. Null when the app URL is not configured on this MCP server.
switch_domain_urlobjectOnly for accounts with several domains: open this first if the app is currently on another domain, then follow app_url. The app keeps one current domain per user and app_url only works on the domain this object belongs to.
warningsstring[]What to know about the saved flow: steps that cannot send yet, conditions on a message not yet received, what a live change means, then every warning of the steps and their render checks, each once and prefixed by the step's path, e.g. 'steps[1].yes[0] (Email: ...): ...'.
notestringWhat happens next and how to follow it.

Start automation

start_automationDestructive

Start a draft or paused automation after the user confirms what will happen, or check whether it could start.

A call without dry_run never starts anything by itself: it returns the user's question first, and the journey starts only once they answer Start, so call it when the user wants the journey live. dry_run=true only checks and says what a start would do.

Use when the user wants a journey live: from then on every contact the trigger matches enters it and gets real emails, SMS or push messages. Call with dry_run=true first to see what would stop the start, and what a start would do, without starting it. Only a draft or a paused journey can be started; a running one is left as it is, and pause_automation stops it. Before starting, the journey is checked: it needs a trigger with at least one step connected to it, every email step needs a saved body that renders fit to send (as preview_automation_email shows it; a rendering that cannot be read just then does not stop the start, the note says so) and a sender address the domain has verified (a step without one of its own sends from the domain's default sender, so the domain needs one), push steps need web push (mobile push steps the mobile app push) set up on the domain, SMS steps need SMS credit or an SMS provider, the trigger and every filter condition must be ones the domain's plan includes (a loyalty trigger also needs the loyalty program), a filter condition on a message step must check a step of this journey, and a start_automation step must point at a journey of this domain that starts with automation_triggered and does not start this one back (directly or a few journeys on); anything missing is reported and nothing starts. Starting a paused journey does not bring back the contacts who were in it when it was paused.

A journey that passes the checks is not started on the first call: it answers needs_user_input with one question for the user that says what will happen: the journey and domain, who enters, how many emails, SMS and push notifications a contact receives and over how long, that SMS uses credit (with the credit left), every email that creates a unique discount code as it sends (its value and how long it is valid), the journeys it sends contacts on into, the contact details each webhook step sends and to which URL, the channels each unsubscribe step unsubscribes contacts from (which the journey cannot undo), and for a paused journey that the contacts it had do not come back. Call again with decision_token and decision_answers once they agreed; nothing starts before that. A journey edited since the question (its steps or an email body) is not started, and the question is asked again.

The result gives the status before and after, and the note says when a journey this one starts is not running yet, or when the trigger fires on website activity (needs_tracking) and no website events have arrived lately, so no contact would enter yet. With dry_run the same checks run, nothing is asked and nothing changes: ready says whether the journey could start now, problems what stops it (each with its fix; a journey that is already running, or a domain whose plan does not include automations, is reported there too), not_checked what could not be checked this time and consequences what a start would do, in the words of the question a start asks.

Parameters
ParameterTypeDescription
automation_idrequiredstringThe automation to start, by id (24 hex characters, from list_automations or create_automation).
dry_runbooleanTrue runs every check and returns what would stop the start and what a start would do; nothing is asked or started. Omit or false to ask the user and start it once they confirm. Default: False.
decision_tokenstringFrom a needs_user_input result of this tool, together with decision_answers; leave it out otherwise.
decision_answersobjectThe user's answer by decision key, e.g. {"confirm": "proceed"}; only with decision_token.
domain_idstringTarget domain.
Returns

The operation's result, pending user questions, or cancellation.

Pause automation

pause_automationDestructive

Pause a running automation after the user confirms, ending the journey for the contacts in it.

Use when the user wants a journey to stop sending: before editing a delay or the trigger, before deleting it, or to switch it off for a while. Only a running journey can be paused; a draft or a paused one is reported as such. Pausing is not a gentle stop: contacts currently in the journey (waiting for a delay or a next step) leave it for good, and starting it again later does not bring them back; new contacts stop entering until start_automation runs it again.

The first call answers needs_user_input with the one question to ask the user, which says how many contacts are in the journey now; call again with decision_token and decision_answers once they agreed. Nothing is paused before that. The count may have moved on by then and the pause still applies; a journey that was edited, stopped or started again since the question is not paused, and the question is asked again.

The result gives the status before and after.

Parameters
ParameterTypeDescription
automation_idrequiredstringThe automation to pause, by id (24 hex characters, from list_automations).
decision_tokenstringFrom a needs_user_input result of this tool, together with decision_answers; leave it out otherwise.
decision_answersobjectThe user's answer by decision key, e.g. {"confirm": "proceed"}; only with decision_token.
domain_idstringTarget domain.
Returns

The operation's result, pending user questions, or cancellation.

Delete automation

delete_automationDestructive

Delete a draft or paused automation for good, with its reports, after the user confirms.

Use when the user wants a journey gone: an abandoned draft, a test, a flow that was replaced. Only a draft or a paused journey can be deleted; a running one needs pause_automation first, which ends the journey for the contacts in it. Deleting removes the journey from the automations list for good, with its reports; it cannot be restored from here (duplicate_automation beforehand keeps a copy). To stop a journey without losing it, pause_automation is enough.

The first call answers needs_user_input with the one question to ask the user, which names the journey, its status, how many contacts ever entered it and the journeys whose start_automation step sends contacts into it; call again with decision_token and decision_answers once they agreed. Nothing is deleted before that. A journey that was edited, started or stopped since the question is not deleted, and the question is asked again.

Parameters
ParameterTypeDescription
automation_idrequiredstringThe automation to delete, by id (24 hex characters, from list_automations).
decision_tokenstringFrom a needs_user_input result of this tool, together with decision_answers; leave it out otherwise.
decision_answersobjectThe user's answer by decision key, e.g. {"confirm": "proceed"}; only with decision_token.
domain_idstringTarget domain.
Returns

The operation's result, pending user questions, or cancellation.

Duplicate automation

duplicate_automationWrite

Copy an automation as a new draft, in the same domain or into another domain of the account.

Use when the user wants a variant of a journey without touching the original, a backup before a big edit, or the same journey on another of their shops. The copy is a draft with the same trigger, steps and email bodies, under new step ids, and keeps the original's name unless name is given; statistics are not copied. The original needs at least one saved step; a brand-new empty draft has nothing to copy. Same-domain copies are immediate and the result carries the new id. A copy into another domain (target_domain, one where the user is admin or owner) is queued by theMarketer: the tool waits a few seconds for it and reports created with its id, or queued when it has not appeared yet, in which case list_automations on that domain shows it shortly. A copy on another domain keeps the email senders and the start_automation targets of the original, which belong to this domain: review them there before starting it. Not for moving contacts between journeys or for starting the copy (start_automation does that).

Parameters
ParameterTypeDescription
automation_idrequiredstringThe automation to copy, by id (24 hex characters, from list_automations).
namestringName for the copy, at most 120 characters; omit to keep the original's name. Plain text without <; links and slashes are removed.
target_domainstringAnother domain of the account to copy into, by name (hostname) or id as list_domains shows them; omit to copy within the same domain.
domain_idstringTarget domain.
Returns
FieldTypeDescription
source_idstringThe automation that was copied.
automation_idobjectId of the copy, a draft; null while a copy into another domain is still queued.
namestringName of the copy as stored (or as requested).
statusstringAlways 'draft': a copy never runs by itself.
outcomestringcreated when the copy exists and its id is known; queued when theMarketer is still copying it into the other domain.
target_domain_idstringThe domain the copy lives in.
target_domainobjectThat domain's name, when copying across domains.
linksobjectWhere to open the copy in the theMarketer web app once it exists: app_url, and switch_domain_url for accounts with several domains.
app_urlobjectLink to this object in the theMarketer web app, for the user to review or edit it there. Null when the app URL is not configured on this MCP server.
switch_domain_urlobjectOnly for accounts with several domains: open this first if the app is currently on another domain, then follow app_url. The app keeps one current domain per user and app_url only works on the domain this object belongs to.
notestringWhat happened and what to do next.

Send test automation email

send_test_automation_emailDestructive

Send a test copy of one email step of an automation to up to five addresses.

Use when the user wants to see an automation email in an inbox before starting the journey or after changing the step. It sends one real email per address from the step as currently saved: its subject, preview text and body. When an address belongs to a contact of the domain, the email is personalised with that contact's own data (name, cart, orders); any other address gets sample data. Find the automation with list_automations and the step id with get_automation_details; the step must be an email step whose subject and body are already saved (update_automation saves both). Not for real recipients: the journey itself reaches them once start_automation runs it.

Each domain may send 30 test emails per hour across its automations; once the allowance is used up the remaining addresses come back as 'throttled' and nothing is sent to them. 'sent' means the message was accepted for delivery; delivery problems are not reported back, so ask the recipient to check the inbox and spam folder.

Parameters
ParameterTypeDescription
automation_idrequiredstringThe automation's id from list_automations (24 hex characters).
step_idrequiredstringId of the email step to test, as get_automation_details lists it.
recipientsstring[]One to five email addresses to send the test to; duplicates are sent once. Omit to send it to the signed-in user's own address.
domain_idstringTarget domain.
Returns
FieldTypeDescription
automation_idstringThe automation the step belongs to.
step_idstringThe email step the test was sent from.
subjectstringThe subject line of the step as saved; the test carries it.
resultsobject[]One entry per address, in the order given.
recipientstringThe address the test was sent to.
outcomestring'sent' when theMarketer accepted the test; 'throttled' when the domain's allowance of 30 test emails per hour was used up, in which case nothing was sent to this address.
notestringWhat 'sent' means (accepted, not delivered), how the test is personalised, what the email's discount codes read as in a test, and the hourly allowance.

Send test automation SMS

send_test_automation_smsDestructive

Send the saved text of an automation's SMS step to the signed-in user's own phone, as a test, after the user confirms.

Use when the user wants to read an automation SMS on their own phone before starting the journey or after changing the step. The test always goes to the phone number on the signed-in user's theMarketer profile, never to a number given here, and it sends the step's text exactly as saved (update_automation changes it). It is charged like a real SMS: one message of SMS credit at the account's price, unless the domain sends through its own SMS provider. Find the automation with list_automations and the step id with get_automation_details.

The first call answers needs_user_input with the one question to ask the user: it carries the text, the masked number and what the test costs, so ask it in full. Call again with the same automation_id and step_id plus decision_token and decision_answers once they agreed; nothing is sent before that. If the text or the phone number changed since the question was asked, nothing is sent and the question comes back for the new text. Once handed to the SMS provider (delivery itself is not confirmed), the result reports the text, the masked phone, cost_per_sms_eur and the remaining_credit_eur left after the test.

theMarketer sends one test SMS per domain every 10 seconds; a test that comes too soon after the previous one is not sent and the result says to try again in a few seconds. A test needs the price of one SMS in whole euros of credit; when the credit is below that the tool says so before asking anything, and get_transactional_credits shows the balance. When only this domain's own credit can be read, the question shows it even when low, since a credit the account shares across its domains may cover the test; if it does not, the test is not sent and the result says so.

Parameters
ParameterTypeDescription
automation_idrequiredstringThe automation's id from list_automations (24 hex characters).
step_idrequiredstringId of the SMS step to test, as get_automation_details lists it.
decision_tokenstringFrom a needs_user_input result of this tool, together with decision_answers; leave it out otherwise.
decision_answersobjectThe user's answer by decision key, e.g. {"confirm": "proceed"}; only with decision_token.
domain_idstringTarget domain.
Returns

The operation's result, pending user questions, or cancellation.

Campaigns12

List campaigns

list_campaignsRead

List the account's campaigns on every channel, with status, audience, schedule and headline results, most recently scheduled first.

Use when the user asks which campaigns exist, what was sent or is scheduled, or how recent campaigns did, and whenever you need a campaign id for the other campaign tools. For the latest sent campaign call with status="sent" and read the first row. It lists SMS and push campaigns too; the other campaign tools cover email only.

Names are not unique. If several campaigns match the user's request, show their ids, subjects, statuses and dates and ask which one they mean before changing anything. Never select one by guesswork. A draft's send_at is only the time saved on it, even in the past, and schedules nothing; it is null while no send time is set yet: that is chosen when the campaign is scheduled with schedule_campaign.

Each row carries the id, name, status with status_label as the app shows it, type, mode, subject, sender, audience (segment names, exclusions, extra recipients, smart sending), send_at, sent_at, recipients and stats: lifetime sent, delivered, unique opens and clicks, transactions, revenue, unsubscribes, the unique open rate (contacts who opened / delivered) and the click, unique click and conversion rates in percent, resend and A/B parts included. A campaign with an automatic resend also carries resend_after, resend_status and resend_send_at (an estimate until the campaign has finished sending); a manual resend made with create_campaign_resend gives the id of the campaign it follows up in source_campaign_id and its name in source_name. Rows come 20 per page by send date descending; a draft with no send time set sorts by when it was created. A draft that never reached the wizard's schedule step, such as a new manual resend, is listed after every other draft, often many pages in: look it up with search by its name instead of paging. The listing reports no total: has_more is true when the page came back full and the note names the next page. Archived campaigns appear only with status="archived". For the breakdown per part, links, timeline and contacts use get_campaign_report.

Parameters
ParameterTypeDescription
statusenumWhich campaigns to list: all (everything except archived), draft, scheduled (waiting for their send time, including A/B parents), sending (going out right now), paused, sent, archived, or payment_error (scheduled but not sent because the account was suspended). Omit for all. One of: all, draft, scheduled, sending, paused, sent, archived, payment_error. Default: 'all'.
typeenumChannel filter: email, sms, push or mobile_push. Omit for every channel. One of: email, sms, push, mobile_push.
searchstringCase-insensitive substring the campaign name or email subject must contain. Omit to list everything.
pageintegerPage number, starting at 1. Default: 1.
domain_idstringTarget domain.
Returns
FieldTypeDescription
campaignsobject[]The campaigns on this page, ordered by send date descending; drafts without a send date come last.
idobjectCampaign id (24 hex characters) for the other campaign tools.
nameobjectCampaign name as shown in theMarketer; recipients never see it.
statusobjectThe campaign's status: draft, scheduled (waiting for its send time, A/B parents included), queued, sending, paused, ab_testing, sent, archived or payment_error, in the words list_campaigns' status filter takes.
status_labelobjectThe status as the theMarketer app words it: scheduled is 'Scheduled', queued and sending are 'Sending now', payment_error is 'Not sent - Payment error'.
typeobjectChannel: email, sms, push or mobile_push.
modeobjectEmail content mode: regular (HTML editor), ecommerce (HTML with product blocks) or plaintext; null for other channels.
subjectobjectEmail subject line.
previewobjectPreheader text shown next to the subject.
senderobjectSender name, address and reply-to.
nameobjectFrom (sender) display name.
emailobjectFrom (sender) address.
reply_toobjectReply-to address; null when not set.
audienceobjectAudience type, segment names, exclusions, extra recipients and smart sending.
typeobject'all' for the whole email audience, 'segment' for the segments listed in segments.
segmentsstring[]Names of the segments the campaign targets; empty when type is 'all'.
exclude_segmentsstring[]Names of the segments whose members are left out.
extra_recipientsstring[]Addresses that receive a copy regardless of the audience.
smart_sendingbooleanTrue when contacts who received a campaign recently (the domain's smart-sending window) are skipped.
send_atobjectSend time in UTC; only a scheduled status means delivery is planned. A draft's send_at is only the time saved on it, even in the past, and sends nothing; null while no send time is set yet: it is chosen when the campaign is scheduled with schedule_campaign.
sent_atobjectWhen sending finished (UTC); null until the campaign is sent.
recipientsobjectAudience size recorded at scheduling (stats.sent also counts the resend and A/B parts) and recounted at send time; null when theMarketer stored no estimate (several segments), and for a manual resend that has not gone out: its recipients are calculated when it is sent.
statsobjectHeadline results from stats.all; all zeros for a campaign that has not been sent, null when the listing carried none.
ab_testbooleanTrue when the campaign has an A/B test.
resend_afterobjectHours after the main email finishes sending at which its automatic resend goes out; null without an automatic resend.
resend_statusobjectStatus of the automatic resend: draft, scheduled, queued, sending, paused, sent or payment_error; null without one.
resend_status_labelobjectThe automatic resend's status as the theMarketer app words it; null without one.
resend_send_atobjectWhen the automatic resend goes out (UTC). Until the main email has finished sending this is an estimate from its send_at, and the real time is later for batched, optimal-time or A/B sends. Null without a resend, or when a sent campaign's resend was never scheduled and will not go out.
source_campaign_idobjectFor a manual resend (made with create_campaign_resend): the id of the sent campaign it follows up, which tells apart campaigns with the same name; null for every other campaign.
source_nameobjectFor a manual resend: the name of the sent campaign it follows up; null when that campaign can no longer be found, and for every other campaign.
edit_stepobjectLast wizard step saved (sender, audience, subject, content, schedule, abtesting, resend, tracking, done); tells how far a draft got.
created_atobjectWhen the campaign was created (UTC).
pageintegerPage returned, starting at 1.
per_pageintegerCampaigns per page, fixed at 20.
has_morebooleanTrue when this page came back full, which is the only signal theMarketer gives: it reports no total, so the next page may still be empty.
noteobjectWhich page to ask for next when there may be more; null when this page is the last.

Get campaign details

get_campaign_detailsRead

Everything configured on one email campaign, by section: what it says, who gets it, when, how links are tagged, and the rendered email.

Use when the user asks what a campaign contains or how it is set up, before campaign_wizard with campaign_id to see the current values, or before create_campaign to learn the domain's verified senders and defaults (summary.domain_defaults). Find the id with list_campaigns. Email campaigns only; performance numbers are in get_campaign_report.

By default it returns summary, audience, schedule and tracking; content renders the email and is heavier, so ask for it only when the user wants to see the copy or check the HTML. The rendered content comes 80 lines per page (a line longer than 200 characters is cut only where a line break changes nothing) with content_total_chars, pages and a note naming the next page; the other sections ignore page.

summary.resend describes the automatic resend (who gets it, after how many hours, its subject, preview and send time) and is null when there is none. Its send time is an estimate until the campaign has finished sending (send_at_is_estimate). A campaign made with create_campaign_resend carries summary.manual_resend instead: the sent campaign it follows up, its rule and who it reaches, counted at send time from that campaign's recipients.

Parameters
ParameterTypeDescription
campaign_idrequiredstringThe campaign's id from list_campaigns (24 hex characters). Use the main campaign's id, not an A/B or resend child.
sectionsenum[]Which sections to return; omit for summary, audience, schedule and tracking. Any of: summary (name, status, mode, subject, preview, sender, A/B flag, automatic or manual resend, template id and the domain's wizard defaults), audience (segments with keys and names, exclusions, extra recipients, smart sending, recipient count), schedule (send type, send_at, sent_at, optimal-time and batch settings), tracking (UTM tags), content (the rendered email, 80 lines per page; page applies to the content sections only, the other sections are not paged), content_b (variant B's HTML or text of an A/B test on the content, paged like content), content_resend (the automatic resend's rendered email, paged like content).
pageintegerPage number, starting at 1. Default: 1.
domain_idstringTarget domain.
Returns
FieldTypeDescription
campaign_idstringtheMarketer id of the campaign.
sections_returnedstring[]The sections fetched on this call, in the order the keys below are listed.
summaryobjectIdentity, status, mode, subject, sender, the A/B flag, the automatic resend or the campaign a manual resend follows up, template id and the domain's wizard defaults (verified senders, default reply-to, optimal hour, smart-sending window).
audienceobjectAudience type, segments (names and keys), exclusions, extra recipients, smart sending and the recorded recipient count.
scheduleobjectSend type, send_at, sent_at, optimal-time settings and batch delivery.
trackingobjectUTM tagging: enabled flag and the three tags.
contentobjectThe rendered email as lines, 80 per page, with content_total_chars, pages, has_more and a note naming the next page. Only fetched when requested.
content_bobjectVariant B's HTML or text of an A/B test on the content, paged like content (as saved, not rendered); empty with a note for other tests; only when requested.
content_resendobjectThe automatic resend's rendered email (the text of a plaintext campaign), paged like content; only when requested.

Get campaign report

get_campaign_reportRead

How one email campaign performed: counters and rates, benchmark, clicked links, daily timeline and the contacts behind each metric.

Use when the user asks how a campaign did, what was clicked, who opened or bought, or how it compares with the account's usual results. Find the id with list_campaigns; its rows already carry the headline stats, come here for more. Email campaigns only.

By default it returns overview only; each extra section is a separate read, so ask for what the question needs. overview gives counters and rates for the whole campaign (all), for the campaign without its automatic resend (all_without_resend, the headline the theMarketer app shows) and for each part with data (main, resend, A/B variants, winner), the currency, the last open and click times and survey results. The totals add the parts up without matching people, so a contact who got the main email and the resend counts twice; quote all_without_resend for the campaign itself and resend for the follow-up. For the share of recipients who opened quote unique_open_rate; unique_click_rate is the share of those openers who clicked, not of all recipients. open_rate counts every open, and on all_without_resend it is opens per 100 messages sent, so above 100 means more opens than messages sent. A manual resend made with create_campaign_resend is a campaign of its own: its results are under its own id, not in the resend part of the campaign it follows up. A resend shows 0 sent when no contact matched its rule at send time; get_campaign_details shows whether it went out.

benchmark sets the rates next to the account's and the industry's averages; links lists the top clicked links, the most engaged contacts and the products ordered; timeline gives seven daily rows of opens, clicks, orders and revenue plus clicks by country, in a window anchored on today for campaigns older than six days; contacts lists who did what for one metric, 50 per page, narrowed by search. Contact rows carry the contact id and name, never the email address. Links, timeline and contacts exist only once the campaign has been sent: for a draft or scheduled campaign they are skipped with a note, while overview still answers with zeros. A section that could not be loaded reads {"unavailable": <reason>} while the rest still answer. Rates are percentages.

Parameters
ParameterTypeDescription
campaign_idrequiredstringThe campaign's id from list_campaigns (24 hex characters). Use the main campaign's id; its A/B and automatic resend parts are reported under it, while a manual resend reports under its own id.
sectionsenum[]Which sections to return; omit for overview only. Any of: overview (counters and rates per part, currency, last open/click, survey), benchmark (campaign vs account vs industry), links (top links, top fans, products ordered), timeline (7 daily rows and countries), contacts (who did what for metric, paged).
metricenumRequired with the contacts section: which contacts to list - sent (everyone it went to), opens, clicks, transactions (buyers) or unsubscribed (unsubscribes, bounces and complaints, with a status per row). One of: sent, opens, clicks, transactions, unsubscribed.
searchstringWith contacts: substring the contact's email must contain. Omit for everyone.
pageintegerPage number, starting at 1. Default: 1.
domain_idstringTarget domain.
Returns
FieldTypeDescription
campaign_idstringtheMarketer id of the campaign.
nameobjectCampaign name.
statusobjectThe campaign's status, in the words list_campaigns' status filter takes.
status_labelobjectThe status as the theMarketer app words it.
sections_returnedstring[]The sections fetched on this call, in the order the keys below are listed.
overviewobjectCounters and rates for the whole campaign (stats.all), for the campaign without its automatic resend (the app's headline) and for each part that has data (main, resend, A/B variants, winner), the currency, last open and click times and survey results. Reads {"unavailable": <reason>} when that part could not be loaded.
benchmarkobjectOpen, click, unsubscribe and conversion rates, AOV and revenue for this campaign next to the account's and the industry's averages. Reads {"unavailable": <reason>} when that part could not be loaded.
linksobjectTop clicked links, most engaged contacts and products ordered. Reads {"unavailable": <reason>} when that part could not be loaded.
timelineobjectDaily opens, clicks, orders and revenue over a 7-day window anchored on today for campaigns older than six days, plus clicks by country. Reads {"unavailable": <reason>} when that part could not be loaded.
contactsobjectThe contacts behind metric, 50 per page, optionally narrowed by search. Reads {"unavailable": <reason>} when that part could not be loaded.
noteobjectCaveats about this answer, e.g. sections skipped because the campaign has not been sent.

Create email campaign

create_campaignDestructive

Create an email campaign through theMarketer's wizard - sender, audience, subject, content, schedule, tracking - and schedule it or leave it as a draft.

Use only outside a conversation, when a program already holds every decision (audience, send time, A/B test, resend) as data. When a user is talking, even if they said everything in one message, use campaign_wizard and give what they said as the answers to its first round; their words are answers, not arguments. With draft=true (default) the campaign is fully configured and left as a draft: nothing is sent until it is scheduled with schedule_campaign. Pass draft=false only when the user explicitly asked to send or schedule and has confirmed content, sender, audience and time: that is a real send; once scheduled, update_campaign can move it or change its content, and delete_campaign cancels it. When in doubt keep the draft and call send_test_campaign first. Email campaigns only.

Content is either html or plain_text, never both, and must carry the unsubscribe link: an <a> whose href is exactly {{unsubscribe_link}} in HTML, the placeholder anywhere in plain text. Do not put HTML comments (<!-- ... -->) in the html. For product blocks use table-based layout and inline CSS, absolute URLs and plain product links: click tracking and the campaign's UTM tags are added at send time; take names, prices (price_display) and images from list_products.

The audience is the user's decision. Pass segments only with segments the user named (names or keys as list_segments shows them); an empty list sends to the whole email audience, only when the user asked for everyone. When they did not say who should receive it, omit segments; when they only described it ('loyal customers', 'inactive for 6 months'), pass that description as audience_description and no segments: the result offers exact name matches or a choice between existing and new segments. Ask only for missing criteria: pass the specific question in audience_clarification to return audience_criteria. Omit it when the user already gave the period, such as 'last 30 days'. Use list_segments to find suitable segments, then let the user choose. Names do not establish matching rules. Without a description, the result asks whether to use all subscribers, an existing or a new segment. Either way the first call creates nothing until the user confirms the audience and its recipient count. Never pick a segment or call create_segment on your own. Pass a typed answer as the user wrote it: a segment name selects that segment, any other text comes back as their audience criteria. Choosing another audience opens a follow-up question; ask what they want, then retry with the new audience and the other original arguments, without the previous decision_token or decision_answers.

A/B testing is the user's decision too: unless ab_test is given, the confirmation asks whether to run one (not with use_optimal_time), so pass ab_test only for a test the user described ({'type': 'none'} when they already said no A/B test): type subject (subject_b, preview_b), content (html_b, or plain_text_b for a plaintext campaign) or time (send_at_b); split halves the audience, otherwise A and B go to size% each and the winner by winner_by to the rest after decide_after hours; leave those four out unless the user stated them: the confirmation asks them. Write variant B as you write variant A. It also asks whether to add an automatic resend (the campaign sent again after_hours after it goes out, to contacts who did not engage): pass resend only for one the user described. To follow up on a campaign that has already gone out, use create_campaign_resend instead. When status is 'needs_user_input', nothing was written. Show all pending_changes; nothing is saved yet. Reuse explicit user choices for configuration in decisions_pending. Ask missing choices with every option and its details; use clickable choices when available, otherwise plain text. Never invent answers. For every confirmation, show the changes or final summary and ask explicitly; the original request is not confirmation. Re-ask expired or changed questions; never reuse their old answers. Call the same tool with the original arguments plus resume_arguments, decision_token and decision_answers. Use question keys and option values, free text only when allowed, and lists for multiple choices.

send_at is ISO 8601 at least 15 minutes ahead: with a UTC offset it is used as given, without one it is read in the shop's timezone. Omit it to send as soon as possible; on a draft the time stored then is only a placeholder and nothing is scheduled. The result shows the campaign as stored, with its effective UTC send time, its A/B test and resend and a recipient estimate per segment. When the account is blocked from sending, the campaign stays a draft and sending_block says why. Follow it with list_campaigns or get_campaign_details, and use get_campaign_report once it was sent.

Parameters
ParameterTypeDescription
namerequiredstringCampaign name as shown in theMarketer's lists and reports, at most 100 characters; recipients never see it.
subject_linerequiredstringEmail subject, at most 100 characters; variables such as {{client_firstname}} are allowed.
sender_namestringFrom (sender) display name. Omit for the domain's default sender name.
sender_emailstringFrom (sender) address. Omit for the domain's default sender (the one the app preselects, even when several are verified; the result's sender shows which was used); when given it must be one of the verified senders (the error lists them).
htmlstringFull raw email HTML containing an unsubscribe anchor whose href is exactly {{unsubscribe_link}}, e.g. in the footer. Pass either html or plain_text, not both.
plain_textstringText-only email body containing {{unsubscribe_link}} somewhere; the campaign is stored in plaintext mode. Pass either plain_text or html, not both.
preview_textstringPreheader text shown next to the subject in inboxes, at most 200 characters. Default: ''.
reply_tostringReply-to address; defaults to the domain's default reply-to.
segmentsstring[]Segments the user chose, by exact name or custom segment id from list_segments, or by campaign key from decisions_pending or resume_arguments (e.g. 'VIP customers', activity::active_30_days, custom::<segment id>). Contacts in any of them receive the campaign. An empty list selects the whole email audience. Omit when the user has not chosen yet: the result then asks them.
audience_descriptionstringThe audience in the user's own words when they described it without naming segments (e.g. 'customers who did not buy for 6 months'). Offers exact name matches or a choice between existing and new segments. This is not a semantic search.
audience_clarificationstringA question about genuinely missing audience criteria, such as the period meant by 'recent'. Omit when the user already supplied the criteria, including any time period. Used only while segments is omitted. After the answer, omit this question when retrying with the chosen audience.
exclude_segmentsstring[]Segments whose contacts are removed from the audience at send time, by name or key.
extra_recipientsstring[]Addresses that get a copy when the first batch goes out, outside the audience (e.g. the marketing manager).
smart_sendingbooleanSkip contacts who received a campaign recently (window configured in the domain's email settings). Default: False.
send_atstringWhen to send, as ISO 8601 at least 15 minutes from now. With a UTC offset (e.g. 2026-10-01T10:00:00+03:00) it is used as given; without one (2026-10-01T10:00:00) it is read in the shop's timezone, as the theMarketer app does. The result reports the effective UTC time. Omit to send as soon as possible; a draft then keeps a placeholder time and is not scheduled.
use_optimal_timebooleanDeliver to each contact at their own predicted best hour instead of all at send_at; theMarketer then spreads the send over up to 24 hours. Default: False.
optimize_forenumGoal of the optimal-time model when use_optimal_time is set: opening (opens) or buying (purchases). One of: opening, buying. Default: 'opening'.
utm_sourcestringUTM source appended to every link; defaults to the domain's setting.
utm_mediumstringUTM medium appended to every link; defaults to the domain's setting.
utm_campaignstringUTM campaign appended to every link; defaults to the domain's setting.
draftbooleanTrue (default) leaves the campaign in draft status: every step is saved and the app opens it on the last wizard step, so it can be reviewed, tested with send_test_campaign and scheduled by hand. False schedules the real send at send_at (or as soon as possible); once scheduled, update_campaign can move send_at or change the content, and delete_campaign cancels it. Default: True.
ab_testobjectThe A/B test the user described, or {'type': 'none'} when they already said no A/B test; omit it otherwise: the confirmation asks whether to run one.
resendobjectNever together with an A/B test on the send time. The automatic resend the user described: who gets the campaign again (to, required), after how many hours, with which subject, preview text or own content (html, or plain_text on a plaintext campaign); it goes to the campaign's audience as it is when the resend goes out; {'to': 'none'} when the user already said no resend. Omit it otherwise: the confirmation asks whether to add one. The automatic resend follows this campaign after_hours after it goes out; to follow up on a campaign that has already gone out, use create_campaign_resend instead.
decision_tokenstringFrom a 'needs_user_input' result, once the user answered its questions; omit on the first call.
decision_answersobjectThe user's answers by decision key; each value is an option value or allowed free text. Omit on the first call.
domain_idstringTarget domain.
Returns

The operation's result, pending user questions, or cancellation.

Create or change an email campaign with the user

campaign_wizardDestructive

Create an email campaign with the user, or with campaign_id change an existing draft or scheduled one: theMarketer asks the user every decision (format, audience, exclusions, send time, A/B test, resend, sender) in one round, plus one more for the A/B details, the optimal time's day, a typed resend or an unclear audience, then shows the whole plan for one confirmation, and only then creates the campaign as a draft or schedules it.

Use when the user wants a new email campaign, or to change one, in a conversation, even if they said everything in one message; Use create_campaign or update_campaign for choices already specified as structured fields; their required user confirmations still apply. Email campaigns only.

To change a campaign, pass campaign_id with domain_id: the first round shows what is set now and lets the user keep or change each setting and the content, the format stays as it is, and the confirmation shows each change as it is now and as it will be; nothing is written before the user confirms. Pass only the texts the result asks for: the others stay as stored. A campaign that is sending or has gone out cannot change.

Start with domain_id only: the result asks the first round. When the user already said what they want (audience, time, A/B test, resend, sender), answer the first round from their words and ask only what they did not say. Show every question of a round with clickable choices; if the client shows at most four questions at a time, show them in batches and collect all answers before calling again. The decisions are never parameters: they come only from the user's answers. There is no audience or segment parameter: the segment, everyone or a new segment is the answer to the audience question. Pass wizard_operation back unchanged on every call, as resume_arguments gives it. Write the content only when the result says write_content; if the conversation does not say what the email is about, ask the user together with the first round. Then call again with wizard_operation and the content: subject_line, preview_text, html or plain_text as the user chose, and only the variant B fields the result lists. The content is checked as the campaign editor checks it; an error names what to fix in the content, never a decision. html must carry an <a> whose href is exactly {{unsubscribe_link}}, plain_text the placeholder; for product blocks use table-based layout and inline CSS, absolute URLs and plain product links, with names, prices (price_display) and images from list_products. Take the logo, colours, social links and contact e-mail from the result's brand (the logo as {{logo_url}}), never invent them. When the result says provide_segment, pass the agreed new_segment with wizard_operation. The final summary confirms both creations; do not call create_segment separately. Campaign creation and scheduling continue while segment membership is being calculated.

send_at and send_at_b are ISO 8601, written from the user's words for the send time and for variant B; pass them only when the result asks for them, and on a change only when the user picks a new time. With a UTC offset they are used as given, without one they are read in the shop's timezone. They must be at least 15 minutes and at most 30 days ahead, send_at_b after send_at; the confirmation shows each one next to the user's words. On the confirming call pass only the answer; the content shown is kept. Passing different content asks the confirmation again. When status is 'needs_user_input', no campaign change was written; a segment from a prior confirmed attempt can remain saved. Show all pending_changes; nothing is saved yet. Reuse explicit user choices for configuration in decisions_pending. Ask missing choices with every option and its details; use clickable choices when available, otherwise plain text. Never invent answers. For every confirmation, show the changes or final summary and ask explicitly; the original request is not confirmation. Re-ask expired or changed questions; never reuse their old answers. Call the same tool with the original arguments plus resume_arguments, decision_token and decision_answers. Use question keys and option values, free text only when allowed, and lists for multiple choices.

The result carries the campaign id, its status, the effective UTC send time, the sender, audience and A/B test as stored and a recipient estimate per segment. Follow it with list_campaigns or get_campaign_details, test a draft with send_test_campaign, and use get_campaign_report once it was sent.

Parameters
ParameterTypeDescription
wizard_operationstringThe handle of this wizard's progress, kept by theMarketer, from the last result's resume_arguments; pass it back unchanged. Omit on the first call; a changed or expired one is answered with status 'unavailable': check the campaigns and segments, then start again without it.
decision_tokenstringFrom a 'needs_user_input' result, once the user answered its questions; omit on the first call.
decision_answersobjectThe user's answers by decision key; each value is an option value or allowed free text, a list for multiple choices. Omit on the first call.
subject_linestringThe email's subject line, at most 100 characters, without < or >; variables such as {{client_firstname}} are allowed. Pass it with the content, once the result says write_content.
preview_textstringPreheader text shown next to the subject in inboxes, at most 200 characters, without < or >.
namestringCampaign name as shown in theMarketer's lists and reports, at most 100 characters; recipients never see it. Omit to use the subject line.
htmlstringFull raw email HTML with an unsubscribe anchor whose href is exactly {{unsubscribe_link}}, when the user chose an HTML email. HTML comments are removed before saving.
plain_textstringText-only email body containing {{unsubscribe_link}}, when the user chose plain text.
send_atstringThe send time the user gave, as ISO 8601: with a UTC offset it is used as given, without one it is read in the shop's timezone. Only when the result asks for it: a set time, or the day for the best-time send on another day.
send_at_bstringVariant B's send time for a send-time A/B test, as ISO 8601 like send_at, after variant A's.
subject_bstringVariant B's subject line for a subject A/B test, at most 100 characters, different from subject_line.
preview_bstringVariant B's preview text for a subject A/B test, at most 200 characters.
html_bstringVariant B's full HTML for a content A/B test on an HTML email, with the same unsubscribe link.
plain_text_bstringVariant B's text for a content A/B test on a plain text email, containing {{unsubscribe_link}}.
campaign_idstringThe id of an existing draft or scheduled email campaign to change with the user, from list_campaigns or an earlier result; omit to create a new campaign. Pass it on every call of that change, with wizard_operation.
new_segmentobjectThe name, rules, match and lock of the new segment the user selected as this campaign's audience. Pass when provide_segment is requested; omit afterwards to keep it. Nothing is created until the final confirmation covers the segment and campaign together.
domain_idstringTarget domain.
Returns

The operation's result, pending user questions, or cancellation.

Update email campaign

update_campaignDestructive

Change an existing email campaign that is still a draft or scheduled, for explicit changes provided as structured fields: subject, sender, content, audience, send time or UTM tags, one or several at once.

When a user is talking about changing a campaign, use campaign_wizard with campaign_id: it shows what is set now, lets the user keep or change each setting, and confirms every change before writing. Use this tool when the requested changes are already specified, to edit a campaign before it goes out or to move a scheduled send. Pass campaign_id (from create_campaign, campaign_wizard or list_campaigns) and only the fields to change; everything else is kept. If several campaigns match the name, ask the user to choose using their ids, subjects and dates before calling this tool. It works on draft and scheduled campaigns: a campaign that is sending or paused is controlled with pause_campaign and resume_campaign, and a sent one cannot change apart from its waiting resend. A scheduled campaign is scheduled again with the new values, which is also how a scheduled send is moved; send_now=true moves delivery to as soon as possible after explicit confirmation. Every change to a scheduled campaign is confirmed by the user first, since saving schedules it again. A scheduled campaign is postponed by moving its send_at here, or cancelled with delete_campaign. On a draft, send_now only saves that setting and keeps the campaign as a draft; schedule_campaign schedules a draft. 'Send it to segment X' selects an audience; pass send_now only when the user explicitly requests sending now.

Content follows the campaign's mode: html for an HTML campaign, plain_text for a plaintext one, and it must still carry the unsubscribe link ({{unsubscribe_link}} as an <a> href in HTML, anywhere in plain text). Do not put HTML comments (<!-- ... -->) in the html. sender_email must be one of the domain's verified senders. segments, exclude_segments and extra_recipients replace the stored lists; an empty segments list selects the whole email audience and requires confirmation. Omitted audience fields keep their stored values.

Pass segments only with segments the user named or chose. If they describe a new audience without naming segments, pass audience_description and omit segments: the result offers exact name matches or a choice between existing and new segments. Ask only for missing criteria: pass the specific question in audience_clarification to return audience_criteria. Omit it when the user already gave the period, such as 'last 30 days'. Use list_segments to find and inspect suitable segments, then let the user choose before passing segments. Segment names do not establish matching rules. Changes to segments, exclusions, extra recipients or smart sending require the user's confirmation of the current and proposed audience and recipient estimates. Counts are before exclusions and smart sending; the final filtered count is unavailable. pending_changes lists all requested changes waiting for the decisions, including subject or content edits; show this list before asking the questions. No fields are saved while a decision is pending. Edits only to other fields do not ask an audience question. Pass a typed answer as the user wrote it: a segment name selects that segment, any other text comes back as their audience criteria. Choosing another audience opens a follow-up question; ask what they want, then retry with the new audience, keeping campaign_id and the other requested changes, without the previous decision_token or decision_answers.

ab_test sets the A/B test as create_campaign does (subject on HTML campaigns only, content or send time, split or a winner) and replaces the stored one; {'type': 'none'} turns it off and deletes its variants. Omit it to keep the stored A/B test. Both need the user's confirmation. An A/B test cannot run with the optimal send time: when both would apply, the confirmation asks which one to keep.

resend sets the automatic resend: the campaign sent again to the contacts who did not engage, after_hours after it goes out. It is set before the campaign goes out; to follow up on a campaign that has already gone out, use create_campaign_resend instead. As in create_campaign, resend gives who gets it (to, needed only when adding one), after_hours 1-72, subject_line, preview_text or own content (html, or plain_text on a plaintext campaign), and changes only what it gives: the resend keeps its other saved values and its content unless html or plain_text is given. {'to': 'none'} turns it off and deletes it. Omit it to leave the resend alone. A resend can be added while the campaign is a draft, or scheduled without an A/B test, and needs a send time; it is not available with an A/B test on the send time. Once the campaign has been sent, pass resend alone to change or turn off a resend still waiting to go out: after_hours then counts from when the campaign went out, and the confirmation shows the new send time. While the campaign is sending, its resend cannot change. A resend cannot change within 15 minutes of the campaign's send; once the campaign has been sent, it can be edited until an hour before its own send and turned off until 15 minutes before. Every resend change needs the user's confirmation. When status is 'needs_user_input', nothing was written. Show all pending_changes; nothing is saved yet. Reuse explicit user choices for configuration in decisions_pending. Ask missing choices with every option and its details; use clickable choices when available, otherwise plain text. Never invent answers. For every confirmation, show the changes or final summary and ask explicitly; the original request is not confirmation. Re-ask expired or changed questions; never reuse their old answers. Call the same tool with the original arguments plus resume_arguments, decision_token and decision_answers. Use question keys and option values, free text only when allowed, and lists for multiple choices.

On a resend of another campaign, only the name, subject, preview text, content, send time and UTM tags can change.

send_at is ISO 8601 at least 15 minutes ahead, read in the shop's timezone when it has no offset. The result lists the fields that were applied, the status, the effective UTC send time, the audience and the resend as stored, the resend also in words in the note. Test the result with send_test_campaign and follow it with get_campaign_details.

Parameters
ParameterTypeDescription
campaign_idrequiredstringThe campaign to change, by id (24 hex characters, from create_campaign, campaign_wizard or list_campaigns). If names are duplicated, ask the user which campaign they mean; never guess the id.
namestringNew campaign name as shown in theMarketer, at most 100 characters.
subject_linestringNew email subject, at most 100 characters.
preview_textstringNew preheader text shown next to the subject, at most 200 characters.
sender_namestringNew From (sender) display name. Cannot change on a resend of another campaign (made with create_campaign_resend).
sender_emailstringNew From (sender) address; must be one of the domain's verified senders. Cannot change on a resend of another campaign (made with create_campaign_resend).
reply_tostringNew reply-to address. Cannot change on a resend of another campaign (made with create_campaign_resend).
htmlstringNew full email HTML for an HTML campaign, with an unsubscribe anchor whose href is exactly {{unsubscribe_link}}.
plain_textstringNew body for a plaintext campaign, containing {{unsubscribe_link}} somewhere.
segmentsstring[]Segments the user chose, by exact name or custom segment id from list_segments. Campaign keys from decisions_pending or resume_arguments are also accepted, e.g. custom::<segment id> or activity::active_30_days. Replaces the whole stored list after confirmation: to add one, pass every current segment plus the new one (get_campaign_details shows them). An empty list selects the whole email audience, also requiring confirmation. Omit to keep the stored list unless audience_description asks for a new one. Cannot change on a resend of another campaign (made with create_campaign_resend).
audience_descriptionstringThe new audience in the user's own words when they described it without naming segments. Omit segments to offer exact name matches or a choice between existing and new segments. This is not a semantic search of segment rules. Omit both fields to keep the stored audience. Cannot change on a resend of another campaign (made with create_campaign_resend).
audience_clarificationstringA question about genuinely missing audience criteria, such as the period meant by 'recent'. Use alongside audience_description and omit segments. Omit when the user already supplied the criteria and period, and when retrying with the chosen audience after their answer.
exclude_segmentsstring[]Segments to exclude at send time, by name or key; replaces the stored list (empty list clears it). Cannot change on a resend of another campaign (made with create_campaign_resend).
extra_recipientsstring[]Addresses that get a copy outside the audience; replaces the stored list (empty list clears it). Cannot change on a resend of another campaign (made with create_campaign_resend).
smart_sendingbooleanWhether to skip contacts who received a campaign recently. Cannot change on a resend of another campaign (made with create_campaign_resend).
send_atstringNew send time, as ISO 8601 at least 15 minutes from now. With a UTC offset (e.g. 2026-10-01T10:00:00+03:00) it is used as given; without one (2026-10-01T10:00:00) it is read in the shop's timezone, as the theMarketer app does. The result reports the effective UTC time.
send_nowbooleanMove a scheduled campaign to as soon as possible (minimum 15 minutes after saving), after explicit confirmation. On a draft, only saves the setting and does not schedule delivery. Use only for an explicit request to send now; a request to send to a segment changes the audience. Cannot be combined with send_at. Default: False.
use_optimal_timebooleanDeliver at each contact's predicted best hour (true) or to everyone at send_at (false).
optimize_forenumGoal of the optimal-time model: opening (opens) or buying (purchases). One of: opening, buying.
utm_sourcestringNew UTM source appended to every link.
utm_mediumstringNew UTM medium appended to every link.
utm_campaignstringNew UTM campaign appended to every link.
ab_testobjectThe A/B test to set, {'type': 'none'} to turn it off, or omit to keep the stored one. Cannot be set on a resend of another campaign (made with create_campaign_resend).
resendobjectNever together with an A/B test on the send time. The automatic resend to add or change, {'to': 'none'} to turn it off, or omit to leave it alone. to is required when adding a resend; on a campaign that already has one, every field left out, to included, keeps the resend's saved value, so a delay or subject change can pass that field alone. Its own content is html on an HTML campaign, plain_text on a plaintext campaign. On a campaign that has been sent, pass it alone to change a resend still waiting to go out. The automatic resend is set before the campaign goes out and follows it after_hours after it goes out; to follow up on a campaign that has already gone out, use create_campaign_resend instead.
decision_tokenstringFrom a needs_user_input result for this campaign, once the user answered all its pending questions; omit on the first call.
decision_answersobjectThe user's answers by decision key; each value is an option value or allowed free text. Omit on the first call.
domain_idstringTarget domain.
Returns

The operation's result, pending user questions, or cancellation.

Resend a sent email campaign

create_campaign_resendWrite

Create a resend of a sent email campaign: a new draft that goes only to the original's recipients who did not open it, who opened but did not click, or who clicked but did not buy.

Use when the user wants to follow up on a campaign that has already gone out, as the Resend action in the theMarketer campaign list does. It never sends: the draft copies the original's sender, audience, content, subject and preview, and is scheduled afterwards with schedule_campaign, after review (get_campaign_details) and a test (send_test_campaign). For a campaign that has not gone out yet, set an automatic resend instead with the resend parameter of update_campaign, or of create_campaign for a new campaign: it goes out by itself after_hours after the campaign. Only a sent email campaign without an automatic resend can be resent this way; clicked_not_purchased needs an e-commerce plan.

The draft keeps the original's extra recipients and smart sending; they are shown in the confirmation and cannot be changed here. Extra recipients each get a copy whatever the rule, and smart sending can skip contacts who got another campaign recently, possibly everyone. Who exactly receives it is calculated at send time. Only the name, subject, preview text, content, send time and UTM tags of the draft can change later (update_campaign). Each confirmed call creates a new draft, even when the campaign already has a resend draft; a draft sends nothing until it is scheduled. When status is 'needs_user_input', nothing was written. Show all pending_changes; nothing is saved yet. Reuse explicit user choices for configuration in decisions_pending. Ask missing choices with every option and its details; use clickable choices when available, otherwise plain text. Never invent answers. For every confirmation, show the changes or final summary and ask explicitly; the original request is not confirmation. Re-ask expired or changed questions; never reuse their old answers. Call the same tool with the original arguments plus resume_arguments, decision_token and decision_answers. Use question keys and option values, free text only when allowed, and lists for multiple choices.

Parameters
ParameterTypeDescription
source_campaign_idrequiredstringThe sent campaign to follow up on, by id (24 hex characters, from list_campaigns); the main campaign, not an A/B variant.
resend_torequiredenumWho of its recipients get the resend: not_opened (did not open it), opened_not_clicked (opened but did not click) or clicked_not_purchased (clicked but did not buy; e-commerce plans only). One of: not_opened, opened_not_clicked, clicked_not_purchased.
subject_linestringA new subject for the resend, at most 100 characters; omit to keep the original's.
preview_textstringA new preview text for the resend, at most 200 characters; omit to keep the original's, or pass an empty string to clear it.
namestringThe draft's name in theMarketer, at most 100 characters; omit for 'Resend' followed by the original's name.
decision_tokenstringFrom a 'needs_user_input' result, once the user answered its questions; omit on the first call.
decision_answersobjectThe user's answers by decision key; each value is an option value. Omit on the first call.
domain_idstringTarget domain.
Returns

The operation's result, pending user questions, or cancellation.

Schedule email campaign

schedule_campaignDestructive

Schedule an email campaign that is still a draft: it goes out at send_at, or as soon as possible with send_now=true.

Use when the user wants a draft sent, including a resend draft from create_campaign_resend and a draft from create_campaign or campaign_wizard. A campaign that is already scheduled is changed with campaign_wizard and campaign_id (or update_campaign from a program); a new campaign is created with campaign_wizard. It is a real send: while it is scheduled, campaign_wizard with campaign_id can change its send time or content, and delete_campaign cancels it. Test it with send_test_campaign first.

Before anything is saved the draft is checked as the theMarketer wizard checks it: a subject, content with the unsubscribe link (<a href="{{unsubscribe_link}}">Unsubscribe</a> in HTML, {{unsubscribe_link}} in plain text) and a sender. An automatic resend needs its subject and the unsubscribe link too, and cannot go with a send-time A/B test. A resend of another campaign must still go only to that campaign's recipients who match its rule, with no A/B test or automatic resend added; the original must be sent. A campaign with an A/B test is rescheduled with its variants; for a send-time test, variant B's time must stay after the new send time. The confirmation shows what goes out, to whom and when; if the campaign changes before the send is confirmed, the user is asked again. When status is 'needs_user_input', nothing was written. Show all pending_changes; nothing is saved yet. Reuse explicit user choices for configuration in decisions_pending. Ask missing choices with every option and its details; use clickable choices when available, otherwise plain text. Never invent answers. For every confirmation, show the changes or final summary and ask explicitly; the original request is not confirmation. Re-ask expired or changed questions; never reuse their old answers. Call the same tool with the original arguments plus resume_arguments, decision_token and decision_answers. Use question keys and option values, free text only when allowed, and lists for multiple choices.

send_at is ISO 8601 at least 15 minutes ahead: with a UTC offset it is used as given, without one it is read in the shop's timezone. The account can require a longer lead time, so the result reports the send time theMarketer stored. When the account is blocked from sending, the campaign stays a draft and sending_block says why. The domain's admins get a 'campaign scheduled' email. Follow it with list_campaigns or get_campaign_details.

Parameters
ParameterTypeDescription
campaign_idrequiredstringThe draft to schedule, by id (24 hex characters, from create_campaign, campaign_wizard, create_campaign_resend or list_campaigns).
send_atstringWhen to send, as ISO 8601 at least 15 minutes from now. With a UTC offset (e.g. 2026-10-01T10:00:00+03:00) it is used as given; without one (2026-10-01T10:00:00) it is read in the shop's timezone. Pass send_at or send_now, not both.
send_nowbooleanSend as soon as possible (about 15 minutes after confirming), only when the user asked to send now. Pass send_at or send_now, not both. Default: False.
use_optimal_timebooleanDeliver to each contact at their own predicted best hour, spread over up to 24 hours (true), or to everyone at send_at (false). Omit to keep the draft's setting.
optimize_forenumGoal of the optimal-time model: opening (opens) or buying (purchases). Omit to keep the draft's setting. One of: opening, buying.
decision_tokenstringFrom a 'needs_user_input' result, once the user answered its questions; omit on the first call.
decision_answersobjectThe user's answers by decision key; each value is an option value. Omit on the first call.
domain_idstringTarget domain.
Returns

The operation's result, pending user questions, or cancellation.

Send test campaign email

send_test_campaignDestructive

Send a test copy of an email campaign to up to five addresses.

Use when the user wants to see the email in an inbox before scheduling it or after editing it. It sends one real email per address from the campaign as currently saved, with a '[Test]' subject prefix (except for addresses listed in the campaign's extra recipients) and test versions of the unsubscribe and tracking links; unsubscribed and unknown addresses receive it too. The campaign can be in any status, draft included; find the id with list_campaigns. Not for real recipients: schedule it with schedule_campaign (or change it with update_campaign).

Each domain may send 30 test emails per hour; once the limit is reached the remaining addresses come back as 'throttled' and nothing is sent to them. 'sent' means the message was accepted for delivery; delivery problems are not reported back, so ask the recipient to check the inbox and spam folder.

Parameters
ParameterTypeDescription
campaign_idrequiredstringThe campaign's id from list_campaigns (24 hex characters). For a resend, pass the main campaign's id.
recipientsrequiredstring[]One to five email addresses to send the test to. Duplicates are sent once.
variantenum'a' (default) sends the campaign itself, a manual resend made with create_campaign_resend included. 'b' sends variant B's content of an A/B test on the content of an HTML campaign, under variant A's subject. 'resend' sends the automatic resend as it will go out, with its own subject, preview and content; it is not available for plaintext campaigns, whose resend text get_campaign_details shows (section content_resend), or less than an hour before the resend goes out. One of: a, b, resend. Default: 'a'.
domain_idstringTarget domain.
Returns
FieldTypeDescription
campaign_idstringThe campaign the test was sent from.
resultsobject[]One entry per address, in the order given.
recipientstringThe address the test was sent to.
outcomestring'sent' when theMarketer accepted the test; 'throttled' when the domain's limit of 30 test emails per hour was reached, in which case nothing was sent to this address.
notestringWhat 'sent' means (accepted, not delivered), the hourly throttle and how the test email differs from the real send.

Pause campaign

pause_campaignWrite

Pause an email campaign that is sending right now.

Use when the user wants to stop a send in progress: status 'sending', shown as 'Sending now' in list_campaigns. Batches already in flight finish, no further batch starts, and pending A/B or resend parts are paused with it; resume_campaign continues the send later. A scheduled campaign is not sending yet, so it cannot be paused: cancel it with delete_campaign, or postpone it: change its send time with campaign_wizard and campaign_id. Drafts and sent campaigns have nothing to pause, and a campaign that is already paused comes back unchanged.

The result gives the status before and after the call and a note on what the pause means for the send.

Parameters
ParameterTypeDescription
campaign_idrequiredstringThe campaign's id from list_campaigns (24 hex characters); the main campaign, not an A/B or resend child.
domain_idstringTarget domain.
Returns
FieldTypeDescription
campaign_idstringThe campaign acted on.
status_beforestringThe campaign's status when the tool read it (draft, scheduled, sending, paused, sent...), the same word as list_campaigns.
status_afterstringThe campaign's status after the call, the same word as list_campaigns; equal to status_before when nothing had to change.
status_labelobjectstatus_after as the theMarketer app words it.
notestringWhat happened and what it means for the send.

Resume campaign

resume_campaignDestructive

Resume a paused email campaign so the remaining batches go out.

Use when the user wants to continue a send that pause_campaign or the app's Pause button stopped: status 'paused' in list_campaigns. This is a real send to the rest of the audience, so confirm with the user first. The remaining batches are queued again and paused A/B or resend parts wait to go out again. A scheduled campaign is not paused and goes out at its send_at: cancel it with delete_campaign, or postpone it: change its send time with campaign_wizard and campaign_id. A draft is scheduled with schedule_campaign, and a sent campaign has nothing to resume. A campaign that is already sending comes back unchanged.

The result gives the status before and after the call and a note on how the send continues.

Parameters
ParameterTypeDescription
campaign_idrequiredstringThe campaign's id from list_campaigns (24 hex characters); the main campaign, not an A/B or resend child.
domain_idstringTarget domain.
Returns
FieldTypeDescription
campaign_idstringThe campaign acted on.
status_beforestringThe campaign's status when the tool read it (draft, scheduled, sending, paused, sent...), the same word as list_campaigns.
status_afterstringThe campaign's status after the call, the same word as list_campaigns; equal to status_before when nothing had to change.
status_labelobjectstatus_after as the theMarketer app words it.
notestringWhat happened and what it means for the send.

Delete campaign

delete_campaignDestructive

Delete a draft, scheduled or paused campaign for good, after the user confirms.

Use when the user wants a campaign gone before it goes out: an abandoned draft, a test, or a scheduled send they want cancelled. Deleting a scheduled campaign is how its send is cancelled; to send it later instead, move its send_at with update_campaign. Deleting a paused campaign drops the batches it has not sent; what went out stays in its report. Its A/B test and resend go with it. A campaign that is sending, testing its A/B variants or already sent cannot be deleted: pause_campaign stops a running send first, and sent campaigns stay in the reports. A deleted campaign cannot be restored.

The first call answers needs_user_input with the one question to ask the user, which names the campaign, its status and its send time; call again with decision_token and decision_answers once they agreed. Nothing is deleted before that. A campaign renamed, rescheduled or given an A/B test or resend since the question is not deleted, and the question is asked again; one that has started sending since cannot be deleted.

Parameters
ParameterTypeDescription
campaign_idrequiredstringThe campaign to delete, by id (24 hex characters, from list_campaigns); the main campaign, not an A/B or resend part.
decision_tokenstringFrom a needs_user_input result of this tool, together with decision_answers; leave it out otherwise.
decision_answersobjectThe user's answer by decision key, e.g. {"confirm": "proceed"}; only with decision_token.
domain_idstringTarget domain.
Returns

The operation's result, pending user questions, or cancellation.

Domain6

List domains

list_domainsRead

List the theMarketer domains (shops) this connection can work with.

Use first when the account manages several domains and you need to pick one: pass a domain's name or id as domain_id to any other tool. Single-domain accounts never need it.

Returns domains, one entry per domain with its id, hostname, shop URL and the user's role on it, plus count.

Parameters

No parameters.

Returns
FieldTypeDescription
domainsobject[]One entry per domain.
domain_idstringDomain id; accepted by every domain_id parameter.
nameobjectHostname, e.g. shop.example; accepted by domain_id too.
urlobjectFull shop URL.
permissionobjectThe user's role on the domain, e.g. owner or admin.
countintegerDomains returned.

Get sending domain

get_sending_domainRead

Show the sending domain's setup: DNS records, senders and reply-to address.

Use when the user asks how their sending domain is configured, which DNS records theMarketer expects and which are still missing, or which sender addresses campaigns can go out from. It reads the current state and changes nothing; the DNS lookup runs live, so the call takes a few seconds. To re-run the full check and store its outcome use validate_domain; for whether the website tracking works use get_integration_health.

Returns the domain, valid, every expected record in dns_records with found, missing_records, the senders with the default_sender, sender_name, the effective reply_to, the extra and validated sender domains, a link to the settings page and a note naming the records to add when some are missing.

Parameters
ParameterTypeDescription
domain_idstringTarget domain.
Returns
FieldTypeDescription
domainobjectThe sending domain, e.g. shop.example; null when none is configured yet.
validbooleanTrue when the email providers have confirmed the domain and every DNS record is in place.
dns_recordsobject[]Every DNS record theMarketer expects on the domain (DKIM, SPF, DMARC and the newsletter subdomain records) with its name, type, value, priority and whether it was found.
nameobjectHost the record is set on, e.g. mkt._domainkey.shop.example.
typeobjectRecord type: TXT, CNAME or MX.
valueobjectThe value the record must hold, exactly as it has to be entered at the DNS provider.
priorityobjectPriority of an MX record; null for TXT and CNAME records.
foundbooleanTrue when the record was found in DNS with the expected value.
missing_recordsintegerHow many of dns_records are not visible in DNS yet.
default_senderobjectThe sender address campaigns use unless another one is chosen; null when no sender is configured.
sendersobject[]Every sender address configured on the domain, with the default one flagged.
emailobjectThe sender address.
defaultbooleanTrue for the address campaigns are sent from unless another sender is chosen.
sender_nameobjectThe from-name shown next to the sender address.
reply_toobjectWhere replies go: the custom reply-to address when one is set, otherwise the default sender address.
extra_sender_domainsstring[]Additional domains senders may use besides the main sending domain.
validated_domainsstring[]The sending domains the email providers have confirmed.
linksobjectWhere to open the email settings in the theMarketer web app.
app_urlobjectLink to this object in the theMarketer web app, for the user to review or edit it there. Null when the app URL is not configured on this MCP server.
switch_domain_urlobjectOnly for accounts with several domains: open this first if the app is currently on another domain, then follow app_url. The app keeps one current domain per user and app_url only works on the domain this object belongs to.
noteobjectSet when records are missing: which ones, and what to do next. Null when every record is in place.

Validate sending domain

validate_domainWrite

Run the sending-domain check now: DNS records and email provider setup.

Use when the user asks whether their sending domain is set up correctly (SPF, DKIM, DMARC, sender identities), or has just added DNS records and wants them verified. The check runs now and takes about 10 seconds: it looks up every expected DNS record, asks the email providers to confirm the sender identities again and stores the outcome on the domain. For the full record list and the senders without re-running the check use get_sending_domain.

Returns valid true when everything passes. A failed check lists the records to fix in failed_records (name, type and the value to set) with a note on what to do next; an empty list with valid false means the records are in place and the providers have not confirmed the domain yet.

Parameters
ParameterTypeDescription
domain_idstringTarget domain.
Returns
FieldTypeDescription
validbooleanTrue when the email providers confirmed the domain and every DNS record is in place; the outcome is stored on the domain.
failed_recordsobject[]Only the DNS records that were not found, each with the name, type and value to set; empty when valid.
nameobjectHost the record is set on, e.g. mkt._domainkey.shop.example.
typeobjectRecord type: TXT, CNAME or MX.
valueobjectThe value the record must hold, exactly as it has to be entered at the DNS provider.
priorityobjectPriority of an MX record; null for TXT and CNAME records.
foundbooleanTrue when the record was found in DNS with the expected value.
linksobjectWhere to open the email settings in the theMarketer web app.
app_urlobjectLink to this object in the theMarketer web app, for the user to review or edit it there. Null when the app URL is not configured on this MCP server.
switch_domain_urlobjectOnly for accounts with several domains: open this first if the app is currently on another domain, then follow app_url. The app keeps one current domain per user and app_url only works on the domain this object belongs to.
noteobjectWhat to do next when the check did not pass; null when valid.

Get costs

get_costsRead

Get the account's plan prices, billing date and usage totals.

Use for plan tier, pricing and email usage questions. Returns the plan tier (contact bounds, contacts counted, current and next monthly price), discount, sent, billing_date, email_credit and max_pause_months. Billing identity, invoices and payment details are not included; view invoices and payment settings in the authenticated theMarketer web app.

Parameters
ParameterTypeDescription
domain_idstringTarget domain.
Returns
FieldTypeDescription
planobjectThe current contact tier with its bounds, the contacts counted and the current and next monthly price.
tier_startobjectLower bound of the current contact tier.
tier_endobjectUpper bound of the current contact tier.
contactsobjectContacts counted for billing.
monthly_priceobjectMonthly price of the current tier, EUR.
next_tier_priceobjectMonthly price of the next tier, EUR.
discountobjectDiscount percent applied to the subscription.
sentobjectEmails sent in the current billing month.
billing_dateobjectNext billing date, e.g. '31 Jul 2026'; null when none is scheduled.
email_creditobjectRemaining email credit.
max_pause_monthsobjectHow many months the subscription may be paused.

Verify connection

verify_connectionRead

Check that this connection can work with the domain.

Use when tools keep failing and you want to tell a connection problem from a data problem, or when the user asks whether the integration is set up. For the list of domains the connection can reach use list_domains; for whether the website tracking works use get_integration_health.

Returns valid true when the domain is reachable on an active paid plan. Free, paused or suspended accounts come back with valid false and a note explaining it, so a false here does not by itself mean the connection is wrong.

Parameters
ParameterTypeDescription
domain_idstringTarget domain.
Returns
FieldTypeDescription
validbooleanTrue when the domain is reachable on an active paid plan.
noteobjectSet when the domain is not on an active paid plan: what that means and what to do. Null when valid.

Get integration health

get_integration_healthRead

Check whether the shop's website tracking reaches theMarketer.

Use when the user asks whether the tracking script is installed and working, before relying on funnel, audience or e-commerce figures, or when automations built on website events do not fire. It reads which standard events (page views, product views, add to cart, checkout, order...) and which custom events reached theMarketer in the last 48 hours; nothing is changed.

Returns tracking_active, the events and custom_events maps of event name to seen, the window_hours and a note on what to check when events are missing, e.g. no order event while products are viewed.

Parameters
ParameterTypeDescription
domain_idstringTarget domain.
Returns
FieldTypeDescription
tracking_activebooleanTrue when at least one standard website event was received in the last 48 hours.
window_hoursintegerLength of the observation window, in hours.
eventsmap<boolean>Standard website events (view_homepage, view_category, view_product, add_to_cart, search, add_to_wishlist, remove_from_wishlist, initiate_checkout, remove_from_cart, order, generic_page_view) and whether each was seen in the window.
custom_eventsmap<boolean>Custom events defined on the domain and whether each was seen in the window; empty when none is defined.
noteobjectWhat to check when tracking is missing or incomplete; null when it looks healthy.

E-commerce11

List products

list_productsRead

Browse the shop's product catalogue with the filters, sorts and paging of the Products page.

Use when the user asks what the shop sells, which products are on sale, in stock, best selling, most viewed or best rated, or when picking products to feature in a campaign. Results come 15 per page with total, pages and has_more; the note names the next page.

Prices are in the account currency: price is what the shop charges now, full_price the regular price, and price_display / full_price_display render them the way the shop does. For an email block prefer availability="in_stock", skip products with disabled true or any issues, and use image and url as they come: click tracking and the campaign's UTM tags are added at send time. Products the merchant disabled in theMarketer are listed too and come back with disabled true.

category and brand accept a name or an id; get_product_options lists the ones this catalogue has. Use get_product_details for one product's description, reviews, history and orders.

Parameters
ParameterTypeDescription
searchstringWords to look for in the product name, SKU, shop id or URL, case-insensitive. Every word must appear, in any order and in any of these: "pantofi piele naturala" finds "Pantofi maro piele naturala". Accents you type are optional: "naturală" finds "naturala" and "naturală", while "naturala" alone may miss a name spelt "naturală". When each word is in more than 150 products, the words are matched in the order typed and without accents; when no product has them in that order, the pages run through the products with the rarest word and keep those with every word. The note says which. Omit to list the whole catalogue.
categorystringOne category by full path ("Footwear > Running"), by leaf name when it is unique, or by id. Matches the product's main category and its other categories. A name that does not match is answered with the closest spellings.
brandstringOne brand by name (case-insensitive) or id. A name that does not match is answered with the closest spellings.
availabilityenum"in_stock", "supplier_stock" (orderable from the supplier), "out_of_stock", or "all" (default). One of: all, in_stock, supplier_stock, out_of_stock. Default: 'all'.
discountedbooleantrue for products currently discounted, false for products at full price; omit for both.
min_pricenumberLowest current price to include, inclusive, in the account currency.
max_pricenumberHighest current price to include, inclusive.
min_marginnumberLowest margin in percent, inclusive. Products without an acquisition price have no margin and never match a margin bound.
max_marginnumberHighest margin in percent, inclusive.
min_stockintegerFewest units in stock to include, inclusive.
max_stockintegerMost units in stock to include, inclusive.
healthenum"with_issues" for products whose feed entry has a validation problem (bad URL or image) or whose price is below the acquisition price; "without_issues" for products whose feed entry is valid; "any" (default) for both. One of: any, with_issues, without_issues. Default: 'any'.
sortenum"newest" (default) / "oldest" by the date the shop added the product; "price_asc" / "price_desc" by current price; "full_price", "discount", "best_selling", "most_viewed", "highest_rated", "most_reviewed", "stock", "stock_movement", "added_to_cart", "conversion_rate", "click_rate", "margin", "acquisition_price", "last_sync", "issues", "recurrence" highest first; "name", "sku", "shop_id" alphabetical. One of: newest, oldest, price_asc, price_desc, full_price, discount, best_selling, most_viewed, highest_rated, most_reviewed, stock, stock_movement, added_to_cart, conversion_rate, click_rate, margin, acquisition_price, last_sync, issues, recurrence, name, sku, shop_id. Default: 'newest'.
pageintegerPage number, starting at 1. Default: 1.
domain_idstringTarget domain.
Returns
FieldTypeDescription
productsobject[]The products on this page, in sort order.
idobjectThe product's id in theMarketer: pass it to get_product_details or a segment rule.
shop_idobjectThe shop's own product id.
skuobjectSKU from the feed.
nameobjectProduct name.
urlobjectAbsolute product URL from the feed; use it as the link target as is.
imageobjectAbsolute URL of the main image; null when the product has none.
gallerystring[]Further image URLs, at most 5 shown.
priceobjectCurrent selling price in the account currency; equals full_price when the product is not discounted.
full_priceobjectRegular price; differs from price only while a discount runs.
discount_percentobjectDiscount as a whole percent, 0 to 100; 0 when none; null when the product's prices do not support the discount it carries.
currencyobjectISO code of the account currency (e.g. RON); null when the shop's currency settings could not be loaded.
price_displayobjectprice formatted the way the shop shows it (thousands and decimal separators, currency symbol and position), e.g. '1.299,00 Lei'; null when the shop's currency settings could not be loaded.
full_price_displayobjectfull_price formatted like price_display; show it struck through only when discount_percent is above 0.
availabilityobject'in_stock', 'supplier_stock' (orderable from the supplier) or 'out_of_stock'.
stockobjectUnits in stock.
brandobjectBrand name, or null.
categoryobjectMain category, leaf name; the category filter also accepts the full path.
ratingobjectAverage review rating, 0 to 10; null when unrated.
reviewsobjectNumber of reviews.
orderedobjectUnits sold through tracked orders.
viewsobjectTracked product views.
added_to_cartobjectUnits added to a cart in tracked sessions.
click_rateobjectShare of the category's views this product took, in percent - not an email click rate.
conversion_rateobjectUnits ordered per 100 views, in percent.
marginobject(price - acquisition price) / price, in percent; null when the feed carries no acquisition price.
acquisition_priceobjectPurchase cost from the feed, in the account currency; 0 when not fed.
stock_movementobjectShare of the stock sold since it was last replenished, 0-100 percent.
recurrenceobjectRepurchase interval in days as the merchant set it; null when unset.
addedobjectWhen the shop added the product, e.g. '3 months ago'.
last_syncobjectWhen the feed last updated this product, e.g. '2 hours ago', or 'never'.
disabledbooleanTrue when the product is disabled in theMarketer; skip it in campaigns.
issuesobjectFeed problems found on this product ('invalid_url', 'invalid_image'; in a list_products listing with health="with_issues" also 'price_below_acquisition_price' when that is why it is listed); skip products that have any. Null when the product is flagged with issues that are not listed here.
extra_attributesobjectThe feed's extra attributes (colour, size, material, ...), only those with a value.
pageintegerPage returned, starting at 1.
per_pageintegerProducts per page, always 15.
totalintegerProducts matching the filters, across all pages; when the note says the pages run through the products containing one word, the products containing that word.
pagesintegerTotal pages at 15 products each.
has_morebooleanTrue when a later page exists; the note names it.
currencyobjectISO code of the account currency every price is in; null when the shop's currency settings could not be loaded.
price_format_notestringHow price_display renders prices, with an example, or why it is null.
filters_appliedmap<string>The filters and sort in effect, with brand and category resolved to 'name (id)', so what matched is unambiguous.
noteobjectWhat to know about the rows on this page, which page to ask for next, or why nothing matched and what to try; null on a last page with nothing to add.

Get product options

get_product_optionsRead

List the categories and brands of this shop's catalogue, with the ids the product filters accept.

Use before list_products when the user names a category or brand and you are not sure of its exact spelling, or when the user asks what categories or brands the shop has.

Without kind both lists come at once, 50 of each per page; with kind only that list, 200 per page. search narrows by name (case-insensitive, anywhere in the name or path) and falls back to the closest spellings when nothing matches literally. Category labels are full paths ("Root > Parent > Leaf"); list_products accepts the path, a unique leaf name or the id.

Parameters
ParameterTypeDescription
kindenum"categories" or "brands" for one list; omit for both. One of: categories, brands.
searchstringText the name must contain, case-insensitive; omit for the full list.
pageintegerPage number, starting at 1. Default: 1.
domain_idstringTarget domain.
Returns
FieldTypeDescription
kindobjectThe one list requested, or null when both were returned.
categoriesobject[]Categories on this page, as full paths 'Root > Parent > Leaf', each with the id list_products.category accepts.
idstringThe id the brand / category filters accept.
labelstringBrand name, or the category's full path 'Root > Parent > Leaf'.
product_countobjectProducts under this brand, when known; null for categories.
brandsobject[]Brands on this page, each with the id list_products.brand accepts and its product count when known.
idstringThe id the brand / category filters accept.
labelstringBrand name, or the category's full path 'Root > Parent > Leaf'.
product_countobjectProducts under this brand, when known; null for categories.
categories_totalintegerCategories matching, across all pages; 0 when only brands were requested.
brands_totalintegerBrands matching, across all pages; 0 when only categories were requested.
pageintegerPage returned, starting at 1.
pagesintegerTotal pages: 200 per page with kind, 50 of each list per page without it.
has_morebooleanTrue when a later page exists; the note says which.
noteobjectWhich page to ask for next, or that search matched nothing literally and the closest spellings are shown; null otherwise.

Get product details

get_product_detailsRead

Everything about one catalogue product, by section: summary, reviews, price and stock history, orders.

Use when the user asks about a specific product: its price and availability, what customers say about it, how its price or stock moved, or who bought it. Find the product with list_products first, or pass its shop id or SKU when exactly one product carries it.

By default returns summary (the product as list_products shows it, plus description, revenue and extra attributes) and reviews; ask for history and orders when the question needs them. Review ratings are on a 5-point scale, the summary's rating on 10. Reviews carry no reviewer names. Orders come newest first, 25 per page. Prices are in the account currency with price_display rendered the shop's way.

Parameters
ParameterTypeDescription
productrequiredstringThe product's id (24 hex characters, as list_products returns it), or the shop's product id or SKU when exactly one product carries it. Variants often share a SKU: then the call lists them and you pass the id of the one you mean.
sectionsenum[]Which sections to return; omit for summary and reviews. Any of: summary, reviews (star distribution and the latest 15 reviews), history (price and stock changes as dated rows), orders (orders containing the product, 25 per page).
pageintegerPage number, starting at 1. Default: 1.
domain_idstringTarget domain.
Returns
FieldTypeDescription
product_idstringtheMarketer id of the product described.
sections_returnedstring[]The sections included on this call, in the order the keys below are listed.
summaryobjectIdentity, prices, availability, stats, description, revenue and extra attributes.
reviewsobjectStar distribution and the latest reviews (rating on 5, no reviewer names).
historyobjectPrice and stock history as dated rows.
ordersobjectOrders containing the product, 25 per page, newest first.

Update product

update_productDestructive

Change what the product page lets a merchant edit: disable or enable a product, exclude it from recommendations, set its repurchase interval, or fill a custom column.

Use when the user wants a product hidden from campaigns and recommendations (or shown again), kept out of product recommendations only, given a repurchase interval in days for replenishment automations, or tagged in one of the catalogue's custom columns. Prices, stock, names, images and categories come from the product feed and cannot be edited here; the feed sync is where those change.

Pass at least one change. Each field is applied only when it differs from the product's current value, and changed lists what was actually changed. Custom columns are the ones the Products page shows beyond its standard fields (feed attributes such as colour or season, or columns the merchant added); a name that matches none is answered with the available ones. Find the product with list_products, or pass its shop id or SKU when exactly one product carries it.

Parameters
ParameterTypeDescription
productrequiredstringThe product's id (24 hex characters, as list_products returns it), or the shop's product id or SKU when exactly one product carries it. Variants often share a SKU: then the call lists them and you pass the id of the one you mean.
disabledbooleantrue to disable the product in theMarketer (left out of campaigns and recommendations), false to enable it again.
exclude_from_recommendationsbooleantrue to keep the product out of product recommendations while it stays in the catalogue, false to include it again.
recurrenceintegerRepurchase interval in days, 0 or more; 0 clears it.
columnstringName of the custom column to fill, as the Products page lists it (for example "season" or "Collection"); requires value.
valuestringThe text to write into column; requires column.
domain_idstringTarget domain.
Returns
FieldTypeDescription
product_idstringtheMarketer id of the product changed.
nameobjectProduct name, from the feed.
changedstring[]The fields this call changed: 'disabled', 'exclude_from_recommendations', 'recurrence' or the custom column's name. Empty when the product already had the requested values.
disabledbooleanTrue when the product is now disabled in theMarketer and left out of campaigns and recommendations.
exclude_from_recommendationsbooleanTrue when the product is now left out of product recommendations while staying in the catalogue.
recurrenceobjectRepurchase interval in days, as now set; null when unset.
custom_attributesmap<string>The product's custom attributes after the change, as text; a list value is joined with ', '.
linksobjectWhere to open this product in the theMarketer web app.
app_urlobjectLink to this object in the theMarketer web app, for the user to review or edit it there. Null when the app URL is not configured on this MCP server.
switch_domain_urlobjectOnly for accounts with several domains: open this first if the app is currently on another domain, then follow app_url. The app keeps one current domain per user and app_url only works on the domain this object belongs to.

List orders

list_ordersRead

List the shop's orders for a period with their value, status, buyer, source and products, plus the order count, revenue and average order value of the whole selection.

Use when the user asks what was ordered recently, how many orders or how much revenue a period brought, which orders came from a campaign, automation or popup, what a given customer bought, or to look up one order by its number. Orders come 15 per page, newest first by default, with total, pages and has_more; the note names the next page. stats covers every order matching the filters, not just the page; with search, only when the matches fit on one page.

Each order carries the shop's order number, total, discount and shipping in the account currency (currency), the shop's status text, the date, the source that led to it and its product lines. contact_email is masked when the account anonymises contact data; pass contact_id to get_contact_details for the buyer's profile.

For the day-by-day, week-by-week or month-by-month split between orders attributed to theMarketer and the rest use get_order_trend; for the sent, clicks, conversion rate and revenue of each channel use get_ecommerce_stats.

Parameters
ParameterTypeDescription
periodenumDate window to list: today, yesterday, this_week, last_week, this_month, last_month, last_30_days (default), last_60_days or last_90_days. The "_days" windows cover N whole days including today: last_30_days is today and the 29 days before it. Ignored when start and end are given. One of: today, yesterday, this_week, last_week, this_month, last_month, last_30_days, last_60_days, last_90_days. Default: 'last_30_days'.
startstringFirst day of a custom window, YYYY-MM-DD; requires end.
endstringLast day of a custom window, YYYY-MM-DD, inclusive; requires start.
statusstringText the order status must contain, case-insensitive: "completed" matches "Completed" and "Completed (paid)". It is matched against the statuses this shop's orders carry, which get_order_options lists; a text none of them contains gives an empty result naming them. Omit for every status.
sourceenumOnly orders from one source: newsletter (email campaigns), email_automation, bulk_sms (SMS campaigns), sms_automation, bulk_push (push notification campaigns), popup, website (orders placed on the site without a marketing touch), import, or retail (orders recorded outside the website). Omit for every source. The sources do not cover every order: some orders listed as 'Website' or 'Push notifications automation' match none of them, and the first page's note counts the period's orders no source covers. One of: newsletter, email_automation, bulk_sms, sms_automation, bulk_push, popup, website, import, retail.
searchstringOrder number or buyer email to look for. Omit to list every order.
sortenumOrder the rows by date (default) or order number. To see the orders of one status, filter by status; of one buyer, pass their email as search; of one source, filter by source. One of: date, number. Default: 'date'.
descendingbooleantrue (default) for newest or highest number first; false for the reverse. Default: True.
pageintegerPage number, starting at 1. Default: 1.
domain_idstringTarget domain.
Returns
FieldTypeDescription
ordersobject[]The orders on this page, in sort order.
numberobjectThe shop's own order number.
totalobjectOrder value in the account currency, as the shop reported it.
statusobjectOrder status as the shop reports it (e.g. 'Completed', 'Pending', 'Cancelled').
contact_emailobjectThe buyer's email (or phone when the order carries no email), masked when the account anonymises contact data; null when the order has no contact.
contact_idobjectThe buyer's contact id; pass it to get_contact_details for the full profile. Null when the order has no contact.
dateobjectOrder date as YYYY-MM-DD; null when the shop sent none.
sourceobjectWhat led to the order: 'Newsletter', 'Email Automation', 'Bulk SMS', 'SMS Automation', 'Bulk Push notifications', 'Push notifications automation', 'Popups', 'Import', 'Retail', or 'Website' for an order without a marketing touch. Some 'Website' and 'Push notifications automation' orders match no source filter.
discountnumberDiscount applied, in the account currency.
shippingnumberShipping charged, in the account currency.
linesobject[]The products in the order.
nameobjectProduct name at the time of the order; null when the product has since left the catalogue.
quantityobjectUnits ordered.
unit_priceobjectPrice paid per unit, in the account currency.
product_idobjectThe product's id in theMarketer; pass it to get_product_details. Null when the product is gone.
imageobjectAbsolute URL of the product's main image.
pageintegerPage returned, starting at 1.
per_pageintegerOrders per page, always 15.
totalintegerOrders matching the filters, across all pages.
pagesintegerTotal pages at 15 orders each.
has_morebooleanTrue when a later page exists; the note names it.
statsobjectOrder count, revenue and average order value of every order matching the filters in the period, search included; {"unavailable": reason} when they could not be loaded or the search matches more orders than one page holds (the orders still answer).
periodobjectThe date window that was applied.
presetstringThe named period applied (e.g. 'last_30_days'), or 'custom' when start and end were given.
startstringFirst day the figures cover (YYYY-MM-DD), inclusive: the window actually applied, a named period resolved to its dates.
endstringLast day the figures cover (YYYY-MM-DD), inclusive: the window actually applied.
currencyobjectISO code of the account currency every amount is in; null when the shop's currency settings could not be loaded.
noteobjectWhich page to ask for next, why nothing matched and what to try, or, with source on the first page, how many orders of the period match no source filter; null on a last page with nothing to add.

Get order options

get_order_optionsRead

List the values the order filters accept: the statuses this shop's orders carry and the sources orders can come from.

Use before list_orders when the user names an order status and you are not sure how the shop spells it (each shop sends its own status texts, e.g. "Completed", "Finalizată", "processing"), or when the user asks which statuses or sources exist. The statuses come from the shop's own orders; the sources are the fixed set list_orders understands.

Without kind both lists come at once; with kind only that list. search narrows by text (case-insensitive, anywhere in the value) and falls back to the closest spellings when no status matches literally.

Parameters
ParameterTypeDescription
kindenum"statuses" or "sources" for one list; omit for both. One of: statuses, sources.
searchstringText the status or source must contain, case-insensitive; omit for the full lists.
domain_idstringTarget domain.
Returns
FieldTypeDescription
kindobjectThe one list requested, or null when both were returned.
statusesstring[]Every order status this shop's orders carry, spelled as the shop sends it; list_orders.status matches any part of these, case-insensitive.
sourcesobject[]The values list_orders.source accepts, with what each covers.
keystringThe value to pass as list_orders.source.
labelstringHow the Orders page names this source.
descriptionstringWhich orders the source covers.
noteobjectSet when search matched no status literally and the closest spellings are shown, or when the shop has no orders yet; null otherwise.

Get order trend

get_order_trendRead

Show how many orders and how much revenue the shop made per day, week or month, split between orders attributed to theMarketer and the rest.

Use when the user asks how sales are trending, how much of the shop's revenue theMarketer drives, or wants a chart-ready series of orders over the last two weeks, three and a half months or fifteen months. Each bucket has the orders and revenue that followed a theMarketer campaign, automation or popup (attributed_*) and every other order (other_*), in the account currency (currency); totals sums the buckets. Buckets end now and come oldest first: 15 days, 15 weeks or 15 months.

For the orders themselves, with buyer, status and products, use list_orders; for the sent, clicks, conversion rate and revenue of each channel use get_ecommerce_stats.

Parameters
ParameterTypeDescription
granularityenumBucket size: daily (default, the last 15 days), weekly (the last 15 weeks, Monday to Sunday) or monthly (the last 15 calendar months). One of: daily, weekly, monthly. Default: 'daily'.
domain_idstringTarget domain.
Returns
FieldTypeDescription
granularitystringThe bucket size returned: daily, weekly or monthly.
bucketsobject[]Up to 15 buckets ending now, oldest first.
labelstringThe bucket as the chart labels it: a weekday name ('Mon'), a day span ('01 Sep - 07 Sep') or a month name ('Sep').
attributed_ordersintegerOrders that followed a theMarketer campaign, automation or popup.
other_ordersintegerEvery other order the shop recorded.
attributed_revenuenumberValue of the attributed orders, in the account currency.
other_revenuenumberValue of the other orders, in the account currency.
totalsobjectThe sum over every bucket returned.
attributed_ordersintegerAttributed orders across all buckets.
other_ordersintegerOther orders across all buckets.
attributed_revenuenumberAttributed revenue across all buckets, in the account currency.
other_revenuenumberOther revenue across all buckets, in the account currency.
currencyobjectISO code of the account currency the revenue is in; null when the shop's currency settings could not be loaded.
notestringWhat 'attributed' means and which span the buckets cover.

List coupons

list_couponsRead

List the account's discount codes as the Coupons page shows them, newest first.

Use when the user asks which coupons exist, which codes a customer can still use, whether a code was redeemed, or where a code came from. For "which codes can customer X still use" call with search=<their email> and used=false, then check expires_at: expired codes are listed too. To register a new code use save_coupon; for a customer's points and rewards use get_contact_details with the loyalty section.

Each coupon carries its code, value and type ('fixed', 'percentage' or 'shipping'), whether it was used, when it expires, its source ('API', 'popup', 'launcher', 'Campaign: <name>', 'Automation: <name>') and the contact it is assigned to (contact_email, masked when the account anonymises contact data, and contact_id for get_contact_details). Results come 15 per page with total, pages and has_more; the note names the next page.

Parameters
ParameterTypeDescription
searchstringPart of a coupon code, or a contact's email address, to look for; case-insensitive. Omit to list every coupon.
usedbooleantrue for codes already redeemed, false for codes still available; omit for both.
typeenumOnly coupons of this kind: "fixed" (amount off), "percentage" (percent off) or "shipping" (free shipping). One of: fixed, percentage, shipping.
pageintegerPage number, starting at 1. Default: 1.
domain_idstringTarget domain.
Returns
FieldTypeDescription
couponsobject[]The coupons on this page, most recently created first.
codeobjectThe discount code customers type at checkout.
valueobjectAmount off for a fixed coupon, percent off for a percentage coupon; carries no meaning for a shipping coupon.
typeobject'fixed' (amount off), 'percentage' (percent off) or 'shipping' (free shipping).
usedbooleanTrue once the code was redeemed in an order.
expires_atobjectWhen the code stops being valid, as an ISO timestamp; expired codes are listed too, so compare it with today.
sourceobjectWhere the code came from: 'API' for codes registered through save_coupon, 'popup' or 'launcher' for codes handed out on the site, 'Campaign: <name>' or 'Automation: <name>' for codes generated by a send.
campaign_nameobjectThe campaign or automation the code was generated for, when there is one.
contact_emailobjectEmail of the contact the code is assigned to; null for an unassigned code. Masked when the account anonymises contact data.
contact_idobjecttheMarketer id of that contact, for get_contact_details; null for an unassigned code.
created_atobjectWhen the code was recorded, as an ISO timestamp.
pageintegerPage returned, starting at 1.
per_pageintegerCoupons per page, always 15.
totalintegerCoupons matching the filters, across all pages.
pagesintegerTotal pages at 15 each.
has_morebooleanTrue when a later page exists; the note names it.
noteobjectWhich page to ask for next, or why nothing matched and what to try; null on a last page with results.

Save coupon

save_couponDestructive

Register a discount code in theMarketer, optionally assigned to one contact.

Use when the user wants theMarketer to know a discount code, so campaigns can show it or a customer can receive it. The code itself is created in the shop; theMarketer only records it, and the same code can be registered more than once. Use list_coupons to see the codes already recorded.

Assigning the code to a contact records it on that contact and runs the reward-redeemed automation, so the customer may receive an email. An email that matches no contact leaves the coupon unassigned; with points to deduct, an unknown email stops the save. Points to deduct are checked against the contact's loyalty balance first: a deduction larger than the balance stops the save. Returns the confirmation with the code, the assignment as theMarketer recorded it and, after a deduction, the points left.

Parameters
ParameterTypeDescription
coderequiredstringThe discount code customers type at checkout.
typerequiredenum"fixed" (amount off), "percentage" (percent off) or "shipping" (free shipping). One of: fixed, percentage, shipping.
valuerequirednumberAmount or percent, depending on type: greater than 0, and at most 100 for a percentage; any number, 0 included, for shipping.
expiration_daterequiredstringLast valid moment, in the future, as "YYYY-MM-DD" (expires at the start of that day, so give tomorrow's date or later) or "YYYY-MM-DD HH:MM:SS", on the shop's clock.
emailstringContact to assign the coupon to. An email that matches no contact leaves the coupon unassigned; with points to deduct, an unknown email stops the save.
decrease_pointsintegerLoyalty points to deduct from the contact given in email for this coupon, at most their current balance; 0 for none. Needs email. Default: 0.
domain_idstringTarget domain.
Returns
FieldTypeDescription
savedbooleanTrue: theMarketer confirmed the coupon was recorded.
codestringThe discount code as recorded.
assigned_toobjectThe contact email the coupon was assigned to, lowercased; null when no email was given or no contact has it (note says which).
contact_idobjecttheMarketer id of the contact the coupon was assigned to, for get_contact_details; null when unassigned.
points_leftobjectThe contact's loyalty balance after the deduction; null when no points were deducted or the balance could not be read back.
notestringWhat to keep in mind: the code must exist in the shop, and why the coupon is unassigned or how to check its assignment.

Get e-commerce stats

get_ecommerce_statsRead

Report e-commerce performance per theMarketer channel over a period.

Use when the user asks how the shop performed through theMarketer, which channel brings the orders, or how much revenue campaigns and automations generated in a given month or window. The default is the last 30 days; pick a named period or give start and end for an exact window. It covers only what theMarketer sent and the orders that followed: for the shop's total order count and revenue, or the orders themselves, use list_orders; for the attributed-vs-other trend use get_order_trend; for per-campaign figures use get_campaign_report; for who is on the site right now use get_realtime_visitors.

Returns one block per channel (newsletter, email_automation, sms_automation, push_automation, push, sms) plus total, each with sent, clicks, transactions, conversion_rate (transactions per 100 clicks) and revenue as numbers in currency. Archived campaigns are left out of the campaign channels. The period block gives the first and last day the figures cover, so a follow-up call with those dates as start and end returns the same figures.

Parameters
ParameterTypeDescription
periodenumNamed window: "today", "yesterday", "this_week", "last_week", "this_month" or "last_month"; "last_30_days" (default), "last_60_days" or "last_90_days" count whole days back from today, today included: "last_30_days" is today and the 29 days before it. Weeks and months are calendar-aligned. Ignored when start and end are given. One of: today, yesterday, this_week, last_week, this_month, last_month, last_30_days, last_60_days, last_90_days. Default: 'last_30_days'.
startstringFirst day of a custom window (YYYY-MM-DD), inclusive; give it together with end.
endstringLast day of a custom window (YYYY-MM-DD), inclusive; give it together with start. Must not be before start. A custom window can be as long as needed.
domain_idstringTarget domain.
Returns
FieldTypeDescription
periodobjectThe date window that was applied.
presetstringThe named period applied (e.g. 'last_30_days'), or 'custom' when start and end were given.
startstringFirst day the figures cover (YYYY-MM-DD), inclusive: the window actually applied, a named period resolved to its dates.
endstringLast day the figures cover (YYYY-MM-DD), inclusive: the window actually applied.
currencyobjectISO code of the account currency every revenue is in; null when the shop's currency settings could not be loaded.
newsletterobjectEmail campaigns (one-off newsletters); archived campaigns are not counted.
sentintegerMessages sent through this channel.
clicksintegerClicks on those messages.
transactionsintegerOrders placed after a click on this channel's messages.
conversion_ratenumberTransactions per 100 clicks, in percent; 0 when there were no clicks.
revenuenumberRevenue of the attributed orders, in currency.
email_automationobjectEmails sent by automations (welcome, abandoned cart, ...).
sentintegerMessages sent through this channel.
clicksintegerClicks on those messages.
transactionsintegerOrders placed after a click on this channel's messages.
conversion_ratenumberTransactions per 100 clicks, in percent; 0 when there were no clicks.
revenuenumberRevenue of the attributed orders, in currency.
sms_automationobjectSMS sent by automations.
sentintegerMessages sent through this channel.
clicksintegerClicks on those messages.
transactionsintegerOrders placed after a click on this channel's messages.
conversion_ratenumberTransactions per 100 clicks, in percent; 0 when there were no clicks.
revenuenumberRevenue of the attributed orders, in currency.
push_automationobjectPush notifications sent by automations.
sentintegerMessages sent through this channel.
clicksintegerClicks on those messages.
transactionsintegerOrders placed after a click on this channel's messages.
conversion_ratenumberTransactions per 100 clicks, in percent; 0 when there were no clicks.
revenuenumberRevenue of the attributed orders, in currency.
pushobjectPush-notification campaigns; archived campaigns are not counted.
sentintegerMessages sent through this channel.
clicksintegerClicks on those messages.
transactionsintegerOrders placed after a click on this channel's messages.
conversion_ratenumberTransactions per 100 clicks, in percent; 0 when there were no clicks.
revenuenumberRevenue of the attributed orders, in currency.
smsobjectSMS campaigns; archived campaigns are not counted.
sentintegerMessages sent through this channel.
clicksintegerClicks on those messages.
transactionsintegerOrders placed after a click on this channel's messages.
conversion_ratenumberTransactions per 100 clicks, in percent; 0 when there were no clicks.
revenuenumberRevenue of the attributed orders, in currency.
totalobjectAll six channels added up; its conversion_rate is computed over the summed clicks and transactions.
sentintegerMessages sent through this channel.
clicksintegerClicks on those messages.
transactionsintegerOrders placed after a click on this channel's messages.
conversion_ratenumberTransactions per 100 clicks, in percent; 0 when there were no clicks.
revenuenumberRevenue of the attributed orders, in currency.

Get real-time visitors

get_realtime_visitorsRead

Show who is on the website right now, from the last 5 minutes of tracking.

Use when the user asks how many people are on the site at the moment, where they came from, what they are looking at, or how many of today's visitors are known contacts. For past performance use get_ecommerce_stats, list_orders or get_campaign_report.

Returns visitors (last 5 minutes): total, from_marketer (visitors who arrived from a theMarketer campaign) with its percent, desktop and mobile counts with their percents, and sources with the percent of visitors from email, direct, social, other and search traffic. top_pages lists the 20 most viewed pages of the last 30 minutes with their view counts, and known_vs_anonymous gives the sessions per day over the last 8 days split into identified contacts and anonymous visitors. It does not list individual visitors. A section that could not be loaded reads {"unavailable": <reason>} while the others still answer.

Parameters
ParameterTypeDescription
domain_idstringTarget domain.
Returns
FieldTypeDescription
visitorsobjectVisitors active in the last 5 minutes with their origin and device split. Or {"unavailable": <reason>} when this one section could not be loaded (the others are unaffected).
top_pagesobjectUp to 20 most viewed pages of the last 30 minutes, most viewed first. Or {"unavailable": <reason>} when this one section could not be loaded (the others are unaffected).
known_vs_anonymousobjectSessions per day over the last 8 days, split into identified contacts and anonymous visitors. Or {"unavailable": <reason>} when this one section could not be loaded (the others are unaffected).
noteobjectSet when nobody is on the site right now or when a section is unavailable; null otherwise.

Loyalty3

Adjust loyalty points

adjust_loyalty_pointsDestructive

Add or remove loyalty points on a contact's balance, by hand.

Use when the user wants to award or deduct points outside the programme's own rules: a correction, a goodwill reward, a manual redemption. Confirm the amount with the user first: the balance changes immediately, and a decrease can take it below zero. Each adjustment moves at most 500 points, as on the contact's loyalty card in theMarketer; for a larger correction, agree the total with the user and repeat the adjustment. It works only once the account has a loyalty programme set up (get_loyalty_program says whether it has one). To read a contact's balance, tier and points history first use get_contact_details with the loyalty and loyalty_history sections; to see who holds the most points use list_loyalty_members.

Returns the balance before and after the change, the tier before and after (null on a points programme) and a note when the balance went negative or the tier changed. When the new balance cannot be read back, points_after is null and note says the adjustment was applied, so do not repeat it. The adjustment appears in the contact's points history as a manual adjustment.

Parameters
ParameterTypeDescription
actionrequiredenum"increase" to add points, "decrease" to remove them. One of: increase, decrease.
pointsrequiredintegerNumber of points to add or remove, from 1 to 500 per adjustment.
emailstringEmail address of the contact. Use contact_id instead when the account masks addresses or several contacts match.
contact_idstringtheMarketer contact id (24 hex characters, as list_contacts returns it). Pass this or email, not both.
domain_idstringTarget domain.
Returns
FieldTypeDescription
contact_idstringtheMarketer id of the contact whose balance changed, for get_contact_details.
actionstring'increase' when points were added, 'decrease' when removed.
pointsintegerHow many points were added or removed.
points_beforeintegerThe balance before this change.
points_afterobjectThe balance after this change; null when the adjustment was applied but the new balance could not be read back (note says so).
tier_beforeobjectThe contact's tier before the change; null on a points programme, which has no tiers.
tier_afterobjectThe contact's tier after the change; null on a points programme, which has no tiers, when a negative balance leaves the contact in no tier, or when the new balance could not be read back (note says so).
noteobjectSet when the balance is now negative, when the change moved the contact to another tier, or when the adjustment was applied but the new balance could not be read back; null otherwise.

Get loyalty program

get_loyalty_programRead

Show how the account's loyalty programme is set up: type, tiers, earning rules, rewards and settings.

Use when the user asks whether the shop runs a loyalty programme, how contacts earn points, what the tiers are and how many points each needs, what points can be spent on, when points expire, or whether a points booster is running. For one contact's own balance and tier use get_contact_details with the loyalty section; for the members ranked by points use list_loyalty_members; to change a balance use adjust_loyalty_points.

Returns configured and type ('points' or 'tiers'), points_name, tiers with the points range of each (empty on a points programme), rules with what each pays and how often it has paid out, rewards contacts can redeem (empty on a tiers programme), the earning settings (when points are granted, taken back and expire, whether shipping counts, any pending delay) and the booster. Every section loads on its own: one that could not be loaded reads {"unavailable": <reason>} while the others still answer, and the note says when no programme is set up yet.

Parameters
ParameterTypeDescription
domain_idstringTarget domain.
Returns
FieldTypeDescription
configuredbooleanTrue when the account has chosen a programme type; false when no loyalty programme is set up yet.
typeobject'points' when contacts collect and spend points on rewards, 'tiers' when their balance places them in a tier; null when no programme is set up.
points_nameobjectWhat the programme calls its points. Or {"unavailable": <reason>} when this one section could not be loaded (the others are unaffected).
tiersobjectThe tiers with their points ranges, lowest first; empty on a points programme or when no programme is set up. Or {"unavailable": <reason>} when this one section could not be loaded (the others are unaffected).
rulesobjectThe ways contacts earn points, enabled or not, with how often each has paid out; empty when no programme is set up. Or {"unavailable": <reason>} when this one section could not be loaded (the others are unaffected).
rewardsobjectWhat contacts can spend points on; empty on a tiers programme or when no programme is set up. Or {"unavailable": <reason>} when this one section could not be loaded (the others are unaffected).
earningobjectWhen points are granted, taken back and expire. Or {"unavailable": <reason>} when this one section could not be loaded (the others are unaffected).
boosterobjectThe points multiplier and its period. Or {"unavailable": <reason>} when this one section could not be loaded (the others are unaffected).
linksobjectWhere to open the loyalty programme in the theMarketer web app.
app_urlobjectLink to this object in the theMarketer web app, for the user to review or edit it there. Null when the app URL is not configured on this MCP server.
switch_domain_urlobjectOnly for accounts with several domains: open this first if the app is currently on another domain, then follow app_url. The app keeps one current domain per user and app_url only works on the domain this object belongs to.
noteobjectSet when no programme is set up or when a section is unavailable; null otherwise.

List loyalty members

list_loyalty_membersRead

List the loyalty programme's members ranked by points, optionally one tier or one name.

Use when the user asks for the top members by points, who is in a given tier, how many points a contact is about to lose, or who has redeemed the most. For everything about one member (balance, tier, points history, rewards) use get_contact_details with the loyalty sections; to change a balance use adjust_loyalty_points; for how the programme itself is set up use get_loyalty_program.

Each member carries contact_id, email (masked when the account anonymises contact data; pass contact_id to the other tools), name, points and tier (null on a points programme). Listing the whole programme also gives redeemed and about_to_expire (points expiring within 30 days); listing one tier gives reviews and referrals instead and orders by points only. The whole-programme list ranks every contact with an email address, so total is the audience size and contacts with 0 points come last. Results come 15 per page with total, pages and has_more; the note names the next page.

Parameters
ParameterTypeDescription
searchstringPart of an email address or name to look for, case-insensitive. Omit to list every member.
tierstringA tier name, as get_loyalty_program lists it, to show only that tier's members; tiers programmes only. Omit for the whole programme.
sortenum"points" to rank by current balance (default), "redeemed" to rank by points spent so far. Only "points" is available when tier is given. One of: points, redeemed. Default: 'points'.
descendingbooleantrue (default) puts the highest first; false the lowest. Default: True.
pageintegerPage number, starting at 1. Default: 1.
domain_idstringTarget domain.
Returns
FieldTypeDescription
membersobject[]The members on this page, in the requested order.
contact_idobjecttheMarketer id of the contact, for get_contact_details and adjust_loyalty_points.
emailobjectThe contact's email address; masked when the account anonymises contact data, so pass contact_id to the other tools.
nameobjectThe contact's full name; null when none is on file.
pointsintegerThe contact's current points balance.
tierobjectThe tier the balance places the contact in; null on a points programme, which has no tiers.
redeemedobjectPoints the contact has spent so far; null when listing one tier, which does not carry it.
about_to_expireobjectPoints that expire within the next 30 days; null when listing one tier, which does not carry it.
reviewsobjectReviews the contact has left; only when listing one tier, null otherwise.
referralsobjectFriends the contact has referred; only when listing one tier, null otherwise.
typestring'points' or 'tiers': the kind of programme these members belong to.
tierobjectThe tier the list was narrowed to, spelled as the programme names it; null when the whole programme was listed.
pageintegerPage returned, starting at 1.
per_pageintegerMembers per page, always 15.
totalintegerMembers matching the filters, across all pages.
pagesintegerTotal pages at 15 each.
has_morebooleanTrue when a later page exists; the note names it.
noteobjectWhich page to ask for next, or why nothing matched and what to try; null on a last page with results.

Reports4

Get report

get_reportRead

Get one performance metric of a marketing channel, day by day.

Use when the user asks how email, SMS or push campaigns, automations or signup forms performed over a period: sends, opens, clicks, revenue, conversion, unsubscribes, form impressions and signups. The default window is the last 30 days; pick a named period or give start and end, and add compare_to for the change against the previous period or the previous year. Windows cover at most 90 days, as long as last_90_days (today and the 89 days before it). For one campaign's full report use get_campaign_report; for orders and revenue per theMarketer channel use get_ecommerce_stats or list_orders; for how many contacts there are use get_audience_evolution (today) or get_audience_history (over time).

Returns series with a value per day, total over the window, by_campaign with the campaigns or automations behind it (largest first, 25 per page; campaigns_total, pages and has_more say how many there are and the note names the next page). With a comparison it adds previous_series, previous_total and change_percent. unit says whether the numbers are counts, percents or amounts in currency.

Parameters
ParameterTypeDescription
channelrequiredenum"email", "sms", "push" or "forms" (signup forms). One of: email, sms, push, forms.
metricrequiredenumWhat to measure. email accepts sent, opens, unique-opens, open-rate, unique-open-rate, clicks, unique-clicks, click-rate, unique-click-rate, transactions, revenue, conversion-rate, average-order-value, unsubscribed, unsubscribe-rate, bounced, bounce-rate, complaints and complaint-rate; sms and push accept sent, clicks, unique-clicks, click-rate, unique-click-rate, transactions, revenue, conversion-rate, average-order-value, unsubscribed and unsubscribe-rate; forms accept impressions, total-impressions, subscribed-users, total-subscribed-users, subscribe-rate and total-subscribe-rate. One of: sent, open-rate, unique-open-rate, click-rate, unique-click-rate, opens, unique-opens, clicks, unique-clicks, transactions, revenue, conversion-rate, average-order-value, unsubscribed, complaints, bounced, bounce-rate, complaint-rate, unsubscribe-rate, total-impressions, total-subscribed-users, total-subscribe-rate, impressions, subscribed-users, subscribe-rate.
scopeenumWhat to aggregate: "campaigns" (default) or "automation" for email, sms and push; "popups" (default) or "embedded" for forms. One of: campaigns, automation, popups, embedded.
periodenumNamed window: "today", "yesterday", "this_week", "last_week", "this_month", "last_month", "last_30_days" (default), "last_60_days" or "last_90_days". Weeks run Monday to Sunday and months are calendar months; the "_days" windows cover N whole days including today: "last_30_days" is today and the 29 days before it. Ignored when start and end are given. One of: today, yesterday, this_week, last_week, this_month, last_month, last_30_days, last_60_days, last_90_days. Default: 'last_30_days'.
startstringFirst day of a custom window (YYYY-MM-DD), inclusive; give it together with end.
endstringLast day of a custom window (YYYY-MM-DD), inclusive; give it together with start. Must not be before start; the window covers at most 90 days.
compare_toenum"previous_period" compares with the same number of days ending the day before the window; "previous_year" compares with the same number of days one year earlier, ending on the same date (28 February stands in for 29 February); "none" (default) adds no comparison. One of: previous_period, previous_year, none. Default: 'none'.
pageintegerPage number, starting at 1. Default: 1.
domain_idstringTarget domain.
Returns
FieldTypeDescription
channelstringThe channel measured: email, sms, push or forms.
scopestringWhat was aggregated: campaigns or automation; popups or embedded for forms.
metricstringThe metric code measured, e.g. 'open-rate'.
unitstringWhat the numbers are: 'count', 'percent' (0-100) or 'currency' (amounts in currency).
currencyobjectISO code of the account currency for a 'currency' metric; null for counts and percents, or when the shop's currency settings could not be loaded.
windowobjectThe dates that were applied.
presetstringThe named period applied (e.g. 'last_30_days'), or 'custom' when start and end were given.
startstringFirst day the figures cover (YYYY-MM-DD), inclusive: the window actually applied, a named period resolved to its dates.
endstringLast day the figures cover (YYYY-MM-DD), inclusive: the window actually applied.
compare_tostringThe comparison applied: 'previous_period', 'previous_year' or 'none'.
previous_startobjectFirst day of the comparison window, which has as many days as the window: for 'previous_year' the same number of days one year earlier, ending on the same date (28 February stands in for 29 February); null without a comparison.
previous_endobjectLast day of the comparison window: for 'previous_year' the same date one year earlier (28 February stands in for 29 February); null without a comparison.
seriesobject[]The metric's value for each day.
datestringThe day, YYYY-MM-DD.
valuenumberThe metric's value for that day.
totalobjectThe metric over the whole window: counts and amounts summed, rates computed over the window's totals.
previous_seriesobject[]The metric's value for each day of the comparison window, as many days as series: for 'previous_year' the same number of days one year earlier, ending on the same date (28 February stands in for 29 February); empty without a comparison.
datestringThe day, YYYY-MM-DD.
valuenumberThe metric's value for that day.
previous_totalobjectThe metric over the comparison window; null without a comparison and for rates and averages, whose comparison shows in previous_series and change_percent.
change_percentobjectPercent change of total against previous_total; null without a comparison or when the comparison window recorded nothing and this one did.
by_campaignobject[]The campaigns or automations behind the total, largest value first, 25 per page; only campaigns sent within the window with a non-zero value are listed. When they add up to less than total, the note says how much comes from campaigns sent before it.
refstringtheMarketer's reference number for the campaign or automation, as the report labels it; find it by name in list_campaigns for its id.
nameobjectIts name, as shown in theMarketer.
valuenumberThe metric's value for it over the window.
campaigns_totalintegerHow many campaigns or automations contributed in the window, across every page of by_campaign.
pageintegerThe by_campaign page returned, starting at 1.
pagesintegerTotal by_campaign pages at 25 campaigns each.
has_morebooleanTrue when a later by_campaign page exists; the note names it. The metric totals cover the whole window regardless of page.
noteobjectWhich page to ask for the next campaigns; set when the window is long, when nothing was recorded for the metric, when some or all of the activity comes from campaigns sent before the window, or when the comparison window recorded nothing, so no percent change is given; null otherwise.

Get audience history

get_audience_historyRead

Get the day-by-day history of an audience count: subscribers per channel or email list health.

Use for trends: how the number of email, SMS, push or loyalty subscribers, or the active, inactive, cleaned and bounced email counts, changed over time. The default window is the last 30 days; pick a named period or give start and end, and add compare_to for the change against the previous period or the previous year. Windows cover at most 90 days, the length of last_90_days. For today's numbers and the last 7 days' joins and losses use get_audience_evolution; for list health today use get_audience_breakdown; for campaign performance use get_report.

Returns series with one value per day: the end-of-day snapshot of the count, not that day's signups, and latest, the last recorded day's count in the window. With a comparison it adds previous_series, previous_latest and change_percent. The note explains the values.

Parameters
ParameterTypeDescription
metricrequiredenumWhich count to follow: total-subscribed-emails, total-subscribed-sms, total-subscribed-push, total-subscribed-loyalty, total-unsubscribed-emails, total-unsubscribed-sms, total-unsubscribed-push, total-unsubscribed-loyalty, total-active-emails, total-inactive-emails, total-cleaned-emails or total-bounced-emails. One of: total-subscribed-emails, total-subscribed-sms, total-subscribed-push, total-subscribed-loyalty, total-unsubscribed-emails, total-unsubscribed-sms, total-unsubscribed-push, total-unsubscribed-loyalty, total-active-emails, total-inactive-emails, total-cleaned-emails, total-bounced-emails.
periodenumNamed window: "today", "yesterday", "this_week", "last_week", "this_month", "last_month", "last_30_days" (default), "last_60_days" or "last_90_days". Weeks run Monday to Sunday and months are calendar months; the "_days" windows cover N whole days including today: "last_30_days" is today and the 29 days before it. Ignored when start and end are given. One of: today, yesterday, this_week, last_week, this_month, last_month, last_30_days, last_60_days, last_90_days. Default: 'last_30_days'.
startstringFirst day of a custom window (YYYY-MM-DD), inclusive; give it together with end.
endstringLast day of a custom window (YYYY-MM-DD), inclusive; give it together with start. Must not be before start; the window covers at most 90 days.
compare_toenum"previous_period" compares with the same number of days ending the day before the window; "previous_year" compares with the same number of days one year earlier, ending on the same date (28 February stands in for 29 February); "none" (default) adds no comparison. One of: previous_period, previous_year, none. Default: 'none'.
domain_idstringTarget domain.
Returns
FieldTypeDescription
metricstringThe count followed, e.g. 'total-subscribed-emails'.
windowobjectThe dates that were applied.
presetstringThe named period applied (e.g. 'last_30_days'), or 'custom' when start and end were given.
startstringFirst day the figures cover (YYYY-MM-DD), inclusive: the window actually applied, a named period resolved to its dates.
endstringLast day the figures cover (YYYY-MM-DD), inclusive: the window actually applied.
compare_tostringThe comparison applied: 'previous_period', 'previous_year' or 'none'.
previous_startobjectFirst day of the comparison window, which has as many days as the window: for 'previous_year' the same number of days one year earlier, ending on the same date (28 February stands in for 29 February); null without a comparison.
previous_endobjectLast day of the comparison window: for 'previous_year' the same date one year earlier (28 February stands in for 29 February); null without a comparison.
seriesobject[]The count at the end of each day; a day at 0 has no recorded count.
datestringThe day, YYYY-MM-DD.
valuenumberThe metric's value for that day.
latestobjectThe last recorded day's count in the window; null when no day was recorded.
previous_seriesobject[]The count at the end of each day of the comparison window; empty without a comparison.
datestringThe day, YYYY-MM-DD.
valuenumberThe metric's value for that day.
previous_latestobjectThe last recorded day's count in the comparison window; null without a comparison or when no day of it was recorded.
change_percentobjectPercent change of latest against previous_latest; null without a comparison or when either window has no recorded count.
notestringHow to read the values.

List analytics reports

list_analytics_reportsRead

List the reports saved in the Analytics section of theMarketer.

Use when the user asks which reports or dashboards they have set up, or before get_analytics_report when the report's name is not known. Both the reports theMarketer provides ('system') and the ones the account built ('custom') are listed. For one metric of one channel without a saved report use get_report.

Returns reports with each report's index, name, type and when it was created and last changed, 50 per page with count, pages and has_more. Several reports often share a name such as "Custom report": tell them apart by index and by when they were created or changed, and pass the index to get_analytics_report for the figures.

Parameters
ParameterTypeDescription
pageintegerPage number, starting at 1. Default: 1.
domain_idstringTarget domain.
Returns
FieldTypeDescription
reportsobject[]The saved reports on this page, most recently created first.
indexintegerThe report's position in the saved list; pass it or the name to get_analytics_report.
namestringThe report's name, as shown in theMarketer.
typestring'system' for the reports theMarketer provides, 'custom' for those the account built.
created_atobjectWhen the report was created, as theMarketer labels it (e.g. '05 Sep 2026').
updatedobjectWhen the report was last changed, as theMarketer labels it (e.g. '2 days ago').
countintegerHow many reports are saved, across all pages.
pageintegerPage returned, starting at 1.
pagesintegerTotal pages at 50 reports each.
has_morebooleanTrue when a later page exists; the note names it.
noteobjectWhich page to ask for next, or that the account has no saved reports; null on a last page with results.

Get analytics report

get_analytics_reportRead

Get one report saved in the Analytics section of theMarketer, over a period.

Use when the user asks for one of their saved reports or dashboards by name ("show me my Email overview report"), or for the figures the Analytics page shows for a period. The default window is the last 30 days compared with the previous period; pick a named period or give start and end, and set compare_to to change or drop the comparison. Windows cover at most 90 days, the length of last_90_days. Use list_analytics_reports for the report names; for one metric of one channel without a saved report use get_report; for one campaign use get_campaign_report.

Returns the report's title and type, the window applied and widgets: each with its channel, scope, metrics (day-by-day series, total and change_percent, with a unit of count, percent or currency) and by_campaign with the campaigns behind the figures. links opens the report in theMarketer.

Parameters
ParameterTypeDescription
reportrequiredstringThe report's name as list_analytics_reports shows it (case-insensitive; part of the name works when it matches one report), or its index as a number.
periodenumNamed window: "today", "yesterday", "this_week", "last_week", "this_month", "last_month", "last_30_days" (default), "last_60_days" or "last_90_days". Weeks run Monday to Sunday and months are calendar months; the "_days" windows cover N whole days including today: "last_30_days" is today and the 29 days before it. Ignored when start and end are given. One of: today, yesterday, this_week, last_week, this_month, last_month, last_30_days, last_60_days, last_90_days. Default: 'last_30_days'.
startstringFirst day of a custom window (YYYY-MM-DD), inclusive; give it together with end.
endstringLast day of a custom window (YYYY-MM-DD), inclusive; give it together with start. Must not be before start; the window covers at most 90 days.
compare_toenum"previous_period" (default) compares with the Analytics page's own previous period: it ends the day before the window starts and is one day shorter than the window (a single-day window compares with the day before); "previous_year" with the same dates one year earlier; "none" leaves the comparison out. One of: previous_period, previous_year, none. Default: 'previous_period'.
domain_idstringTarget domain.
Returns
FieldTypeDescription
indexintegerThe report's position in the saved list.
titlestringThe report's name.
typestring'system' for a report theMarketer provides, 'custom' for one the account built.
windowobjectThe dates that were applied.
presetstringThe named period applied (e.g. 'last_30_days'), or 'custom' when start and end were given.
startstringFirst day the figures cover (YYYY-MM-DD), inclusive: the window actually applied, a named period resolved to its dates.
endstringLast day the figures cover (YYYY-MM-DD), inclusive: the window actually applied.
compare_tostringThe comparison applied: 'previous_period', 'previous_year' or 'none'.
previous_startobjectFirst day of the comparison window: for 'previous_year' the same date one year earlier; null without a comparison.
previous_endobjectLast day of the comparison window: for 'previous_year' the same date one year earlier; null without a comparison.
currencyobjectISO code of the account currency every 'currency' metric is in; null when the shop's currency settings could not be loaded.
widgetsobject[]The report's widgets in the order the page shows them.
titlestringThe widget's title, as shown in the report.
channelstringWhat the widget measures: 'email', 'sms', 'push', 'audience' or 'signup_forms'.
scopeobjectWhat it aggregates: 'campaigns' or 'automation'; 'popups' or 'embedded' for signup forms; null for audience counts.
metricsobject[]The widget's metrics, each day by day with its total.
metricstringThe metric code, e.g. 'open_rate'.
unitstringWhat the numbers are: 'count', 'percent' (0-100) or 'currency' (amounts in the report's currency).
seriesobject[]The metric's value for each day.
totalobjectThe metric over the whole window; null when it has no total.
change_percentobjectPercent change against the comparison window; null without a comparison, or when no change can be measured, e.g. the comparison window recorded nothing.
by_campaignobject[]The campaigns or automations behind the widget's figures, with their value per metric; empty for widgets without a campaign split. Only campaigns sent within the window are listed; when they add up to less than a metric's total, the note says how much comes from campaigns sent before it.
refstringtheMarketer's reference number for the campaign or automation, as the report labels it; find it by name in list_campaigns for its id.
nameobjectIts name, as shown in theMarketer.
valuesmap<number>Its value for each of the widget's metrics, keyed by metric code.
noteobjectSet when a campaign widget's totals include activity of campaigns sent before the window, which by_campaign does not list; null otherwise.
linksobjectWhere to open this report in the theMarketer web app.
app_urlobjectLink to this object in the theMarketer web app, for the user to review or edit it there. Null when the app URL is not configured on this MCP server.
switch_domain_urlobjectOnly for accounts with several domains: open this first if the app is currently on another domain, then follow app_url. The app keeps one current domain per user and app_url only works on the domain this object belongs to.
noteobjectSet when the report has no widgets; null otherwise.

Reviews3

Get reviews overview

get_reviews_overviewRead

Show how customers rate the shop: score, NPS split, rating trend, most reviewed products and most active reviewers.

Use when the user asks how the shop is rated, what its NPS is, whether ratings are improving, which products get the most reviews, who reviews the most, or how many reviews await moderation. For the reviews themselves use list_reviews; for one product's reviews and star distribution use get_product_details; to approve or reject a review use moderate_review.

Returns the score on the account's scale (score_as: '0-10', '0-5' or 'nps'), the nps and the average rating on both 0-10 and 0-5, reviews_total and reviews_last_30_days (approved reviews only; list_reviews with status="all" also lists pending and rejected ones), pending_reviews, the promoters, passives and detractors with counts and percents, what the account collects ('products' or 'orders'), the rating trend over the last 8 periods, the 10 most_reviewed_products and the 10 top_reviewers (names and contact ids, no email addresses). Every section loads on its own: one that could not be loaded reads {"unavailable": <reason>} while the others still answer, and the note says when no review is approved yet.

Parameters
ParameterTypeDescription
trendenumPeriod size of the rating trend: "daily", "weekly", "monthly" (default) or "quarterly"; the trend always covers the last 8 periods. One of: daily, weekly, monthly, quarterly. Default: 'monthly'.
domain_idstringTarget domain.
Returns
FieldTypeDescription
scoreobjectThe shop's score on the scale the account chose (score_as); null until a review is approved.
score_asobjectThe scale the account scores on: '0-10', '0-5' (stars) or 'nps' (Net Promoter Score, -100 to 100).
npsobjectNet Promoter Score of the reviewers, -100 to 100: promoters (9-10) minus detractors (0-6) as a percent; null until a review is approved.
average_rating_10objectAverage rating of the approved reviews on 0-10; null when none is approved.
average_rating_5objectThe same average as stars on 0-5; null when none is approved.
reviews_totalobjectApproved reviews on record, the ones the score counts; pending and rejected reviews are not included, so list_reviews with status="all" can list more. Null when the score section could not be loaded.
reviews_last_30_daysobjectApproved reviews received in the last 30 days; null when the score section could not be loaded.
pending_reviewsobjectReviews waiting for moderation; list them with list_reviews. Null when the count could not be loaded.
promotersobjectReviewers who rated 9 or 10 on 0-10; null when the score section could not be loaded.
passivesobjectReviewers who rated 7 or 8 on 0-10; null when the score section could not be loaded.
detractorsobjectReviewers who rated 0 to 6 on 0-10; null when the score section could not be loaded.
collectsobjectWhat customers are asked to review: 'products' (one review per product bought) or 'orders' (one review per order); null when the settings could not be loaded.
trendobjectThe average rating per period over the last 8 periods, oldest first. Or {"unavailable": <reason>} when this one section could not be loaded (the others are unaffected).
most_reviewed_productsobjectUp to 10 products with the most reviews, most reviewed first. Or {"unavailable": <reason>} when this one section could not be loaded (the others are unaffected).
top_reviewersobjectUp to 10 contacts who wrote the most reviews, most active first; names and contact ids only. Or {"unavailable": <reason>} when this one section could not be loaded (the others are unaffected).
noteobjectSet when no review is approved yet, when reviews await moderation, or when a section is unavailable; null otherwise.

List reviews

list_reviewsRead

List customer reviews as the Feedback pages show them: newest first with ids and paging, or the 15 highest- or lowest-rated with product and contact.

Use when the user asks what customers wrote, which reviews await moderation, what the best or worst reviews say, or to find a review before approving, rejecting or deleting it with moderate_review. For the shop's score and NPS use get_reviews_overview; for one product's reviews use get_product_details.

The default, sort="newest", pages through the reviews 15 at a time, newest first, filtered by status and optionally by search; each row carries its review_id (for moderate_review), status, stars, text, date and the reviewer's name, without the product. sort="highest_rating" or "lowest_rating" shows the first 15 reviews ranked by rating with their product (shop id, name) and contact (contact id, name) and any photos, but no review ids; it takes no search or page. When that ranking cannot be loaded, the 15 come from the newest-first list instead, ranked among the 150 reviews received or moderated most recently, with review ids but without product or contact; the note says which. total, pages, has_more and the note say how to get the next page or the other view. Reviewer email addresses are never included.

Parameters
ParameterTypeDescription
statusenumWhich reviews to list: "pending" (awaiting moderation), "approved", "rejected" or "all". Defaults to "pending" with sort="newest" and to "all" when ranking by rating. One of: pending, approved, rejected, all.
sortenum"newest" (default; by date, with review ids and paging), "highest_rating" or "lowest_rating" (the first 15 by rating, with product and contact, no ids). One of: newest, highest_rating, lowest_rating. Default: 'newest'.
searchstringText to look for in what the customer wrote; it does not match the reviewer's name or the product. Only with sort="newest". Omit to list every review of the chosen status.
pageintegerPage number, starting at 1. Default: 1.
domain_idstringTarget domain.
Returns
FieldTypeDescription
reviewsobject[]The reviews on this page, in sort order.
review_idobjectThe review's id, to pass to moderate_review; null on the rating-ranked list, which carries no ids.
statusobject'pending' (awaiting moderation), 'approved' (counted in the product's rating) or 'rejected' (on record, not counted).
starsnumberThe rating as stars, 0 to 5.
textobjectWhat the customer wrote; null for a rating without text.
dateobjectWhen the review was left, as the page shows it (a date or a relative label such as '2 days ago').
productobjectThe product reviewed; null on the newest-first list, which carries no product.
contactobjectWho wrote the review; the newest-first list gives the name only, the rating-ranked list adds the contact id.
mediastring[]URLs of the photos attached to the review; empty when none.
statusstringThe status filter applied: 'pending', 'approved', 'rejected' or 'all'.
sortstringThe order applied: 'newest', 'highest_rating' or 'lowest_rating'.
pending_reviewsobjectReviews waiting for moderation when known (always for status 'pending' without search), null otherwise.
pageintegerPage returned, starting at 1.
per_pageintegerReviews per page, always 15.
totalobjectReviews matching the filter across all pages; null when ranking by rating, which shows the first 15 only.
pagesintegerTotal pages at 15 each.
has_morebooleanTrue when a later page exists; the note names it.
noteobjectWhich page to ask for next, how to get the other view (ids and paging, or products and contacts), or why nothing matched.

Moderate review

moderate_reviewDestructive

Approve, reject or delete one customer review, as the Feedback moderation page does.

Use when the user wants a pending review accepted (approve), declined or kept out of the product's rating (reject), or removed altogether (delete). Find the review and its id with list_reviews first; the ranked view carries no ids. Deleting is irreversible: confirm with the user before calling with action="delete".

Approving marks the review approved in the account: its rating counts in the product's rating and review count, the contact's NPS class is set from the rating and the loyalty programme may credit points to the contact's balance. Rejecting keeps the review on record as rejected and out of the product's rating; rejecting an approved review removes its rating from the product. Deleting removes the review from the account for good. Returns the review's status before and after, its stars and text, the product with its star distribution, and whether anything changed: a review that already has the requested status is left as it is.

Parameters
ParameterTypeDescription
review_idrequiredstringThe review's id, 24 hexadecimal characters, as list_reviews returns it with sort="newest".
actionrequiredenum"approve" to accept the review, "reject" to keep it on record without counting it, or "delete" to remove it permanently. One of: approve, reject, delete.
domain_idstringTarget domain.
Returns
FieldTypeDescription
review_idstringThe review acted on.
actionstring'approve', 'reject' or 'delete'.
changedbooleanTrue when the call changed the review; false when it already had the requested status.
status_beforeobjectThe review's status before the call.
status_afterobjectThe review's status after the call; null once deleted.
starsnumberThe review's rating as stars, 0 to 5.
textobjectWhat the customer wrote, up to 200 characters; null for a rating without text.
productobjectThe product reviewed with its current star distribution; null when it could not be loaded.
noteobjectWhat the action changed beyond the review itself: the product's rating, the contact's NPS class, loyalty points.

Transactional4

Send transactional email

send_transactional_emailDestructive

Send one transactional email: an order confirmation, a delivery update, a receipt.

Use for a single operational email to one recipient. Never for marketing or newsletters: those are campaigns (campaign_wizard). This sends a real email and uses one transactional email credit, two with bcc, so confirm the content and the recipient with the user first. Check the balance with get_transactional_credits and follow delivery in list_transactional_messages, which also shows bounces.

Returns result "success" with the message_id of the stored message, the recipient and the credits_used. With queue=true the email is accepted as soon as it is queued (queued true, no message_id yet) and its delivery shows in list_transactional_messages within a few minutes. An email that could not be sent is answered with an error naming the reason: a recipient domain without mail records, a sender that is not one of the account's senders or confirmed sending domains, no credit left, or an account in sandbox mode, where only the sandbox recipients listed by get_transactional_credits can be reached.

Parameters
ParameterTypeDescription
torequiredstringRecipient email address; its domain needs MX records.
subjectrequiredstringEmail subject.
bodyrequiredstringOperational email body, HTML or plain text; an open-tracking pixel is added, and scripts, embedded frames and event handlers are removed. Do not include passwords, authentication codes, payment-card data, government identifiers or health data.
senderstringFrom address as a bare email (shop@example.com): one of the account's senders, or an address at one of its confirmed sending domains (get_sending_domain lists both). Defaults to the account's default sender.
reply_tostringReply-to email address.
bccstringOne extra recipient who gets a copy; uses a second credit.
queuebooleanQueue the email instead of sending it right away. Default: False.
domain_idstringTarget domain.
Returns
FieldTypeDescription
resultstring'success' when theMarketer accepted the email for delivery.
message_idobjectId of the stored message; null when the email was queued, whose id appears in list_transactional_messages once it is sent.
bcc_message_idobjectId of the copy sent to bcc; null when no copy was asked for.
queuedbooleanTrue when the email was queued for sending rather than sent right away.
recipientstringThe address the email was sent to.
credits_usedintegerTransactional email credits this call used: 1, or 2 with a bcc copy.
noteobjectWhen the email was queued or a copy was sent; null otherwise.

Send transactional SMS

send_transactional_smsDestructive

Send one transactional SMS: an order update or a delivery notice.

Use for a single operational text message to one number. Never for marketing: SMS campaigns are created in theMarketer. This sends a real SMS through the account's provider and uses SMS credit per segment (160 characters in the GSM alphabet, 70 with other characters), so confirm the text and the number with the user first. Check the balance with get_transactional_credits and follow delivery in list_transactional_messages with channel="sms".

Returns result "success" with the message_id, the recipient as sent, the provider's status label when it gave one, and how many segments the text takes. An SMS that could not be sent is answered with an error naming the reason, such as no credit left or an account in sandbox mode, where only the sandbox numbers listed by get_transactional_credits can be reached and the text is limited to 160 characters.

Parameters
ParameterTypeDescription
torequiredstringRecipient in international format: "+", country code and number, digits only, e.g. +40712345678. Spaces and dashes are removed.
contentrequiredstringOperational message text; do not include authentication codes, passwords, payment-card data or other restricted data. Characters outside the GSM alphabet (most accented letters, emoji) shorten each segment to 70 characters.
domain_idstringTarget domain.
Returns
FieldTypeDescription
resultstring'success' when theMarketer handed the SMS to the provider.
message_idobjectId of the stored SMS; null when none was assigned.
recipientstringThe number the SMS was sent to, in international format.
provider_statusobjectThe provider's status label at hand-over, such as 'Sent' or 'Queued at network'; null when the provider gave none. Rely on result for the outcome.
segmentsintegerHow many SMS segments the text takes: 160 characters per segment (153 each when split) for texts in the GSM alphabet, 70 (67 each when split) when the text has other characters. Each segment uses credit.
noteobjectWhen the text spans several segments or uses characters that shorten them, and where to follow delivery.

Get transactional credits

get_transactional_creditsRead

Show the SMS and transactional email credit: balance in EUR, how many messages it pays for, and whether each channel is in sandbox mode.

Use before a send, when a send says there is no credit left, or when the user asks "how many SMS can I still send" or "how much transactional credit is left". Marketing email credit (campaigns) is a different balance: use get_costs for it.

Returns sms with the credit in EUR, the messages it pays for at the account's price per SMS, that price, and the channel's sandbox state (the credit is the balance SMS sends are charged to, the figure send_test_automation_sms shows; when only this domain's own credit can be read, domain_own_credit is true and a credit shared across the account may be higher); and email with the balance in EUR, the plan it is priced on with its cost and volume, the emails the balance still pays for (derived from the balance and the plan price, so remaining_is_estimate is true), the automatic top-up settings and the sandbox state. A channel in sandbox mode reaches only its sandbox_recipients, the account's own test addresses or numbers. Each channel loads on its own: one that could not be loaded reads {"unavailable": <reason>} while the other still answers.

Parameters
ParameterTypeDescription
domain_idstringTarget domain.
Returns
FieldTypeDescription
smsobjectThe SMS credit and sandbox state. Or {"unavailable": <reason>} when this channel could not be loaded (the other is unaffected).
emailobjectThe transactional email credit, its plan and sandbox state. Or {"unavailable": <reason>} when this channel could not be loaded (the other is unaffected).
noteobjectWhen SMS is not set up, when a channel is in sandbox mode, when a section could not be loaded, and where marketing email credit is.

List transactional messages

list_transactional_messagesRead

List the transactional emails or SMS sent in a period, newest first, with their delivery status and the window's summary numbers, as the Transactional > Emails / SMS pages show them.

Use after send_transactional_email or send_transactional_sms to confirm delivery, to see what bounced or failed, or to answer "did the order confirmation reach this customer" (search by the address or number). Recipients are masked as on the page; for one contact's whole message history across campaigns and automations use get_contact_details(sections=["deliverability"]).

Returns one page of 15 messages with id, time, status, masked recipient and, for emails, sender, subject, opens and a view link, or, for SMS, the text and its cost; the summary (sent, delivered, bounced or failed, with percents) for every message in the window; and total, pages, has_more and the note saying how to get the next page or widen the window. The summary covers the whole window even when search narrows the messages.

Parameters
ParameterTypeDescription
channelenum"email" (default) for transactional emails or "sms" for transactional SMS. One of: email, sms. Default: 'email'.
periodenumThe window: "this_month" (default), "today", "yesterday", "this_week", "last_week", "last_month" or "last_30_days". Ignored when start and end are given. One of: this_month, today, yesterday, this_week, last_week, last_month, last_30_days. Default: 'this_month'.
startstringFirst day of a custom window, YYYY-MM-DD; give end too.
endstringLast day of a custom window, YYYY-MM-DD, inclusive; give start too.
searchstringText to look for: for emails in the recipient, sender and subject; for SMS in the recipient number. Omit to list every message in the window.
pageintegerPage number, starting at 1. Default: 1.
domain_idstringTarget domain.
Returns
FieldTypeDescription
channelstringThe channel listed: 'email' or 'sms'.
windowobjectThe date window that was applied, with the days a named period resolved to.
presetstringThe named period applied (e.g. 'last_30_days'), or 'custom' when start and end were given.
startstringFirst day the figures cover (YYYY-MM-DD), inclusive: the window actually applied, a named period resolved to its dates.
endstringLast day the figures cover (YYYY-MM-DD), inclusive: the window actually applied.
searchobjectThe search text applied; null when none was.
messagesobject[]The messages on this page, newest first.
message_idobjecttheMarketer's id of the message.
channelstring'email' or 'sms'.
sent_atobjectWhen the message was sent, as the page shows it: day/month/year and hour:minute in Romanian time (Europe/Bucharest).
statusobjectDelivery status as the page shows it: for emails 'delivered', 'bounced', 'failed' or 'queued'; for SMS the provider's label such as 'Delivered', 'Sent' or 'Failed'.
recipientobjectThe recipient address or number as the page shows it, masked (e.g. 'an***@example.com') when the account masks personal data.
senderobjectThe From address the email went out with; null for SMS.
subjectobjectThe email subject; null for SMS.
opensobjectHow many times the email was opened; null for SMS.
is_copyobjectTrue when this row is the bcc copy of another email; null for SMS.
contentobjectThe SMS text; null for emails.
cost_eurobjectWhat the SMS cost, in EUR; null for emails.
view_urlobjectLink to view the email as it was sent; null for SMS.
summaryobjectSent, delivered and bounced or failed counts with their percents for every message in the window, whatever search and page are. Or {"unavailable": <reason>} when the summary could not be loaded; the messages are unaffected.
pageintegerPage returned, starting at 1.
per_pageintegerMessages per page, always 15.
totalintegerMessages in the window across all pages.
pagesintegerTotal pages at 15 each.
has_morebooleanTrue when a later page exists; the note names it.
noteobjectWhich page to ask for next, why nothing matched and how to widen the window, and what search matches.

Troubleshooting

The assistant says it is not connected / asks me to authenticate again.
Your session expired or was revoked. Click Connect (or Authenticate) on the connector and sign in again with your theMarketer ID.
Sign-in window never appears.
Allow popups for your assistant's site (claude.ai, chatgpt.com), then retry. In ChatGPT, Developer mode must be enabled and, on Business/Enterprise plans, allowed by your workspace admin.
"Domain not found" or "you do not have access to this domain".
Your theMarketer account has several domains. Ask the assistant to list domains and then name the domain explicitly, or make sure your theMarketer user has access to it.
A tool returns "rate limit exceeded".
Requests are limited per account per minute. Wait a moment and retry, or combine several questions into one.
Access denied / insufficient scope.
Disconnect the connector and connect again; on the consent screen approve the requested read and write scopes.
I want to stop the assistant from accessing my account.
Remove the connector in your assistant's settings. Tokens held by the MCP Server become unusable and expire.

Support

Email support@themarketer.com.

To help us resolve it quickly, include your theMarketer domain, the assistant you use (Claude, ChatGPT, OpenClaw, ...), the approximate time and the exact error message shown. Please do not include passwords or API keys.