# form_submission

> Any submission completed, with or without a lead.

---
title: form_submission
description: Any submission completed, with or without a lead.
---

Fires whenever a submission reaches `complete`, including visitors who finished the form without leaving contact details. The `lead` field is `null` in that case; its presence is what distinguishes this event from [`completed_lead`](/docs/webhooks/events/completed-lead). When a lead *was* captured, both events fire for the same completion as separate deliveries with different ids — subscribe to one of the two, or correlate on `submission.id`.

<ApiSection>
<div>
<Attributes title="data">
  <Attribute name="submission" type="object">
    The completed submission (`status` is `complete`). Carries its own `ending`, `answers`, `lastSeenElement`, `utmData`, `ipAddress`, `userAgent`, and `appliedTags`. See [the submission object](/docs/webhooks/webhook#shared-objects).
  </Attribute>
  <Attribute name="lead" type="nullable object">
    Present only when contact details were captured.
  </Attribute>
  <Attribute name="splitTestVariant" type="nullable object">
    `{ id, name }` of the variant served, or `null` when the form has no running split test.
  </Attribute>
</Attributes>
</div>
<ExamplePanel title="form_submission">

```json
{
  "id": "8d3f7b21-4a9e-4c6d-b2f8-5e1c9a7d0b35",
  "event": "form_submission",
  "webhookVersion": "2026-07-01",
  "createdAtUtc": "2026-07-28T15:04:52.019Z",
  "agency": {
    "id": "c1a2b3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
    "name": "Acme Marketing"
  },
  "subaccount": {
    "id": "7f3e9d21-4b8a-4c5e-9f60-2d8b1a7c3e54",
    "name": "Acme Fitness Client"
  },
  "form": {
    "id": "e8b4c672-9a1d-4f3b-b7c8-5d2e9f0a1b3c",
    "name": "Fitness Coaching Application",
    "url": "https://forms.roasform.com/fitness-coaching"
  },
  "data": {
    "submission": {
      "id": "2e9c5a17-8f4b-4d2e-a7c9-3b6d0f8e1a52",
      "status": "complete",
      "qualification": "unqualified",
      "score": 18,
      "startedAtUtc": "2026-07-28T15:01:12.664Z",
      "completedAtUtc": "2026-07-28T15:04:52.019Z",
      "ending": {
        "id": "6b1e9d47-3f8c-4a2b-9d5e-8c0a4f7b2e91",
        "name": "Not a fit",
        "type": "success"
      },
      "lastSeenElement": {
        "elementId": "d2c8f5b1-7e4a-4d9c-a6f3-9b0e5d8c2a64",
        "label": "What are your goals?",
        "type": "multiple_choice",
        "value": null,
        "values": [
          "Lose weight"
        ],
        "score": 5
      },
      "answers": [
        {
          "elementId": "b7e2f9a4-3c8d-4a1e-9f5b-6d0c2e8a4f17",
          "label": "What is your monthly budget?",
          "type": "single_choice",
          "value": "Under $500",
          "values": null,
          "score": 13
        },
        {
          "elementId": "d2c8f5b1-7e4a-4d9c-a6f3-9b0e5d8c2a64",
          "label": "What are your goals?",
          "type": "multiple_choice",
          "value": null,
          "values": [
            "Lose weight"
          ],
          "score": 5
        }
      ],
      "appliedTags": [
        "quiz-completed"
      ],
      "utmData": {
        "utm_source": "facebook",
        "utm_medium": "cpc",
        "utm_campaign": "summer-2026"
      },
      "ipAddress": "198.51.100.17",
      "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
    },
    "lead": null,
    "splitTestVariant": null
  }
}
```

</ExamplePanel>
</ApiSection>
