> Part of the walkerOS documentation. Project overview and full index: <https://www.walkeros.io/llms.txt>

# My events aren't arriving

When a destination stays silent, you do not need a server or a login to find out why. Run your flow against a single event offline and read the result.

```bash
npx walkeros push flow.json -e '{"name":"product add","data":{"id":"ers","price":420}}' --simulate destination.gtag
```

The simulation reports whether the destination accepted the event, which mapping rule matched, and the vendor calls it would have made:

```text
success: true
  destination.gtag
    mapping: product add
    call window.gtag("event","add_to_cart",{...})
  Duration: 4302ms
```

`mapping: none (skipped before mapping)` with `no calls` means the event never reached the destination's mapping (consent, a filter, or no rule). When consent is the reason, a line says which kind:

* `pending: waits for consent (require)`: the destination has `require: ["consent"]` and never started. Pass starting consent with `--consent '{"functional":true}'`.
* `skipped: consent (requires marketing; granted functional)`: the destination started, but the event lacks the consent its `consent` setting requires. Grant it with `--consent` or in the event's `consent`.

See [consent in simulate](/preview/pr-749/docs/apps/cli.md#consent-in-simulate). Add `--json` to get the same result as machine-readable output, with the recorded calls under `simulations` (see [simulation output](/preview/pr-749/docs/apps/cli.md#simulation-output)). Your `flow.json` must carry `config.platform` (`"web"` or `"server"`), otherwise bundling throws before the simulation runs.

## Symptom to cause[​](#symptom-to-cause "Direct link to Symptom to cause")

| Symptom                  | Likely cause                 |
| ------------------------ | ---------------------------- |
| No events at all         | Source not initialized       |
| A destination is silent  | Mapping mismatch             |
| Partial or wrong data    | Path does not exist          |
| A destination is skipped | Required consent not granted |
| A destination throws     | Vendor SDK or API error      |

## Log every event at the collector[​](#log-every-event-at-the-collector "Direct link to Log every event at the collector")

To confirm events are flowing before you blame a vendor, add an inline console destination. It logs the name of every event the collector processes, so you can see what arrives and when.

```typescript
const { elb } = await startFlow({
  destinations: {
    debug: {
      code: {
        type: 'console',
        config: {},
        push: (event) => console.log('Event:', event.name),
      },
    },
    // ...your other destinations
  },
});
```

If you see event names in the console but the real destination stays silent, the problem is downstream of the collector: a mapping mismatch, a missing consent, or a vendor error. If you see nothing, the source is not capturing or the collector never started.

## Checklist[​](#checklist "Direct link to Checklist")

1. Any errors in the browser console?
2. Is the event pushed? Add the console destination above to confirm.
3. Does the destination mapping match the entity and action names exactly? Names are case-sensitive (`product add`, not `Product Add`).
4. Do the mapped data paths exist on the event? Log the full event and check.
5. Is the required consent granted for the destination?
6. Run `npx walkeros validate flow.json` to catch a malformed config.

## Zero-install equivalent (AI assistant via MCP)[​](#zero-install-equivalent-ai-assistant-via-mcp "Direct link to Zero-install equivalent (AI assistant via MCP)")

If you use the walkerOS MCP server with an AI assistant, the same offline simulation is one tool call. `step` is required and uses the `type.name` form (for example `destination.gtag`).

```typescript
flow_simulate({
  configPath: 'flow.json',
  step: 'destination.gtag',
  event: { name: 'product add', data: { id: 'ers', price: 420 } },
})
```

The response includes `_hints.warnings`, which flags when no destination received the event, and a destination that sent nothing carries `skipped` with the reason. Pass `state: { consent: { functional: true } }` to start a destination that waits for consent. For transformer, collector and destination steps, pass `ingest` (for example `{ ip, userAgent }`) to simulate the request context an HTTP source would provide. Like the CLI output, the result is scrubbed of credentials.
