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

# Testing

> Test your webhook endpoint against staging

There is no "send test event" button or API - you test webhooks by **triggering real events on staging**, where bookings are free to create and cancel.

## Expose your local endpoint

While developing, tunnel your local server to a public URL and register that URL as a staging webhook:

```bash theme={null}
ngrok http 3000
# → https://a1b2c3.ngrok.app  →  register https://a1b2c3.ngrok.app/webhooks/way
```

To inspect payloads without writing any code first, point the webhook at a capture service like [webhook.site](https://webhook.site) instead.

## Trigger real events

With your staging brand and API keys (see [Environments](/environments)), the cheapest event generator is a cash test booking - it confirms synchronously and fires `booking.completed`, and cancelling it fires `booking.cancelled`:

1. Create a booking with `"paymentMethod": "cash"` via [Create a booking](/api-reference/carts-and-checkout/create-booking) - the [booking integration guide](/guides/build-a-booking-integration) walks through assembling the payload.
2. Cancel it via [Cancel bookings](/api-reference/bookings/cancel-booking).
3. Reschedule flows fire `booking.rescheduled`; publishing/unpublishing a listing from the dashboard fires the `listing.*` events.

## Debugging checklist

* **Check the dashboard webhook logs** (**Settings → Developers → Webhooks** → select a webhook): every delivery attempt is recorded with status, timestamps, response code, and the full payload sent. Filter by status, event type, or date.
* **Return `2xx` within 10 seconds.** Slow handlers read as failures and trigger retries - acknowledge first, process async.
* **Signature mismatches**: almost always a raw-body issue - see [Verify signatures](/webhooks/verify-signatures#pitfalls).
* **Nothing arriving?** Confirm the webhook is enabled, subscribed to the event you're triggering, and that the URL is reachable from the public internet.
