---
title: "Activity on an advanced (multichannel) campaign"
method: POST
path: "advancedCampaignActivity"
tags: ["Webhooks"]
---

# Activity on an advanced (multichannel) campaign

`POST advancedCampaignActivity` (webhook)

Sent to URLs registered with `type: advanced`.

- `EMAIL_SENT`: email step sent (the documented name `MAIL_SENT` never fires).
- `OPENED`, `CLICKED`, `UNSUBSCRIBED`: same tracking rules as legacy email, delivered 30 to 60 seconds later; contact without `id`, no `sender`.
- `MAIL_REPLIED`: first email reply, with `reply`, `sentiment`, `sender`, `senderName`, `messageId`, `campaignId`.
- `BOUNCED`: bounce detected; no `campaign` field, `step` 0.
- `VISITED`, `INVITED`, `ACCEPTED`, `MESSAGE_SENT` (text in `content`), `INMAIL_SENT`, `LIKED`: LinkedIn actions.
- `LINKEDIN_REPLIED`: LinkedIn reply with `reply` and `sentiment`; `campaignId`, `linkedinUrlProfile` and `linkedinId` only when detected in real time.
- `WHATSAPP_MESSAGE_SENT`, `WHATSAPP_REPLIED`: WhatsApp message sent, reply received (`reply`).
- `CAMPAIGN_ENDING`: see the campaignEnding webhook.

Never sent: `SENT`, `MAIL_SENT`, `FOLLOWED`, `TASK_COMPLETED`, `TASK_FAILED`, `FAILED_ACTION`, `EXCLUDED`, `RE_REPLY_EMAIL`, `RE_REPLY_LINKEDIN`. Only the real time LinkedIn path retries (once, network errors).

**Delivery.** One `POST` per event and per registered URL, header `Content-Type: application/json`, JSON body, no signature or secret header, default User-Agent of the HTTP library. No timeout is set. Your response (status and body) is ignored: an HTTP error is never retried. Network errors are retried only for some events (see each list). No event ID, no ordering guarantee, no replay; a URL registered twice receives everything twice. Absent fields are omitted, never null.

## Payload

- WebhookAdvancedActivityPayload
  - `event` 'EMAIL_SENT' | 'OPENED' | 'CLICKED' | 'MAIL_REPLIED' | 'BOUNCED' | 'UNSUBSCRIBED' | 'VISITED' | 'INVITED' | 'ACCEPTED' | 'MESSAGE_SENT' | 'INMAIL_SENT' | 'LIKED' | 'LINKEDIN_REPLIED' | 'WHATSAPP_MESSAGE_SENT' | 'WHATSAPP_REPLIED' | 'CAMPAIGN_ENDING', required: Events delivered for advanced (multichannel) campaigns (`type: advanced`). The email sent event is `EMAIL_SENT` (not `SENT`, not `MAIL_SENT`). `CAMPAIGN_ENDING` is delivered with a different body (see the campaignEnding webhook).
  - `campaign` string: Campaign name. Missing on BOUNCED (bug).
  - `campaignId` string: Only on MAIL_REPLIED and on LinkedIn replies or acceptances detected in real time.
  - `senderName` string: MAIL_REPLIED only.
  - `sender` string: MAIL_REPLIED only: address of the Emelia mailbox that received the reply.
  - `contact` WebhookAdvancedContact, required: Contact of an advanced campaign: legacy custom fields (`custom`) first, then the standard fields. The set depends on the emitter: most events carry `id`, `firstName`, `lastName`, `email`, `company`; OPENED, CLICKED and UNSUBSCRIBED carry `linkedinUrlProfile` instead of `id`; replies and acceptances detected in real time add `linkedinUrlProfile` and `linkedinId`. No phone number. `company` comes only from a custom field whose name contains `company`, not from the lead company name.
    - `id` string: Absent on OPENED, CLICKED and UNSUBSCRIBED.
    - `firstName` string
    - `lastName` string
    - `email` string
    - `linkedinUrlProfile` string: Only on OPENED, CLICKED, UNSUBSCRIBED and real time LinkedIn replies or acceptances.
    - `linkedinId` string: Only on real time LinkedIn replies or acceptances.
    - `company` string
  - `date` string, date-time, required: ISO 8601 UTC. Processing time for most events; message time for LinkedIn and WhatsApp replies; 30 to 60 seconds after the fact for OPENED, CLICKED and UNSUBSCRIBED.
  - `step` integer, required: Indicative only. Actions: position of the step in its branch (0 for the first step after the start). OPENED, CLICKED, UNSUBSCRIBED: same but counting the start node (EMAIL_SENT 0 then OPENED 1 for the same email). MAIL_REPLIED: index among the email steps. BOUNCED, WHATSAPP_REPLIED, LINKEDIN_REPLIED and most ACCEPTED: 0.
  - `reply` string: MAIL_REPLIED, LINKEDIN_REPLIED, WHATSAPP_REPLIED.
  - `sentiment` WebhookSentiment: AI classification of a reply. Present only when reply classification is enabled on the account and AI credits remain. Classified by Jev, with Gemini as fallback; only the Gemini fallback can add `additionalData`.
    - `classification` 'INTERESTED' | 'NOT_INTERESTED' | 'NEUTRAL' | 'OUT_OF_OFFICE' | 'HOSTILE' | 'DELEGATION' | 'INCOMPREHENSION' | 'QUESTION_ASK'
    - `score` number: Confidence of the classification.
    - `additionalData` object: Gemini fallback only: `delegationEmail` for DELEGATION, `returnDate` (DD/MM/YYYY) for OUT_OF_OFFICE.
      - `delegationEmail` string
      - `returnDate` string
  - `content` string: MESSAGE_SENT only: text of the LinkedIn message sent.
  - `messageId` string: MAIL_REPLIED only.
  - `link` string: CLICKED only.

## Acknowledgement `2XX`

Any response is accepted. Emelia ignores the status and the body.

## Other responses

- `default`: Ignored too: errors are not retried and the webhook stays active.

---

[API](https://skmtc.dev/emelia/apis/emelia-api.md) · [All operations](https://skmtc.dev/emelia/apis/emelia-api/llms.txt) · [OpenAPI document](https://skmtc.dev/emelia/apis/emelia-api/revisions/8c0cb435f2c4?raw)
