Migration Guide: /messages → /campaign/full (Active Campaign Growth API) July 06, 2026 11:54 Updated Overview of the two approaches Main conceptual differences Practical example Mapping of template component types to messageParams keys Fields without equivalent Optional campaign fields Response structure Migration checklist Supporting documentation This document describes how to migrate sending WhatsApp template messages from the LIME endpoint /messages to the Active Campaign Growth API using the /campaign/full endpoint. Overview of the Two Approaches Aspect /messages (direct) /campaign/full (Active Campaign) HTTP Endpoint POST .../messages POST .../commands LIME Primitive Message Command (method: set) Destination User identity (5592...@wa.gw.msging.net) postmaster@activecampaign.msging.net Content-Type application/json application/vnd.iris.activecampaign.full-campaign+json Template Structure Complete WhatsApp components tree Template name + named parameters Flow Redirection No Optional (flowId / stateId) Tracking / Reporting None Full campaign report, status per recipient Scheduling No Yes (scheduled) Campaign Type — Always Individual in this scenario Audit None Campaign stored with status per recipient Main Conceptual Differences1. HTTP Endpoint and Protocol PrimitiveThis is the most important difference between the two approaches.Before (/messages) — the payload is a LIME message sent to the /messages endpoint:POST https://{{contract.id}}.http.msging.net/messages HTTP/1.1 Content-Type: application/json Authorization: Key {YOUR_TOKEN}After (/campaign/full) — the payload is a LIME command sent to the /commands endpoint:POST https://{{contract_id}}.http.msging.net/commands HTTP/1.1 Content-Type: application/json Authorization: Key {YOUR_TOKEN}In the LIME protocol, messages are used for direct content exchange between the bot and an end user. Commands are used to interact with platform extensions and services, such as Active Campaign. Therefore, besides changing the destination address, the entire envelope structure changes: the content field is replaced by method, uri, and resource fields.2. Template StructureThe second major difference is how template parameters are expressed.Before (/messages) — complete WhatsApp components tree:{ "type": "template", "template": { "language": { "policy": "deterministic", "code": "pt_BR" }, "name": "dia_do_doce_v11", "components": [ { "type": "header", "parameters": [ { "type": "image", "image": { "link": "https://example.com/image.jpg" } } ] } ] } }After (/campaign/full) — template name + named parameters:"message": { "messageTemplate": "dia_do_doce_v11", "messageTemplateLanguage": "pt_BR", "messageParams": ["image"], "channelType": "WhatsApp" }The Active Campaign service internally reconstructs the WhatsApp components tree from the template metadata and the values provided in audience.messageParams. It is no longer necessary to describe the component structure.3. Parameter BindingIn the /messages approach, the values of the parameters are embedded directly in the components tree. In /campaign/full, the values are provided separately per recipient in the audience.messageParams object (a key → value dictionary), while message.messageParams carries only the list of key names (the schema), used to validate that each recipient has the necessary values. What Previous Location New Location Template name content.template.name message.messageTemplate Language code content.template.language.code message.messageTemplateLanguage Header image URL components[header].parameters[].image.link audience.messageParams["image"] Body text variables components[body].parameters[].text audience.messageParams["1"], ["2"], … Dynamic button URL suffix components[button].parameters[].text audience.messageParams["url_suffix"] Recipient phone number to field (number@wa.gw.msging.net) audience.recipient (E.164 format) Practical ExampleBefore — sending via /messagesPOST https://{{contract.id}}.http.msging.net/messages HTTP/1.1 Content-Type: application/json Authorization: Key {YOUR_TOKEN} { "id": "activecampaign:335924e6-6831-4ddf-b400-2296cf6c94cc", "to": "5592994397150@wa.gw.msging.net", "type": "application/json", "content": { "type": "template", "template": { "language": { "policy": "deterministic", "code": "pt_BR" }, "name": "dia_do_doce_v11", "components": [ { "type": "header", "parameters": [ { "type": "image", "image": { "link": "https://www.iped.com.br/_upload/galleries/2015/05/19/organizao-pblica-555b72de0abc9.jpg" } } ] } ] } } }Characteristics: Direct message, no campaign record is created. No redirection to bot flow. No delivery tracking. Template language pt_BR with deterministic policy. After — sending via /campaign/fullPOST https://{{contract_id}}.http.msging.net/commands HTTP/1.1 Content-Type: application/json Authorization: Key {YOUR_TOKEN} { "id": "{{$guid}}", "to": "postmaster@activecampaign.msging.net", "method": "set", "uri": "/campaign/full", "type": "application/vnd.iris.activecampaign.full-campaign+json", "resource": { "campaign": { "name": "Dia do Doce - individual", "campaignType": "Individual", "channelType": "WhatsApp", "sourceApplication": "MyApp" }, "audience": { "recipient": "+5592994397150", "messageParams": { "image": "https://www.iped.com.br/_upload/galleries/2015/05/19/organizao-pblica-555b72de0abc9.jpg" } }, "message": { "messageTemplate": "dia_do_doce_v11", "messageTemplateLanguage": "pt_BR", "messageParams": ["image"], "channelType": "WhatsApp" } } }Notable changes: HTTP Endpoint changed from .../messages to .../commands. to changed to postmaster@activecampaign.msging.net. Added method: "set" and uri: "/campaign/full" — mandatory in LIME commands. The content with the components tree was removed; instead, campaign, audience, and message are inside resource. The image URL was moved to audience.messageParams["image"]. The recipient phone number was moved to audience.recipient in E.164 format (with country code, without the @wa.gw.msging.net suffix). flowId / stateId are intentionally omitted — the message is sent without redirecting the user to any bot flow. campaignType is always Individual in this scenario (sending to a single recipient per call). Important: message.messageParams is an array of key names (strings), not values. It defines which keys from audience.messageParams will be used as template parameters. The Active Campaign service uses this list to validate that the recipient has all necessary values before sending. Mapping Template Component Types to messageParams KeysWhen the template has multiple component types, all parameter values are flattened into the audience.messageParams dictionary. Use descriptive names for the keys; the service maps them in the order declared within each component type. Component Type Meta Parameter Type Suggested Key Name Example Value Header – image image "image" "https://cdn.example.com/banner.jpg" Header – video video "video" "https://cdn.example.com/video.mp4" Header – document document "document" "https://cdn.example.com/file.pdf" Body – text variable {{1}} text "1" or any label "John" Body – text variable {{2}} text "2" or any label "Premium" Button – dynamic URL suffix text "url_suffix" "/promo/XYZ123" Key names are free-form, as long as they are consistent between audience.messageParams (values) and message.messageParams (schema). The order in message.messageParams must match the order of parameters in the template registered with Meta. Fields Without EquivalentThe following fields from the /messages approach have no equivalent in /campaign/full because they are handled automatically or do not apply: Old Field Reason for Absence content.template.language.policy Always deterministic — not configurable via Active Campaign id with activecampaign: prefix The campaign service generates its own correlation IDs to with @wa.gw.msging.net suffix Replaced by audience.recipient in E.164 format Optional Campaign FieldsThese fields are absent in the minimal example above but are available for enrichment: Field Where Purpose flowId + stateId campaign Redirects the user to a specific bot state upon reply masterState campaign Required when using router bot architecture scheduled campaign Schedules the send for a future date/time (yyyy-MM-dd hh:mm) tags campaign Arbitrary labels to filter/group campaigns contextVariables audience Variables saved in the contact context (accessible as {{variableName}} in flows) Response StructureOn success, the service responds with a Campaign document:{ "type": "application/vnd.iris.activecampaign.campaign+json", "resource": { "id": "37162f14-2d45-...", "name": "Dia do Doce - individual", "campaignType": "INDIVIDUAL", "status": "processing", "created": "2026-07-02T14:00:00.000Z" }, "method": "set", "status": "success" }Use the returned id to query status, audience details, and delivery reports:GET /campaigns/{id}/reportsGET /audiences/{id}GET /campaigns/summaries Migration Checklist Change the HTTP endpoint from .../messages to .../commands Change the to from user identity to postmaster@activecampaign.msging.net Change the envelope type to application/vnd.iris.activecampaign.full-campaign+json Add method: "set" and uri: "/campaign/full" Move the template name to message.messageTemplate Move the language code to message.messageTemplateLanguage (required if different from pt_BR) Convert component parameter values into a flat dictionary in audience.messageParams List the key names in message.messageParams (array, same order as template parameters registered with Meta) Convert the recipient from number@wa.gw.msging.net to E.164 format (e.g., +5592994397150) Set campaign.campaignType to Individual Omit flowId / stateId if no redirection to bot flow is desired Use messageTemplate, not messageContent, for WhatsApp Supporting Documentation How to Send Notifications via Active Campaign API (Growth) — Blip Help WhatsApp Utility Templates (Meta for Developers) WhatsApp Marketing Messages (Meta for Developers) Blip Docs — Sending Messages Blip Docs — Individual Campaign Need more help? Explore our content at Blip Academy or Blip Community, watch tutorials on our YouTube channel or ask your questions in our support channel 😃 Related articles How to Generate Payments on WhatsApp in Blip Go