> ## Documentation Index
> Fetch the complete documentation index at: https://docs.contactship.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Message campaigns

> Prepare a WhatsApp campaign with a template, recipients, and follow-up.

export const Availability = ({lang = 'es', plan, addon, permission, route, status}) => {
  const L = lang === 'en' ? {
    plan: 'Plan',
    addon: 'Add-on',
    permission: 'Permission',
    route: 'Where',
    status: 'Status',
    addonNote: 'enabled on request',
    allPlans: 'All plans',
    beta: 'Beta',
    nuevo: 'New',
    soon: 'Coming soon'
  } : {
    plan: 'Plan',
    addon: 'Add-on',
    permission: 'Permiso',
    route: 'Dónde',
    status: 'Estado',
    addonNote: 'se activa a pedido',
    allPlans: 'Todos los planes',
    beta: 'Beta',
    nuevo: 'Nuevo',
    soon: 'Próximamente'
  };
  const items = [];
  if (plan) items.push([L.plan, plan]);
  if (addon) items.push([L.addon, `${addon} · ${L.addonNote}`]);
  if (permission) items.push([L.permission, permission]);
  if (route) items.push([L.route, route]);
  if (status) items.push([L.status, L[status] || status]);
  return <div style={{
    display: 'flex',
    flexWrap: 'wrap',
    gap: '6px 22px',
    padding: '12px 16px',
    margin: '4px 0 24px',
    border: '1px solid rgba(2, 82, 255, 0.28)',
    borderLeft: '3px solid #0252ff',
    borderRadius: '8px',
    background: 'rgba(2, 82, 255, 0.05)',
    fontSize: '13.5px',
    lineHeight: '1.5'
  }}>
      {items.map(([k, v]) => <div key={k} style={{
    display: 'flex',
    gap: '6px',
    alignItems: 'baseline'
  }}>
          <span style={{
    fontSize: '10.5px',
    fontWeight: 600,
    letterSpacing: '0.07em',
    textTransform: 'uppercase',
    opacity: 0.65
  }}>{k}</span>
          <span style={{
    fontWeight: 500
  }}>{v}</span>
        </div>)}
    </div>;
};

<Availability lang="en" route="Campaigns → Messages" permission="campaigns.read / campaigns.create" />

Message campaigns send a template through a WhatsApp channel. You need a connected channel, an approved template, and recipients appropriate for the message.

## Prepare and publish

1. Create a message campaign and enter its name, description, and channel.
2. Choose a date or the immediate-start option shown in the form. Publishing begins preparation; do not assume every message is sent at that instant.
3. Add contacts from a CSV or the contact picker. Review column mappings and phone numbers.
4. Select a channel template and fill its variables. Use the preview to check that recipient data is neither missing nor misplaced.
5. Review the recipient count and publish. This authorizes real messages.

## States and results

Campaign states include `DRAFT`, `UPLOADING_CONTACTS`, `PUBLISHED`, `ACTIVE`, `PAUSED`, and `COMPLETED`. Wait for contact upload to finish before interpreting the total.

The detail view shows **sent**, **delivered**, **read**, **replied**, and **failed** counts. These are different stages: sent does not prove delivery, and delivery does not prove reading or a reply. Inspect each recipient’s status and error when investigating failures.

Response analysis helps review outcomes and prepare a follow-up campaign when that option is available. Always inspect its recipients and template before publishing; it should not be treated as an unchecked automatic continuation.

## Handle failures

Read the WhatsApp error code and message in the detail view. Check the current template status, channel connection, recipient data, and variables. Avoid republishing the entire campaign to fix one recipient: you could repeat messages already delivered.

## Frequently asked questions

<AccordionGroup>
  <Accordion title="Can I send free-form campaign text?">
    This flow uses channel templates. Prepare and obtain approval for the template before publishing.
  </Accordion>

  <Accordion title="Does pausing remove sent messages?">
    No. Review recorded results and the current state before resuming.
  </Accordion>

  <Accordion title="Does completed mean everyone read the message?">
    No. Review delivery, read, and reply metrics separately.
  </Accordion>
</AccordionGroup>

## See also

* [Templates](/en/messages/templates)
* [Inbox](/en/messages/inbox)
