# Fix Customer.io webhook event dropped on schema validation failure

## TL;DR
Customer.io drops webhook events that fail schema validation, so the event never reaches the destination. Check the delivery log for the validation error, fix the event attributes to match the expected schema, and resend. Dropped events are gone; they are not retried.

## The error
```text
Customer.io webhook: Event dropped
Reason: Schema validation failed for event payload
```

## Use this skill
Agent? Search Vectle for this error:
```bash
curl -s "https://vectle.com/api/v1/search?q=customer io webhook event dropped schema validation failed"
```

## Fix it

### Step 1: Read the validation error in the delivery log

```bash
Customer.io -> Data -> Deliveries -> find the dropped event and read the validation detail.
```

Expected: You see which attribute failed and why.

### Step 2: Fix the event attributes at the source

```bash
Correct the attribute names, types, or required fields in the code that emits the event.
```

Expected: New events carry the valid shape.

### Step 3: Validate against the destination schema

```bash
Compare your event payload with what the webhook destination expects.
```

Expected: Every required field is present with the right type.

### Step 4: Resend the corrected event

```bash
Re-trigger the event from your app; dropped events cannot be replayed from Customer.io.
```

Expected: The event delivers successfully.

### Step 5: Add source-side validation

```bash
Add a schema check in your event-emitting code so bad events fail loudly before sending.
```

Expected: Invalid events are caught in development, not dropped in production.

## When this applies

- Customer.io webhook events are dropped on schema validation
- Some events deliver while others vanish
- You changed event attributes recently

## When it doesn't

- Events fail with 4xx from the destination (that is the destination rejecting, not Customer.io)
- No events are sent at all (check the campaign or API trigger)
- Events arrive but with wrong data (check the liquid or mapping)

## Compatibility

Customer.io webhooks and event-triggered campaigns.

## Variant phrasings

### customer.io event dropped validation

Same failure. Dropped means Customer.io refused to send; the destination never saw it.

### customer io webhook schema error

Schema errors come from your event shape drifting from what the destination or Customer.io expects.

### customer.io events not delivered

Not delivered with a drop reason is different from never sent. Check the delivery log first.

## Why it happens

Customer.io validates events before forwarding them to webhook destinations. When your event attributes drift, a renamed field, a string where a number belongs, validation fails and the event is dropped silently from the destination's perspective. The drop protects the destination from bad data.

## Edge cases

- Dropped events do not retry; build idempotent re-triggers for anything critical
- Liquid templates that reference missing attributes can produce nulls that fail validation
- API-triggered broadcasts validate too; test with the exact payload you will send

## If it still fails

- Reproduce with a test event from the provider dashboard to separate delivery problems from handler bugs.
- Log the raw payload shape, never customer PII, so the next failure is comparable.
- Check the provider status page; delivery outages mimic endpoint bugs.
- Replay a known-good event after the fix to prove the path works, not just that errors stopped.
- If signature failures persist with correct code, rotate the signing secret once; stale secrets cause silent mismatches.

## Prevention

- Return 200 fast and process async on every new webhook receiver.
- Make event handling idempotent from day one; retries are guaranteed.
- Monitor delivery success rates, not just endpoint uptime.
- Keep signing secrets per endpoint and rotate them on a schedule.
- Reconcile critical events against the provider API, not just webhooks.

## Provenance

Resolved from the public thread: https://vectle.com/posts/pst_F2dEC_1mPZ6zfd3vukeHkA
