# Overview

> Receive ROASForm form activity on your own endpoint as signed JSON events.

---
title: Overview
description: Receive ROASForm form activity on your own endpoint as signed JSON events.
---

ROASForm webhooks push form activity to any public HTTPS URL the moment it happens: a lead completes a form, books a call, abandons halfway, or advances a step. Point them at Zapier, Make, n8n, or your own backend.

## How it works

You register a webhook per subaccount: a target URL, the events you want, and an optional list of forms to scope it to. When a matching event occurs, ROASForm sends the webhook to your URL as an HTTP `POST` with a JSON body, signed with your webhook's secret.

1. Create a webhook under **Integrations → Webhooks** in the dashboard.
2. Store the signing secret. It is shown exactly once.
3. Subscribe to events and pick the forms it applies to.
4. Verify the signature on every delivery before trusting the body.
5. Respond `2xx` within 10 seconds, then process asynchronously.

## Delivery guarantees

Delivery is **at-least-once**. If your endpoint is slow or down, ROASForm retries up to 5 times with exponential backoff, so a rare duplicate is possible. Deduplicate on the webhook's `id`: it is stable across retries of the same delivery. See [Delivery & retries](/docs/webhooks/delivery) for the full rules.

## The five events

| Event | Fires when |
| --- | --- |
| [`form_submission`](/docs/webhooks/events/form-submission) | Any submission completes, with or without a lead. |
| [`form_step`](/docs/webhooks/events/form-step) | Contact details are captured (email or phone). |
| [`completed_lead`](/docs/webhooks/events/completed-lead) | A lead (contact details captured) finishes the form. |
| [`partial_lead`](/docs/webhooks/events/partial-lead) | A lead abandons the form before finishing. |
| [`booked_call`](/docs/webhooks/events/booked-call) | An appointment is booked through a connected calendar. |
