ActiveCampaign
Autonomous marketing
- Category
- Marketing
- Primary Subcategory
- Email & SMS Lifecycle Marketing Automation
Integration details
Description
You already work in ChatGPT. Now drive and track your marketing outcomes there too. Connect ActiveCampaign in a few clicks. From the chat, you can: - Understand yesterday's campaign performance in seconds - Look up a contact and update their information. - Clean up tags, build segments, and organize your lists. - Move deals forward without leaving ChatGPT. - Enroll a contact in automated marketing workflows. No new tab. No copy paste. No starting over. ChatGPT is the surface you ask from. ActiveCampaign takes action.
- Integration type
- Plugin
- Verification status
- Not applicable
- Platform
- ChatGPT
- Primary Subcategory
- Email & SMS Lifecycle Marketing Automation
- Secondary Subcategories
- None listed
- Brand
- ActiveCampaign
- Access
- Account required
- First tracked
- 2026-08-11
- Tool count
- 79
- Geography
- US
The Primary Subcategory used for this profile’s headline score.
Other Subcategories where the Integration is listed.
Get alerts for ActiveCampaign
Get updates when ActiveCampaign’s Discoverability Score or category rank changes.
ChatGPT Plugin Discovery Score
ChatGPT Plugin discovery is coming soon
ChatGPT can surface a Plugin when it matches a user's request.Your Plugin Discovery Score measures how often yours appears.
No spam. Unsubscribe any time.
What discovery looks like

Competing in ChatGPT Email & SMS Lifecycle Marketing Automation
View Category79 tools agents can invoke
Add a contact to an automation. This will start the automation for the specified contact. The contact will begin at the first step of the automation sequence. Parameters ---------- - params: ContactAutomationCreateParams object containing: - contact: The ID of the contact to add to the automation - automation: The ID of the automation to add the contact to
add_contact_to_automation
Use ONLY for 1–9 contacts. For 10+ use bulk_import_contacts. Subscribe, unsubscribe a contact to or form a list, or update their subscription status. This tool allows you to add a contact to a list with a specific status, enabling contact list management and subscription control. Use this to subscribe contacts to lists for email campaigns and marketing automation. Setting status from unsubscribed (2) to active (1) may require additional confirmation. Use status 1 for normal subscription workflows. Status 0 is used for double opt-in processes. The contact and list must already exist in ActiveCampaign.
add_contact_to_list
Use ONLY for 1–9 contacts. For 10+ use bulk_import_contacts. Use this tool only for adding a single tag to a single contact. Add a tag to a contact. Parameters ---------- - params: ContactTagParams object containing: - contact: Required. The ID of the contact. - tag: Required. The ID of the tag to add to the contact.
add_tag_to_contact
Use ONLY for 10+ contacts. For 1–9 contacts, use single-contact tools. Bulk create, update, tag, set fields, add to lists, or any combination for multiple contacts in a single request. Existing contacts are matched by email (or phone when phone-only is enabled); you can mix new and existing contacts in one call. Do NOT add any additional contact fields beyond what the user specified. If any contact has no email, you MUST check whether phone-only contact setting is enabled before calling this tool. If unknown, call is_phone_only_contact_enabled first, then set phone_only_contacts_enabled accordingly. If phone-only is not enabled, you CANNOT import a contact without an email. Ask the user for an email instead. Supported per-contact fields: email, first_name, last_name, phone, customer_acct_name, tags (list of strings, applied/created as needed), custom field values (id + value pairs), subscribe (list of {listid} objects for lists to subscribe the contact to), and unsubscribe (list of {listid} objects for lists to unsubscribe the contact from). An optional callback can be provided to receive async results via webhook. The callback includes a url, requestType (e.g. "POST"), optional detailed_results flag, and optional params/headers key-value pairs to include in the webhook request. Set exclude_automations to True to skip running automations triggered by the import. By default, automations should run on imported contacts.
bulk_import_contacts
Retrieve the status of bulk contact import batches, showing outstanding and recently completed imports. Returns two groups of import batches: - outstanding: imports that are still being processed - recentlyCompleted: imports that have finished processing recently Each entry includes the date the batch was submitted (forDate), the number of batches, and the total number of contacts in those batches.
bulk_import_status_list
Update the owners of multiple deals in a single request. This function allows you to reassign multiple deals to new owners. You can assign different owners to different deals in the same batch. **Required permissions:** User must have permission to manage deals, permission to manage the pipeline each deal belongs to, and permission to reassign deals.
deal_owner_bulk_update
Check if the phone only contact setting is enabled for this ActiveCampaign account. Remember this in current context. Do NOT offer the user to turn it on.
is_phone_only_contacts_enabled
Duplicate an existing drag-and-drop campaign as a new draft. Only campaigns that meet all of these conditions can be copied: - built with the drag-and-drop editor (``ed_version="3"``), - not attached to an automation, and - in a copyable state — a campaign that is currently sending cannot be copied. The copy is created as a draft. Returns the new draft's ``campaign_id`` directly once the copy finishes. If ``campaign_id`` comes back ``null``, the copy is still processing: call ``poll_campaign_generation_status`` with the returned ``request_id`` and wait for a real ``campaign_id`` before treating the copy as done. To also edit the copy, call ``edit_campaign`` on the resulting ``campaign_id`` once it's available. ``edit_campaign`` on the resulting ``campaign_id`` is MANDATORY when the copy was requested with a content change — "like campaign X but for autumn", a different product, season, audience or tone. Copying alone leaves the original content in place; call ``edit_campaign`` with ``content_change=True`` before reporting success. ``update_campaign`` renames the draft and NEVER changes email content, so a rename does not satisfy such a request. For a plain "copy"/"duplicate" with no content change, this tool alone is enough (optionally followed by ``update_campaign`` to rename the draft).
copy_campaign
Create a contact custom field. Always create field options after creating fields of type "dropdown", "listbox", "radio", or "checkbox". Parameters ---------- - params: ContactCustomFieldCreateParams object containing: - field_title: Required. The custom field label (sent to the API as title). - type: Required. The type of field. Valid values: "text", "textarea", "date", "datetime", "dropdown", "listbox", "radio", "checkbox", "hidden". - descript: Optional description of the field. - perstag: Optional personalization tag name. - defval: Optional default value. - visible: Optional. Whether this field is visible in forms (0 or 1). - ordernum: Optional. The order of this field relative to others.
create_contact_custom_field
Associate a contact custom field with a contact list Parameters ---------- - params: ContactFieldRelCreateParams object containing: - relid: Required. The ID of the contact list. - field: Required. The ID of the custom field.
create_contact_field_relationship
Create a contact custom field value. Contact field values can also be set in bulk in the payload to create or update a contact. Parameters ---------- - params: ContactFieldValueCreateOrUpdateParams object containing: - contact: Required. The ID of the contact. - field: Required. The ID of the custom field. - value: Required. The value to store in the field. Format depends on field type: - text/textarea/hidden: Simple string value - dropdown/radio: Exact option value - date: "YYYY-MM-DD" format - datetime: ISO format "YYYY-MM-DDThh:mm:ssZ" - checkbox (multiple): "||Option 1||Option 3||" format - checkbox (single): "||Option 2||" format - useDefaults: Optional. If true, populates missing required fields on the contact record with default values. Defaults to false.
create_contact_field_value
Create a new contact tag Parameters ---------- - params: TagCreateParams object containing: - tag: Required. The name of the tag. - tagType: Optional. The type of tag. Defaults to "contact". Valid values: "contact", "template". - description: Optional. Description of the tag. Defaults to empty string.
create_contact_tag
Create a new custom object schema in an ActiveCampaign account. Defines a new custom object type with fields, relationships, labels, and description. ## When to use - Create a new custom object type to model domain-specific data (e.g. orders, projects, tickets) - Define fields and relationships for a new custom object - Set up a custom object schema before creating records of that type ## When NOT to use - User wants to modify an existing schema — not doable via MCP - User wants to create records within a schema — use create_or_update_custom_object_record - User asks about standard objects (contacts, deals, campaigns) — use the dedicated tools ## Examples - "define a new custom object type called Order with a name field linked to contacts" → params={"schema":{"slug": "order", "labels": {"singular": "Order", "plural": "Orders"}, "description": "Customer orders", "fields": [{"id": "name", "labels": {"singular": "Name", "plural": "Names"}, "type": "text"}], "relationships": [{"id": "primary-contact", "labels": {"singular": "Primary Contact", "plural": "Primary Contacts"}, "namespace": "contacts", "hasMany": false}]}} - "set up a custom object schema for tracking support tickets with a title field linked to contacts" → params={"schema": {"slug": "support-ticket", "labels": {"singular": "Support Ticket", "plural": "Support Tickets"}, "description": "Support tickets", "fields": [{"id": "title", "labels": {"singular": "Title", "plural": "Titles"}, "type": "text", "required": true}], "relationships": [{"id": "primary-contact", "labels": {"singular": "Primary Contact", "plural": "Primary Contacts"}, "namespace": "contacts", "hasMany": false}]}} - "create a new custom object type linked to contacts with a notes field" → params={"schema": {"slug": "my-object", "labels": {"singular": "My Object", "plural": "My Objects"}, "fields": [{"id": "notes", "labels": {"singular": "Note", "plural": "Notes"}, "type": "text"}], "relationships": [{"id": "primary-contact", "labels": {"singular": "Primary Contact", "plural": "Primary Contacts"}, "description": "Primary contact for this object", "namespace": "contacts", "hasMany": false}]}} - "set up a custom object schema for tracking projects with a title field linked to deals" → params={"schema": {"slug": "project", "labels": {"singular": "Project", "plural": "Projects"}, "fields": [{"id": "title", "labels": {"singular": "Title", "plural": "Titles"}, "type": "text"}], "relationships": [{"id": "deal", "labels": {"singular": "Deal", "plural": "Deals"}, "namespace": "deals", "hasMany": false}]}} - "create a custom object type for tracking assets linked to accounts" → params={"schema": {"slug": "asset", "labels": {"singular": "Asset", "plural": "Assets"}, "fields": [{"id": "name", "labels": {"singular": "Name", "plural": "Names"}, "type": "text"}], "relationships": [{"id": "account", "labels": {"singular": "Account", "plural": "Accounts"}, "namespace": "accounts", "hasMany": false}]}} ## Constraints - The slug must be unique across the account and follow kebab-case format. - Field types include: text, textarea, number, currency, date, datetime, dropdown, multiselect. - Number fields require a scale value (decimal places, e.g. 0 for integers, 2 for decimals). - Currency fields require a defaultCurrency value (e.g. "USD", "EUR"). - Dropdown fields require options, each with an id and value (e.g. [{"id": "active", "value": "Active"}]). - At least one field must be defined. If the user has not specified any fields, ask them before proceeding. - labels (singular and plural) are required on the schema, every field, and every relationship. - Relationship namespaces must reference existing object types (e.g. 'contacts', 'accounts', 'deals'). - Exactly one relationship must be specified to link the schema to a primary object (contacts, accounts, or deals). Only one ActiveCampaign object type can be related per schema. - If the user does not specify which object type the schema should relate to, **always ask first** before creating the schema. Do not assume or choose a default — the relationship is a critical decision that must be explicit.
create_custom_object_schema
Create a new deal in ActiveCampaign. A deal represents a sales opportunity that can be tracked through a pipeline. You must associate the deal with either a contact or an account. **Important — owner vs contact:** The ``owner`` and ``contact`` fields refer to completely different entities: - **owner** — an ActiveCampaign *user* (team member / sales rep) responsible for working the deal. This is **not** the customer. Obtain valid user IDs from the ``list_users`` tool or the ``GET /api/3/users`` endpoint. - **contact** — the *customer or lead* the deal is associated with. Obtain valid contact IDs from ``list_contacts`` or ``get_contact``. Do **not** pass a contact ID as the owner; the API will reject it with ``"The provided owner id does not exist."`` **Important:** To create a deal, the user requires permission to manage deals and permission to manage the pipeline the new deal belongs to.
create_deal
Create a new note for a deal in ActiveCampaign. A deal note represents text that can be added to a deal to note important information. **Important:** To create a deal note, the user requires permission to manage deals and permission to manage the pipeline the deal belongs to.
create_deal_note
Create a new deal pipeline (dealGroup) in ActiveCampaign. A pipeline represents a customizable sales process with stages that deals move through. Pipelines allow you to organize and track sales opportunities, automate deal assignment, and manage which users and groups have access to deals. ## Use Cases - Create separate pipelines for different sales processes (e.g., "New Business", "Renewals", "Upsells") - Organize deals by product line, region, or business unit - Set up automated deal assignment with Round Robin or value-based distribution - Control pipeline access by assigning specific user groups ## Pipeline Configuration **Auto-assignment options:** - 0: Disabled - No automatic assignment - 1: Round Robin - Distributes deals evenly among users - 2: Deal values - Assigns based on deal value thresholds **Group management:** - allgroups=1: All user groups can manage this pipeline - allgroups=0: Only specified groups (in dealGroup.groups) can manage **User assignment:** - allusers=1: Auto-assign new deals to all users - allusers=0: Auto-assign only to specified users (in dealGroup.users) ## Important Notes To create a pipeline, the user requires permission to manage deals and permission to create new pipelines in ActiveCampaign.
create_deal_pipeline
Create a new deal stage within a pipeline in ActiveCampaign. A deal stage represents a step in a pipeline that deals can move through. Call list_deal_pipelines first to find the pipeline (group) ID to assign the stage to.
create_deal_stage
Create options for a dropdown, listbox, radio, or checkbox contact custom field Parameters ---------- - params: FieldOptionBulkCreateParams object containing a list of: - field: Required. The ID of the custom field these options belong to. - value: Required. The value of the option. - label: Required. The label to display for the option. - orderid: Required. The order in which to display the option. - isdefault: Optional. Whether this option is selected by default. Defaults to false.
create_field_options
Create a new list in ActiveCampaign. This tool creates a new list for organizing contacts and managing email campaigns. Use this tool to create new lists for organizing contacts. Consider using list_groups() to see available groups if you want to associate the new list with a group for better organization using create_list_group_permission(). Note: For a list to be visible in the ActiveCampaign user interface for non-administrators, it may need to be associated with a user group. The AC API also requires a `stringid` (URL-safe list name), but this is generated automatically from the name if not provided.
create_list
Associate a list with a user group for enhanced organization and visibility. This tool creates a list group permission, which associates a specific list with a user group in ActiveCampaign. This association enables group-based permissions and makes lists visible in the appropriate sections of the ActiveCampaign interface. This is typically used after creating a list to ensure it appears in the correct sections of the ActiveCampaign interface for the appropriate user groups.
create_list_group_permission
Use ONLY for 1–9 contacts. For 10+ use bulk_import_contacts. Use this tool only for a single create or single update. **IMPORTANT — phone-only contacts:** If the contact has no email but has a phone number, first check context if phone-only contact setting is enabled. If unknown, call is_phone_only_contact_enabled first. If it's not enabled, you CANNOT create a contact with only a phone number. Ask the user for an email. Create or update a contact, using the email or phone (if phone-only contact setting is enabled) as the unique identifier (upsert). fieldValues fieldIds can be found or created by using the list_contact_custom_fields and create_contact_custom_field tools. Always try to find a similar field name or perstag to the one you want to create, even if it isn't exactly the same. Stop and prompt the user if you can't find it to ask if they want to create a new field.
create_or_update_contact
Create or update a single record in a custom object schema. If ``record.externalId`` matches an existing record it is updated; otherwise a new record is created with that externalId. If ``record.id`` matches an existing record it is updated; if it does not match, it is ignored and a new record is created with a generated id. ## When to use - Create a new custom object record with field values and relationships - Update an existing record by its ``externalId`` or ``id`` - Create or update a record using your own ``externalId`` as the match key ## When NOT to use - User wants to list records — use list_custom_object_records - User wants to list or create custom object schemas — use list_custom_object_schemas / create_custom_object_schema - User asks about standard objects (contacts, deals, campaigns) — use the dedicated tools ## Examples - "create an order record with order number ORD-001" → schema_id="order-schema-id", record={"fields": [{"id": "order-number", "value": "ORD-001"}]} - "create a record with name test linked to contact 42" → schema_id="order-schema-id", record={"fields": [{"id": "name", "value": "Test"}], "relationships": {"primary-contact": [42]}} - "create a project record named Website Redesign linked to deal 2" → schema_id="project-schema-id", record={"fields": [{"id": "title", "value": "Website Redesign"}], "relationships": {"deal": [2]}} - "create an asset record linked to account 15" → schema_id="asset-schema-id", record={"fields": [{"id": "name", "value": "Server Rack"}], "relationships": {"account": [15]}} - "update record ext-001 to set total to 200" → schema_id="order-schema-id", record={"externalId": "ext-001", "fields": [{"id": "total-amount", "value": 200}]} ## Constraints - ``schema_id`` is required. ``record.fields`` defaults to empty if omitted. - The schema_id can be either the schema UUID or its slug. If the user mentions a schema by name (e.g., "vendor record", "asset record"), infer the slug from that name and use it directly — do not call list_custom_object_schemas to look it up. - If the schema is not found, do not assume or try similar schema names (e.g., trying "vendor2" if "vendor" fails). Instead, ask the user to clarify which schema they meant or provide the correct schema ID/slug. - Fields must reference valid field slugs defined in the target schema. - Multiselect fields require a list of option display values as the value (e.g. ``["Option 1", "Option 3"]``). - Every schema has exactly one relationship defined (to either contacts, accounts, or deals). If the user does not specify relationships, ask them which entity (contact ID, account ID, or deal ID) the record should be linked to based on the schema's relationship type. - Relationship keys must match the relationship ID defined in the schema (e.g. 'primary-contact', 'deal', 'account'). - Prefer ``externalId`` over ``id`` — it is the recommended match key and makes future updates easier. - Providing ``id`` does not guarantee an update: if no record with that id exists, a new record is created.
create_or_update_custom_object_record
Apply AI-driven edits to an existing campaign. THE route whenever the change touches the campaign as a whole or its body copy: "make it more urgent", "rewrite it for autumn", "make the tone friendlier", "shorten the copy". Set ``content_change=True`` for those. NEVER satisfy such a request through ``get_campaign_messages`` plus ``update_campaign_message``: writing new header fields yourself leaves the email body unchanged, so the campaign still reads in the old tone while the reply claims success. ``update_campaign`` renames only and never changes content. A change scoped to the subject line, preheader or sender alone is different: this tool and ``get_campaign_messages`` + ``update_campaign_message`` are both correct there, since neither touches the body. Routes automatically — no routing choice needed: AI-generated campaigns use the layout update endpoint; all others use the XML edit endpoint. Returns the updated campaign data directly when possible. If the response has only ``campaign_id`` and ``request_id`` — no ``subject``/``title``/etc. — the edit is still processing: call ``poll_campaign_generation_status`` with ``request_id`` and wait for the full result before telling the user the edit is done. WORKFLOW: 1. If swapping images, call ``search_content_manager_images`` first and pass URLs as ``images``. 2. Set the change flags (``content_change``, ``subject_change``, etc.) that match the edit intent. 3. Call this tool. Images are only applied on the layout path (AI-generated campaigns).
edit_campaign
Create a new AI-generated email campaign from a text prompt. Do not call until the user has confirmed both which images to include (L1) and which brand kit to apply (L2) on the layout path. Ask both in one message and wait; picking either on the user's behalf is wrong even when generation succeeds. They are the ONLY questions ever asked. Everything the generator produces itself — the campaign name, subject, headline, body copy, offer, discount, dates, urgency, tone, CTA — is NEVER asked about, however sparse the prompt: "Create a campaign about our summer sale." is already complete. The moment images and brand kit are known the next action is this call — exactly once, never another question, and never ``update_campaign`` afterwards: this tool names the campaign itself. NEVER retry after this tool has been called — generation is not idempotent and a repeat call can create a duplicate campaign. On any failure, surface it and tell the user to check ActiveCampaign before starting another generation. NOT for copy or edit workflows — use ``copy_campaign`` or ``edit_campaign``. This tool rejects the edit arguments ``content_change``, ``subject_change`` and ``preheader_change``: those belong to ``edit_campaign``. ACCOUNT CONTEXT — never browse for it: Do NOT call ``list_contacts``, ``list_campaigns``, or ``list_lists`` to gather background context for generation — those tools render full interactive apps. When past campaigns or audience details genuinely affect the request, call ``get_campaign_generation_context`` instead. Use the interactive list tools only when the user asked to browse data or must make a visible selection. ROUTE FIRST — before any other action: - User wants to copy, duplicate, or clone an existing campaign **unchanged** → ``copy_campaign`` (pass source campaign ID as ``(past campaign id: NUMBER)``). A bare ``copy_campaign`` is correct only for "copy"/"duplicate"/"clone" with no qualifier beyond a new name. - User wants a campaign "like"/"similar to"/"based on" an existing one **with any change of topic, tone, season, product or audience** (e.g. "like my Summer Sale campaign but for autumn") → this is NOT a bare copy. Either call this tool for a fresh campaign, or call ``copy_campaign`` and then ``edit_campaign`` on the returned ``campaign_id`` with ``content_change=True`` to rewrite the copy for the new topic. ``update_campaign`` only renames — a rename never satisfies a content change, and reporting success after renaming alone is wrong. - User wants to edit/update an existing campaign → ``edit_campaign``. - User picks or names a specific template → **TEMPLATE PATH** (go to T1). - All other "create new" requests → **LAYOUT PATH** (go to L1). LAYOUT PATH — complete all three steps, confirm each with user, then call: L1. IMAGES (REQUIRED — never skip for layout creation): Call ``search_content_manager_images`` with a keyword from the campaign topic. Present image names and thumbnails; ask user which to include (max 7). Zero results → call again with ``query=""`` ``limit=10``; show recent uploads; ask. Duplicate filenames → STOP; show each as ``[filename](url) (added date)``; end with "Please select which image you'd like to use."; wait for the selection. Position: ``"main"`` = hero slot, ``"random"`` = engine places it. Nothing else. L2. BRAND KIT (REQUIRED — always fetch, always confirm): Call ``list_brand_kits``; present every kit, recommend the ``is_primary=True`` one and ask the user to confirm. Pass the confirmed ``uuid`` as ``brand_kit_id``. L3. URL CLASSIFICATION (automatic — only intervene on ambiguity): Pass the user's prompt verbatim — URL detection is automatic from prompt content. If user provides ONLY a URL with no other context → ask: "Should I write the email based on this page's content, or use this link for the button?" Content URL (product page, article, landing page to pull copy from) → call ``summarize_url``; pass returned ``summarization_uuid`` to this tool. CTA-only URL (button destination, no content to extract) → pass directly as ``cta_url``; skip ``summarize_url``. No URL in prompt → skip this step. L4. TONE (never ask): pass ``tone`` only when the user named one verbatim (e.g. ``"professional"``, ``"casual"``, ``"urgent"``); otherwise omit it. TEMPLATE PATH — complete all steps, confirm each with user, then call: T1. TEMPLATES (REQUIRED — list before calling): Call ``list_campaign_templates``. Present template names; ask which to use and wait — never call before that answer. Pass the chosen ``id`` as ``template_id``. NEVER pass ``brand_kit_id`` on this path — template design takes precedence. If user asks to apply a full brand kit on the template path, refuse: brand kit application is not supported on the template path. NEVER pass ``tone`` on this path either — the from-template endpoint doesn't support tone validation; it is silently dropped if provided. T2. IMAGES (optional — only if user asks): Call ``search_content_manager_images`` only when user explicitly mentions images. Same zero-results fallback and dedup rules as L1 apply. Position can be any freeform label the user provides (verbatim). CALL — as soon as the applicable steps above are confirmed; any further question instead of this call is a defect: Call this tool ONCE per request, with all gathered inputs. A later message that merely confirms a choice already acted on is not a second campaign — never generate twice for one request. Pass user's exact words as ``prompt`` — NEVER rephrase, rewrite, or expand. ``summarization_uuid`` is REQUIRED whenever ``summarize_url`` was called earlier in this conversation: pass the ``summarization_uuid`` it returned verbatim. Without it the summarization is discarded and the campaign is written from the summary text instead of the scraped page. ``images`` must carry the ``url`` values from ``search_content_manager_images``. When the user names an image by file name (e.g. ``"beach-summer.jpg"``), look that name up in the earlier search result and pass its ``url`` — a bare file name is rejected. Returns a ``request_id`` immediately without waiting for generation to finish. A campaign app UI polls ``poll_campaign_generation_status`` with it to drive a live progress bar — do NOT poll yourself then. With no app UI, poll it yourself until ``status`` is ``success`` and present the campaign.
generate_campaign
Retrieve a single campaign by ID.
get_campaign
Retrieve uncompiled editor HTML and CSS for a campaign message. For MCP Apps campaign preview: returns the Stripo editor markup (``html`` + ``css``) so the UI can compose a browser preview that preserves ``@media`` rules. Prefer this over the compiled message body for preview.
get_campaign_editor_markup
Report which email clients a campaign's recipients used. Each entry pairs a client name with the number of unique contacts counted under it. ``source="open"`` is the narrower set: for the same campaign its counts never exceed those of ``source="all"``. Neither is a count of everyone the campaign was sent to — a campaign sent to 958 contacts with 4 recorded opens reports 5 contacts here. ## When to use - User asks which email clients, apps, or devices opened a campaign - User wants an email-client or device breakdown for one campaign - User asks how many contacts read a campaign in a named client ## When NOT to use - Campaign performance metrics (sends, opens, clicks, bounces, and their rates) — use run_nrx_report - Geography, clicked links, or per-subscriber engagement — use run_nrx_report - Email clients across several campaigns at once — this reports ONE campaign; call it per campaign rather than expecting an account-wide total - Campaign records without metrics (name, status, schedule) — use list_campaigns ## Examples - "which email clients opened campaign 21?" → params={"campaign_id": 21, "source": "open"} - "email client breakdown for campaign 86211" → params={"campaign_id": 86211} - "include everything recorded for campaign 21, not just opens" → params={"campaign_id": 21, "source": "all"} - "what email apps did people use for my July Newsletter?" → resolve the campaign id with list_campaigns first, then params={"campaign_id": <id>, "source": "open"} ## Constraints - ``campaign_id`` is required and numeric. If the user names a campaign instead, resolve the id with list_campaigns first — do not guess it. - ``source`` accepts only "all" or "open". It defaults to "all"; prefer "open" when the user's question is specifically about opens. - Returns the campaign's full set of clients. There is no pagination and no way to filter, sort, or limit the result — do not offer those. - Entries arrive ordered by ``uniqueContacts`` descending, so the first is the most used client. - Client names come from recipient user agents and are free-form: some carry a version, some name a browser or HTTP library rather than a mail client, and opens that could not be attributed are reported under an empty name. Report them as given rather than reinterpreting, renaming, or dropping them — the unattributed group is frequently the largest. - An empty ``emailClients`` list means the campaign has no email-client data for that source. That is a valid answer, not an error, and not a reason to retry or to switch source. - Counts here do not reconcile with the send or open totals on the campaign record; do not present one as a check on the other, and never describe these counts as a share of the campaign's recipients.
get_campaign_email_clients
Fetch compact account context for campaign-generation decisions. Returns summaries only — recent campaign records and contact-list audience records — never full contact data. Renders no UI component, so it is safe to call as background preparation during a campaign-generation conversation. ## When to use - Past campaigns or audience details genuinely affect a requested campaign (e.g. matching an existing campaign's naming, or checking which lists exist) - Background account inspection while preparing ``generate_campaign`` inputs ## When NOT to use - User asked to browse contacts, campaigns, or lists — use ``list_contacts``, ``list_campaigns``, or ``list_lists`` so the interactive app renders - User must make a visible selection from account data — same interactive tools - The requested campaign needs no account context — skip context entirely ## Constraints - Request only the categories you need via ``include``. - A category that fails to load is reported in ``unavailable`` and never blocks the other categories.
get_campaign_generation_context
Retrieve links associated with a campaign from ActiveCampaign. Parameters ---------- - campaign_id: The ID of the campaign to retrieve links for
get_campaign_links
Retrieve messages for a campaign. Returns each message's ``subject``, ``preheader_text``, ``fromname``, and ``fromemail``. Pass ``include_body=True`` or ``include_text=True`` to also fetch the HTML or plain text content when you need to read or edit it. Use to inspect current message content or to obtain ``message_id`` before calling ``update_campaign_message``.
get_campaign_messages
Retrieve a single contact by ID.
get_contact
Retrieve a specific contact automation record by ID. This provides detailed information about a specific automation run for a contact, including status, progress, completion details, and timing information. Parameters ---------- - contact_automation_id: The ID of the contact automation record to retrieve
get_contact_automation
Get a contact custom field by ID Parameters ---------- - field_id: The ID of the custom field to retrieve
get_contact_custom_field
Get a contact custom field value by ID Parameters ---------- - field_value_id: The ID of the field value to retrieve
get_contact_field_value
Get all custom field values for a specific contact.
get_contact_field_values
Get all list memberships for a specific contact.
get_contact_list_memberships
Retrieve all score values for a specific contact id. Returns a list of scoreValue objects representing each scoring rule applied to the contact and the resulting numeric score value.
get_contact_score_values
Get all tags assigned to a specific contact by ID or email (not both). By email: returns full tag objects (name, description, subscriber count) alongside contactTag records. By contact_id: returns contactTag records with tag ID only.
get_contact_tags
Retrieve a single deal by ID. Note: if the user lacks pipeline permission, returns id/title/isDisabled=true only.
get_deal
Retrieve a deal pipeline (dealGroup) by ID from ActiveCampaign. Returns the full pipeline configuration including title, currency, stages, auto-assignment settings, and associated users and groups.
get_deal_pipeline
Retrieve a single deal stage by ID from ActiveCampaign.
get_deal_stage
Retrieve a single list by ID from ActiveCampaign. This tool fetches detailed information about a specific list, including all configuration settings, tracking options, and metadata.
get_list
Return the ActiveCampaign profile represented by this request's authenticated credentials. The opaque id is unique within this app and remains unchanged across token refresh, reconnection, and display-metadata changes. This identifies the connected account only; it returns no contact, deal, campaign or list data, so never call it to answer a question about those.
get_profile
Get a tag by ID Parameters ---------- - tag_id: The ID of the tag to retrieve
get_tag
Retrieve top contacts by legacy cumulative activity. Use this tool for "top contacts" or "most active contacts." The API supplies a legacy cumulative activity ordering; it is neither recency nor configured contact score. Filtering and date bounds are unsupported. Do not use this tool for "most engaged," date-bounded engagement, or campaign engagement requests. Reject those requests without calling this tool.
get_top_contacts
List automations from ActiveCampaign with filtering and pagination. Automation records include basic metadata. With enhance=true, records also include block definitions, goals, linked campaigns, contact counts, and labels. Filtering and sorting BY completion rate or active-contact count is NOT supported. ## When to use - User asks to browse, view, or list automations - User needs automations filtered by name, status, tag, trigger type, or label - User wants automations sorted by entry count (contacts who entered) Tip: to see which contacts are active in ONE specific automation, call list_contact_automations with filters.seriesid=<id> and filters.status=1. ## When NOT to use - User asks for completion rate, active-contact percentage, or asks to SORT/RANK automations by those metrics (e.g., "automation with highest completion rate") — REJECT without calling this tool. Suggest: "I can show automations sorted by total entries [entered] or filtered by name — want that?" - User asks to filter by completion rate, active-contact count, or any property not in Supported filters — REJECT. State: filters support filters.name, filters.status, filters.ids, filters.tag, filters.triggers, filters.actions, filters.label_name, label (folder ID), search, active, has_message. - User asks to sort by a field not in Supported sort fields — REJECT. State: sort supports name, status, entered, cdate, mdate, revisions. - You already called this tool this turn — REJECT a second call. State the limitation. Do NOT retry with different params to explore. ## Supported filters (exhaustive) - filters.name: partial match on automation name - filters.status: 1=active, 2=inactive - filters.ids: comma-separated automation IDs - filters.tag: tag ID - filters.triggers: comma-separated trigger types - filters.actions: comma-separated action block types - filters.label_name: by label name - label: folder/label ID (integer) - search: partial name match - active: true=active only, false=inactive only - has_message: boolean flag ## Supported sort fields name, status, entered (contacts-entered count), cdate, mdate, revisions ## Examples — SUPPORTED - "Active automations" → active=true - "Automations named 'welcome'" → filters.name="welcome" - "Most-entered automations" → orders={"entered": "DESC"} - "Automations with tag 42" → filters.tag=42 - "Automations sorted by creation date" → orders={"cdate": "DESC"} - "Automation details with counts and blocks" → enhance=true ## Examples — UNSUPPORTED (REJECT) - "Automations with completion rate above 50%" — completion rate is not a filter - "Automations with more than 100 active contacts" — active-contact count is not a filter
list_automations
List available brand kits for the account. Returns each kit's UUID, name, and primary flag. Pass the ``uuid`` as ``brand_kit_id`` to ``generate_campaign`` or ``edit_campaign``. :return: Dict with ``brand_kits`` list.
list_brand_kits
Search user-created email templates by name or list recent ones. Returns template objects keyed by ID under ``data.results``. Pass a returned ``id`` (integer) to ``generate_campaign`` as ``template_id`` to create a campaign based on that template. Call with an empty ``query`` (the default) to list the most recently modified templates. Pass a partial name to filter — e.g. ``"summer"`` returns all templates whose name contains that string.
list_campaign_templates
List campaigns from ActiveCampaign with filtering and pagination. Campaign records include performance data per campaign (opens, uniqueopens, linkclicks, uniquelinkclicks, hardbounces, softbounces, unsubscribes). Filtering and sorting BY those values is NOT supported. ## When to use - User asks to browse, view, or list email/SMS campaigns - User needs campaigns filtered by status, type, name, list, or automation flag - User wants performance data for a set of campaigns (returned per record) ## When NOT to use - User asks for the BEST/WORST campaign or asks to SORT/FILTER by open rate, click rate, or any performance metric — REJECT without calling this tool. Performance data is in records but cannot be used to filter or sort. Suggest: "I can show your completed campaigns sorted by send date — want that?" - User asks to FILTER by open rate, click rate, revenue, or any performance threshold — REJECT. State: filters support status, type, name, list_id, seriesid, label_name, has_message, has_message_content, has_form, excludeTypes. No performance-metric filter. - User asks to SORT by open rate, click rate, or any field not in Supported sort fields — REJECT. State: sort supports sdate, mdate, ldate, status. - You already called this tool this turn — REJECT a second call. State the limitation. Do NOT retry with different params to explore. ## Supported filters (exhaustive) - status: "drafts"/"scheduled"/"currently-sending"/"paused"/"stopped"/"complete"/ "disabled"/"pending-review"/"determining-winner" - filters.type: "single"/"recurring"/"split"/"responder"/"reminder"/"special"/ "activerss"/"text" - filters.name: partial match on campaign name - filters.list_id: by list ID - filters.seriesid: by automation/series ID - filters.label_name: by label - filters.automation: boolean flag - has_message, has_message_content, has_form: boolean flags - excludeTypes: comma-separated campaign types to exclude ## Supported sort fields sdate (scheduled date), mdate (modified date), ldate (last-sent date), status ## Examples — SUPPORTED - "Scheduled campaigns" → status="scheduled" - "Completed email campaigns" → status="complete", filters.type="single" - "Campaigns named 'summer'" → filters.name="summer" - "Most recently sent campaigns" → orders={"ldate": "DESC"} ## Examples — UNSUPPORTED (REJECT) - "Best-performing campaign" — no sort field for opens, clicks, or any metric - "Campaigns with open rate above 30%" — open rate threshold is not a filter
list_campaigns
List activities for a specific contact. Returns a chronological log of actions and events associated with a contact, such as email interactions, list subscriptions, automation steps, deal tasks, SMS messages, link clicks, and eCommerce order events. A contact ID is required. This endpoint does not support multiple contact IDs in a single call.
list_contact_activities
How do I improve a ChatGPT Plugin's discoverability?
The levers are the listing surface agents actually read: names, descriptions, keywords, tool metadata, and registry health. Which lever matters depends on where discovery breaks, which is what continuous measurement shows.
What are ActiveCampaign alternatives on ChatGPT?
As of 2026-09-26, ActiveCampaign competes with Aivie, AWeber, beehiiv, Bizgo, Brevo, Conversion, Customer.io, Flodesk, Intuit Mailchimp, Kanal, Klaviyo, Knock, L Message(エルメ), Life Analytics Mail, Loops, magnews, MailerLite, Mailrith, MailSenpai, Nitrosend - AI Native Email, Notifly, Omnisend, OneSignal, Resend, SAMWAD, Sendly, Sent, Spoki, subscline, Systeme.io, Textmagic, TrueDialog, VerticalResponse, Yournotify in ChatGPT Email & SMS Lifecycle Marketing Automation, ranked by public Discoverability Score.
Where is this profile measured?
This profile uses the geography attached to the latest public registry snapshot: US. Locale tags are intentionally omitted.