Packstub

Notifications and webhooks

Everything on the Notifications tab of a form. Emails are queued when submissions.queue_notifications is on and a queue is configured.

Email to the team

Addresses in Notify by email each get one email per submission, listing the values and linking to the panel.

Setting What it does
Subject Takes tags: {form_name}, {submission_number}, {submission_id}, {date}, {domain}, and {field_key} for any value
From address, from name Override notifications.from_email / from_name (which override the app's mail from)
Reply-to An address, or respondent for the email the visitor typed
CC, BCC More addresses
Attach uploaded files Adds the files of the submission, up to uploads.attach_max_kb in total

Confirmation to the visitor

Turn on Send a confirmation to the visitor, pick the email field (or let the first email field with a value be used) and write the subject and the message. The message is Markdown and takes the same tags as {{ field_key }} or {field_key}; the submitted values can be appended as a table.

In the panel

Pick users under Notify in the panel and each gets a Filament database notification with a View link for every submission. The app needs Filament's database notifications set up (the notifications table and the panel's databaseNotifications()).

Webhook

Set a Webhook URL and every submission is posted there as JSON:

{
  "type": "submission.received",
  "timestamp": "2026-09-25T10:00:00+00:00",
  "data": {
    "id": 12,
    "number": 12,
    "form": { "id": 1, "slug": "contact", "name": "Contact" },
    "submitted_at": "2026-09-25T10:00:00+00:00",
    "data": { "email": "ada@example.com", "message": "Hi" },
    "labels": { "email": "Email", "message": "Message" },
    "meta": { "ip": "203.0.113.5", "user_agent": "…", "source_url": "https://example.com/contact", "channel": "web" }
  }
}
Setting What it does
Method POST, PUT or PATCH
Signing secret Generated when the URL is set; the request carries Standard Webhooks headers: webhook-id, webhook-timestamp and webhook-signature (v1, + base64 HMAC-SHA256 of {id}.{timestamp}.{body})
Fields to send A subset of the values (empty sends every field)
Include the visitor details The meta block
Extra headers Sent with every request

Deliveries are queued (webhooks.queue), retried with a growing delay (1, 5, 25 minutes…) up to webhooks.attempts times, and listed under Webhook deliveries on the form's page with their status, attempts and response, where a failed one can be retried. form-builder:prune drops deliveries older than webhooks.keep_days.

Make, n8n, Zapier's Webhooks by Zapier and any endpoint of your own take this payload as is.

Events and sinks

Packstub\FormBuilder\Events\SubmissionReceived is dispatched with the form, the submission and the context; SpamDetected when a submission is dropped. A SubmissionSink class receives every accepted submission; see Submissions.