# campaign.status_changed

A campaign Zernio already tracked changed its platform status or, on Google, the reasons behind it.

### When it fires

Fires when the ads sync reads a tracked campaign with a different status than it stored, up to one sync interval late. Covers every ad network.

### Status values

On Google, `status` is the campaign's `primary_status` (`ELIGIBLE`, `LIMITED`, `NOT_ELIGIBLE`, `PAUSED`, ...) and `reasons` its sorted `primary_status_reasons`, so a campaign turning budget limited fires. Elsewhere `status` is the campaign's own platform status (Meta `effective_status`) and `reasons` is empty.

### When it does not fire

A campaign seen for the first time, or the same change from the same previous status again within an hour (a retried sync). A change made through Zernio, such as a pause, fires on the next sync, once the sync reads it from the platform.




**Payload for `campaign.status_changed`:**

- **id** (required) `string`: Stable webhook event ID: the dedupe key, also sent as the X-Zernio-Event-Id header and identical on every retry and redelivery.
- **profiles**: `WebhookProfiles` - See schema definition
- **test** `boolean`: Always true when present: only a sample sent by POST /v1/webhooks/test with an event carries it. Real deliveries never do.
- **event** (required) `string`: No description - one of: campaign.status_changed
- **account** (required): `WebhookAdsAccount` - See schema definition
- **campaign** (required) `object`: 
  - **platformCampaignId** (required) `string`: Platform-native campaign ID.
  - **name** (required) `string,null`: No description
- **platform** (required) `string`: The ad network, as the ads endpoints name it (`google`, `facebook`, `tiktok`, ...).
- **adAccountId** (required) `string`: Platform-native ad account ID.
- **status** (required) `object`: 
  - **previous** (required) `string`: The platform's status before.
  - **current** (required) `string`: The platform's status now.
- **reasons** (required) `object`: Google's `primary_status_reasons` (for example `BUDGET_CONSTRAINED`), sorted. Always empty on other networks.
  - **previous** (required) `array[string]`: 
  - **current** (required) `array[string]`: 
- **timestamp** (required) `string` (date-time): UTC time at which Zernio generated this event.