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

# SMS Processing Result

> Webhook payload sent after SMS processing completes for each recipient.

The SMS Processing Result webhook is sent after Vodafone finishes processing each recipient in a V2 OAuth API campaign request. Use this webhook to confirm whether a recipient was accepted and queued, rejected during message processing, or affected by a campaign-level validation error.

This webhook confirms API processing. It does not confirm handset delivery. Use [Delivery Receipts](/guides/delivery-receipts) for network delivery confirmation.

## When it fires

Webhooks fire once per recipient, not once per API call.

| Recipients in campaign | Webhook requests |
| ---------------------- | ---------------- |
| 1                      | 1                |
| 5                      | 5                |
| 100                    | 100              |

## Configure your endpoint

Contact [bulktext.ie@vodafone.com](mailto:bulktext.ie@vodafone.com) with your webhook URL. Your endpoint must:

* Accept `HTTP POST` requests
* Accept a JSON request body
* Return `200 OK` after receiving the payload

## Payload examples

<CodeGroup>
  ```json title="Message accepted" icon="circle-check" wrap theme={"system"}
  {
    "Status": "MESSAGE_SUCCESS",
    "FinishedAt": "2026-04-09T14:39:40.69257Z",
    "Message": "Your message has been queued.",
    "NotifyId": "order-001"
  }
  ```

  ```json title="Message error" icon="circle-xmark" wrap theme={"system"}
  {
    "Status": "MESSAGE_ERROR",
    "FinishedAt": "2026-04-09T14:39:40.69257Z",
    "Message": "Error trying to add a new message. No credits available",
    "NotifyId": "order-001"
  }
  ```

  ```json title="Campaign error" icon="triangle-exclamation" wrap theme={"system"}
  {
    "Status": "CAMPAIGN_ERROR",
    "FinishedAt": "2026-04-09T14:39:40.69257Z",
    "Message": "Sender is not valid"
  }
  ```
</CodeGroup>

## Fields

| Field        | Type   | Description                                                                                                                      |
| ------------ | ------ | -------------------------------------------------------------------------------------------------------------------------------- |
| `Status`     | string | Processing outcome for the recipient or campaign.                                                                                |
| `FinishedAt` | string | ISO 8601 timestamp in UTC for when processing completed.                                                                         |
| `Message`    | string | Human-readable processing result.                                                                                                |
| `NotifyId`   | string | The recipient `notifyId` from the campaign request. Empty when no `notifyId` was set. Not included in `CAMPAIGN_ERROR` payloads. |

## Status values

| Status            | Scope         | Meaning                                                                                       |
| ----------------- | ------------- | --------------------------------------------------------------------------------------------- |
| `MESSAGE_SUCCESS` | Per recipient | The message was accepted and queued for delivery.                                             |
| `MESSAGE_ERROR`   | Per recipient | The message could not be processed for this recipient.                                        |
| `CAMPAIGN_ERROR`  | Per recipient | The campaign was rejected before messages were queued. One payload still fires per recipient. |

## Common messages

| Message                                                   | Status            | What it means                                  |
| --------------------------------------------------------- | ----------------- | ---------------------------------------------- |
| `Your message has been queued.`                           | `MESSAGE_SUCCESS` | Recipient accepted, message in queue.          |
| `Sender is not valid`                                     | `CAMPAIGN_ERROR`  | The `from` value is not an approved sender ID. |
| `Error trying to add a new message. No credits available` | `MESSAGE_ERROR`   | The account has insufficient SMS credit.       |
| `null/empty MSISDN`                                       | `MESSAGE_ERROR`   | The recipient number was blank or missing.     |

## Correlate with notifyId

Set `recipientInfo[].notifyId` when sending a campaign. Vodafone echoes it back in `NotifyId` for `MESSAGE_SUCCESS` and `MESSAGE_ERROR` payloads.

```json title="Campaign recipient with notifyId" icon="fingerprint" wrap theme={"system"}
{
  "recipientInfo": [
    { "msisdn": "353861234567", "notifyId": "order-001" }
  ]
}
```

Store that value against your own order, appointment, or user record so the webhook can update the right row without relying on phone-number matching.

## Webhooks vs DLRs

|            | SMS Processing Result webhook       | Delivery Receipt                 |
| ---------- | ----------------------------------- | -------------------------------- |
| Trigger    | API message processing completes    | Mobile network confirms delivery |
| Timing     | Immediate after campaign processing | Seconds to hours later           |
| Scope      | V2 OAuth API sends                  | All send methods                 |
| Use it for | Queue or rejection status           | Handset delivery status          |
