Automation recipe · All recipes

Notify Slack When a Form Is Signed

Clinic coordinators, agency ops managers, and solo consultants all share the same pain: a client signs a consent form or waiver and no one on the team knows about it until they refresh their inbox — or worse, until the next morning standup. Signed-form notifications buried in email go unread for hours. What everyone actually wants is a real-time Slack ping the moment a signature lands, surfacing the signer's name and a direct link to the PDF without opening a separate dashboard tab.

Formfy's form.signed webhook fires within seconds of every signature. Point it at a Slack-aware relay — or run it through Zapier — and your chosen channel receives an instant alert with the signer's name, form title, and PDF link. No polling, no inbox lag, no manual copy-paste.

How the recipe flows

  1. Trigger (Formfy)

    A client signs a Formfy consent, waiver, or intake form

  2. Step 1

    Formfy fires the form.signed webhook payload to your relay or middleware endpoint

  3. Step 2

    The relay validates the HMAC-SHA256 signature, formats the message, and POSTs to Slack

  4. Outcome

    Your chosen Slack channel receives an instant alert with the signer's name, form title, and a direct link to the signed PDF — the moment the client hits submit

Build the recipe step-by-step

Wire Formfy's form.signed webhook into Slack Incoming Webhooks and receive instant channel alerts every time a client signs a consent, waiver, or intake form.

  1. Generate a Formfy API key

    In the Formfy dashboard, go to Settings → API Keys and click Create key. Copy the fk_live_… token and store it in a password manager — Formfy shows it once. During testing, use a fk_test_… key so no live submission credits are consumed while you wire the pipeline.

  2. Create a Slack Incoming Webhook

    In Slack, open Your apps → Create an app → From scratch. Under Features, select Incoming Webhooks, enable them, and click Add New Webhook to Workspace. Pick the channel where signed-form alerts should land — for example, #intake-alerts or #contracts. Slack generates a webhook URL starting with https://hooks.slack.com/services/…; copy it for the next step.

  3. Subscribe Formfy to the form.signed event

    POST /api/v1/webhooks with your Bearer token, setting target_url to your relay endpoint and event_types: ["form.signed"]. Formfy returns a subscription id and a signing secret. Paste the secret into your relay's environment variables so it can verify every incoming delivery via HMAC-SHA256 before forwarding to Slack.

    POST/api/v1/webhooksSee in the OpenAPI spec →

  4. Format the payload and POST to Slack

    Formfy's webhook payload contains form_id, form_title, signer_email, and signed_at. Shape it into a Slack message and POST it to your Slack Incoming Webhook URL. To include the signed PDF link, call GET /api/v1/forms/{id}/signed-pdf and embed the URL in the message block. No-code option: Zapier's Webhooks by Zapier trigger plus Slack action handles this without custom code.

    GET/api/v1/forms/{id}/signed-pdfSee in the OpenAPI spec →

  5. Verify the X-Formfy-Signature before forwarding

    Each Formfy delivery includes an X-Formfy-Signature header, computed as HMAC-SHA256(secret, raw_body). Validate this in your relay before posting to Slack — a mismatched signature means the payload is spoofed or corrupted. Reject invalid deliveries with HTTP 400; Formfy will retry the genuine payload if your relay was temporarily down.

  6. Test the pipeline end-to-end

    Sign a test form in Formfy using a disposable signer email. Within 30 seconds, your Slack channel should display the alert. If the message does not appear, open the Formfy Webhook Deliveries log, inspect the raw payload and HTTP response status, and confirm your relay's target_url matches what you registered.

  7. Rotate the webhook secret on schedule

    Quarterly — or immediately after a suspected secret leak — POST /api/v1/webhooks/{id}/rotate-secret to receive a fresh signing secret. Update your relay's environment variable before the next delivery so signature validation keeps passing. Formfy deliveries fail closed on a mismatched secret by design, protecting your Slack channel from replayed payloads.

    POST/api/v1/webhooks/{id}/rotate-secretSee in the OpenAPI spec →

Subscribe Formfy to the form.signed event

Create a webhook subscription that fires every time a form is signed. Formfy returns a signing secret — store it in your relay so every incoming delivery can be verified with HMAC-SHA256 before the Slack POST fires.

curl -X POST https://formfy.ai/api/v1/webhooks \
  -H "Authorization: Bearer fk_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "target_url": "https://your-relay.example.com/formfy-to-slack",
    "event_types": ["form.signed"]
  }'

Frequently asked questions

Does this recipe require me to write any code?

Not necessarily. If you use Zapier as middleware — catch the Formfy webhook with Webhooks by Zapier and forward a formatted message via the Slack action — you can wire the entire pipeline in under 10 minutes without writing code. If you want fine-grained control over message formatting or need to validate the HMAC signature server-side, a small serverless function on Cloudflare Workers, Vercel Edge, or AWS Lambda handles that cleanly in under 20 lines.

Which Formfy events can trigger a Slack notification?

Five webhook event types are available in Formfy v1: form.created, form.sent, form.viewed, form.signed, and form.expired. Most Slack alert workflows subscribe to form.signed exclusively, but you can pass multiple event types in the event_types array when you POST /api/v1/webhooks. That lets a single subscription fire Slack alerts at every stage of the signature flow — useful for high-value contracts where visibility at each step matters.

How fast does the Slack message arrive after a form is signed?

Formfy queues webhook deliveries within seconds of the form.signed event firing. End-to-end latency from signature to Slack alert is typically under 10 seconds — dominated by your relay's cold-start time if you use a serverless function. Zapier adds a few seconds of subscription latency on top. Either way, the notification lands well before the signer has closed their browser tab.

Can I include the signed PDF link in the Slack message?

Yes. The form.signed webhook payload includes the form_id field. Use that to call GET /api/v1/forms/{id}/signed-pdf, then embed the returned URL as a link in your Slack message body. Recipients can click straight through to download the PDF without logging into Formfy. If you prefer a short-lived download token, the signed-pdf endpoint returns one in its response that you can pass to GET /api/v1/files/pdf/{token}.

What fields does the Formfy form.signed payload include?

The payload contains at minimum: form_id, form_title, signer_email, signer_name, signed_at (ISO 8601 timestamp), and event_type: "form.signed". It also includes a delivery_id for idempotency and the X-Formfy-Signature header for verification. You can map these fields directly into your Slack message template — for example, "✅ [signer_name] signed [form_title] at [signed_at]".

How do I stop Slack alerts for a specific form?

Formfy webhooks fire on event type, not on individual forms, so you cannot exclude a single form at the subscription level. The cleanest approach is to check form_id in your relay function and skip the Slack POST for any form IDs you want to silence. Alternatively, update the webhook subscription via PATCH /api/v1/webhooks/{id} to narrow scope, or delete the subscription entirely with DELETE /api/v1/webhooks/{id}.

What happens to the Slack alert if my relay goes down?

Formfy retries failed webhook deliveries with exponential backoff for up to 24 hours. Once your relay recovers, queued deliveries fire automatically. You can also inspect every delivery attempt in the Formfy dashboard's Webhook Deliveries log and replay any failed delivery manually. A short relay outage causes a delayed — not lost — Slack notification.

Can I notify more than one Slack channel at a time?

Yes. Create one Formfy webhook subscription per target channel, each with its own target_url pointing to a different Slack Incoming Webhook URL. Alternatively, a single relay can fan out to multiple channels: receive the Formfy payload once and POST it to every Slack webhook URL in sequence. The fan-out approach uses fewer Formfy webhook slots and gives you a single place to manage routing logic.

Ship this automation in under 15 minutes

Spin up a Formfy API key, paste the example, and run your first end-to-end signed-form workflow today.