Campagne

Stati, audience filter, fan-out asincrono e statistiche.

Le campagne inviano un template a un segmento dell'audience tramite fan-out asincrono. Ogni tenant gestisce le proprie campagne in isolamento.

Scope richiesti: campaigns:read e campaigns:write. Vedi API key e scope.

Stati della campagna

StatoDescrizione
DRAFTBozza; modificabile, invio di prova disponibile
SCHEDULEDProgrammata per data futura
SENDINGFan-out in corso
SENTInvio completato
PAUSEDIn pausa (se supportato dal flusso)
CANCELLEDAnnullata prima o durante l'invio

Endpoint principali

AzioneEndpointScope
CrearePOST /campaignscampaigns:write
ElencareGET /campaignscampaigns:read
Dettaglio + statsGET /campaigns/:idcampaigns:read
ModificarePATCH /campaigns/:idcampaigns:write (solo DRAFT)
Invio di provaPOST /campaigns/:id/testcampaigns:write
ProgrammarePOST /campaigns/:id/schedulecampaigns:write
Inviare oraPOST /campaigns/:id/sendcampaigns:write
AnnullarePOST /campaigns/:id/cancelcampaigns:write
Copertura linguaGET /campaigns/:id/locale-coveragecampaigns:read

Creare una campagna

{
  "name": "Newsletter giugno",
  "templateVersionId": "clx...",
  "subject": "Override opzionale",
  "projectId": "clx...",
  "timezone": "Europe/Rome",
  "audienceFilter": {
    "locale": "it",
    "optIn": true,
    "projectId": "clx..."
  }
}

audienceFilter usa gli stessi criteri di GET /contacts — vedi Contatti e audience.

Fan-out asincrono

L'invio accoda job BullMQ (mc:campaign-dispatch → chunk di CAMPAIGN_CHUNK_SIZE, default 100). La quota mensile viene verificata al dispatch, non alla creazione.

Idempotenza per destinatario: idempotencyKey = campaignId:contactId.

Statistiche

GET /campaigns/:id include stats:

{
  "queued": 0,
  "sent": 1200,
  "delivered": 1180,
  "bounced": 5,
  "opened": 450,
  "clicked": 120,
  "unsub": 3,
  "rejected": 15
}

I rejected includono contatti soppressi o senza consenso.

Prossimi passi