> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.pivolio.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.pivolio.com/_mcp/server.

# Troubleshooting delivery

Open a destination and go to its **Health** tab. Four numbers tell you almost
everything, and the fifth thing you need — the status breakdown — tells you the
rest.

## Delivery health

* **Delivered** — events accepted by the platform in the selected window.
* **Success rate** — delivered as a share of attempted sends. Skipped and
  suppressed events are not attempts, so they don't drag it down.
* **Failures** — sends the platform rejected or that never completed.
* **p95 latency** — the 95th percentile round-trip to the platform, in
  milliseconds. A rising p95 with a flat failure count usually means the
  platform is throttling you, not that anything is broken.

## The five delivery statuses

Every event/destination pair lands on exactly one status:

| Status       | Meaning                                                            |
| ------------ | ------------------------------------------------------------------ |
| `sent`       | The platform accepted it.                                          |
| `skipped`    | Not applicable — no enabled mapping, or gated by consent.          |
| `retrying`   | A transient failure; it will be attempted again with backoff.      |
| `failed`     | A permanent failure. No further attempts.                          |
| `suppressed` | Withheld by traffic-quality rules — never offered to the platform. |

The distinction that matters most: **`skipped` and `suppressed` are decisions,
not errors.** Skipped means Pivolio had no instruction to send it. Suppressed
means Pivolio deliberately decided not to. Neither will ever appear as a
failure, which is why a destination can look healthy and deliver nothing.

## Error codes

| Code              | Cause                                                                                     |
| ----------------- | ----------------------------------------------------------------------------------------- |
| `TRANSFORM_ERROR` | The event can't be shaped into the platform's payload. Deterministic — **never retried**. |
| `TIMEOUT`         | The platform didn't answer in time.                                                       |
| `NETWORK_ERROR`   | The request never completed.                                                              |
| `API_ERROR`       | The platform returned an error response.                                                  |
| `AUTH_ERROR`      | Credentials rejected — a 401 or 403.                                                      |

### Retryable versus permanent

* **2xx** — sent.
* **429 or any 5xx** — retryable. Backed off and re-attempted.
* **401 or 403** — `AUTH_ERROR`. An auth failure that survives a fresh token is
  a dead grant: the credentials must be re-authorized, and retrying only burns
  budget, so it stops.
* **Any other 4xx** — permanent. The platform is telling you the payload is
  wrong; sending it again produces the same answer.
* **Transform failures** — never retried, by design.

[TikTok is special](/documentation/destinations/tik-tok): it returns HTTP 200 with the real outcome in
the body's `code` field. Pivolio classifies on the body code, so TikTok can show
failures against requests your own network logs call successful.

## Symptom → cause

| Symptom                                                          | Likely cause                                                                                                                                                      | Check                                                                                            |
| ---------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------ |
| Events visible in the Live Debugger, nothing delivered anywhere  | No active plan or trial. Collection is on every plan; **dispatch is the paid part**.                                                                              | **Billing**                                                                                      |
| Nothing delivered to one destination, no failures                | The destination is disabled, or every event is `skipped`.                                                                                                         | The destination's enable toggle, then its [mappings](/documentation/destinations/event-mappings) |
| Google Ads connected and authorized, zero delivered, zero failed | **Google is mapping-only** — it sends nothing until each event points at a conversion action.                                                                     | [Google Ads](/documentation/destinations/google-ads) mapping step                                |
| One event type never arrives, everything else does               | That mapping is missing or switched off.                                                                                                                          | [Event mappings](/documentation/destinations/event-mappings)                                     |
| Delivered count collapsed after a consent-banner change          | Events are being gated — look for a spike in `skipped`.                                                                                                           | [Consent rules](/documentation/destinations/consent-rules)                                       |
| `AUTH_ERROR` on every send                                       | Token revoked, expired, or never had access to the pixel. For Google, the OAuth grant was revoked.                                                                | Re-paste the token, or reconnect OAuth                                                           |
| Everything `suppressed`                                          | Traffic-quality rules are classifying your traffic as risky — datacenter IPs, proxies, bot signatures. Common with load tests and internal QA traffic from a VPN. | **Traffic quality** settings                                                                     |
| Reddit rejecting events, other destinations fine                 | Reddit **rejects events older than 7 days** — the only platform with an age cap. Backlogs older than a week can't be recovered.                                   | [Reddit](/documentation/destinations/reddit)                                                     |
| Delivered fine, but match quality is poor                        | Consent stripped identifiers, or you pre-hashed PII. Send raw email and phone; Pivolio normalizes and hashes them.                                                | The event's identifier list in the Live Debugger                                                 |
| p95 latency climbing, failures flat                              | Platform-side throttling. Retries will absorb it.                                                                                                                 | Nothing to fix                                                                                   |

## Verifying a fix

Fire a real event through the Live Debugger and watch the per-destination
outcome on that single event. It shows the status and, on failure, the error
code — which is faster than waiting for aggregate health to move, and it tells
you whether the event was skipped, suppressed, or genuinely attempted.

## Related

* [Destinations overview](/documentation/destinations/overview)
* [Event mappings](/documentation/destinations/event-mappings)
* [Consent rules](/documentation/destinations/consent-rules)
* [Errors](/documentation/guides/errors) — the API error envelope.