App integration · All integrations
Get Slack Notifications for Every Signed Formfy Form
Every clinic, agency, and operations team has the same problem: signed forms sit in the Formfy dashboard while the people who need to act on them are watching Slack. A signed liability waiver needs the front desk to confirm an appointment. A completed intake form needs the nurse to prep the chart. But nobody refreshes a form builder dashboard all day. The result is delays, missed follow-ups, and manual status checks that should never have been manual in the first place.
Formfy's public webhook API lets you fire a signed-form event to any relay URL the moment a client signs. Point it at Slack via Zapier, Make, n8n, or a serverless function and your channel lights up instantly — no dashboard watching required.
The workflow at a glance
Trigger
A client signs a Formfy consent, intake, or liability waiver
Action
Formfy fires a webhook to your relay; the relay posts a formatted alert to your Slack channel
Result
Your team sees the signer's name, form type, and a signed-PDF link in Slack within seconds of the client signing
Step-by-step: connect Slack to Formfy
Subscribe Formfy to the form.signed webhook event, build a relay that posts to a Slack Incoming Webhook, and get real-time channel alerts whenever a client signs.
Generate a Formfy API key
Open the Formfy dashboard, go to Settings → API Keys, and click Create key. Copy the fk_live_… token to your password manager. Use an fk_test_… key while you wire up and test the Slack relay so test signatures do not count against your live submission credits.
Create a Slack Incoming Webhook URL
In Slack, open your workspace's App Directory, install the Incoming WebHooks app, and choose the channel where form alerts should land. Slack generates a target URL at hooks.slack.com/services/…. Copy it — you will paste it into your relay configuration in the next step.
Subscribe Formfy to the form.signed event
POST /api/v1/webhooks with target_url set to your relay endpoint — a Zapier Catch Hook, a Make HTTP module, or a serverless function — and event_types: ["form.signed"]. Formfy returns a webhook signing secret. Store it in your relay's environment so every delivery can be verified with HMAC-SHA256.
POST
/api/v1/webhooksSee in the OpenAPI spec →Build the relay that forwards payloads to Slack
In Zapier, Make, n8n, or a Cloudflare Worker, parse the Formfy webhook payload and construct a Slack Block Kit message. Include the signer_email, form name, and signed_at timestamp from the payload. POST the message body to your Slack Incoming Webhook URL — Slack delivers it to the target channel immediately.
Attach the signed PDF link to the Slack alert
To include a download link, call GET /api/v1/forms/{id}/signed-pdf from your relay using the form id in the Formfy payload. Formfy returns a time-limited download token. Add it to your Slack message as a button so recipients can open the signed PDF from the channel without logging into Formfy.
GET
/api/v1/forms/{id}/signed-pdfSee in the OpenAPI spec →Test the full pipeline end-to-end
Sign a test form in Formfy. Within 30 seconds your relay receives the webhook, formats the message, and Slack displays the alert in the target channel. Check the Formfy Webhook Deliveries log for HTTP status codes if the Slack message doesn't appear — it shows every delivery attempt and response body.
Rotate the webhook secret on schedule
Quarterly, or after any suspected secret exposure, POST /api/v1/webhooks/{id}/rotate-secret to receive a fresh signing key. Update the secret in your relay environment immediately. Formfy deliveries fail closed until both sides match on the new secret — by design, this prevents spoofed payloads from reaching your Slack channel.
POST
/api/v1/webhooks/{id}/rotate-secretSee in the OpenAPI spec →
Subscribe Formfy to form.signed and route alerts to Slack
Create a webhook subscription targeting your relay URL. Formfy returns a signing secret — store it in your relay environment to verify every delivery before posting to Slack.
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 Formfy have a native Slack app?
Formfy does not publish a dedicated Slack app in the Slack App Directory today. The integration runs through Formfy's public webhook API: subscribe to form events via POST /api/v1/webhooks and relay the payloads to a Slack Incoming Webhook using Zapier, Make, n8n, or a small serverless function. This gives you full control over which events fire a message, what the message contains, and which channels receive which form types.
Which Formfy events can trigger a Slack notification?
The v1 API supports five event types: form.created, form.sent, form.viewed, form.signed, and form.expired. form.signed is the most actionable — it fires the moment a client completes a consent, waiver, or intake form. form.expired is useful for alerting staff when an unsigned form lapses before an appointment. You can subscribe to multiple event types on one endpoint or create separate subscriptions that route different events to different channels.
How do I format the Slack message from a Formfy webhook payload?
The Formfy webhook payload includes the form id, form name, signer_email, signed_at timestamp, and submission metadata. In your relay, map those fields into a Slack Block Kit message — a header block for the form name, a section block for the signer and timestamp, and a button block linking to the signed PDF. Zapier and Make include built-in Slack Send Message actions that accept mapped fields directly without writing code.
Can I route different Formfy forms to different Slack channels?
Yes. Create one webhook subscription per channel and point each target_url to a relay endpoint that resolves to the correct Slack Incoming Webhook URL. In Zapier, add a filter step that branches on the form name or form id; in Make, a router module handles the branching logic. Formfy places no cap on the number of active webhook subscriptions on your account, so you can segment by form type, clinic location, or team.
How do I include the signed PDF download link in the Slack alert?
After your relay receives the form.signed payload, call GET /api/v1/forms/{id}/signed-pdf using the form id from the payload body. Formfy returns a time-limited download token. Construct the full download URL and embed it as a button or hyperlink in your Slack Block Kit message. Recipients click from the Slack notification directly to the signed PDF without needing to log into the Formfy dashboard.
How quickly does the Slack alert arrive after a client signs?
Formfy queues webhook deliveries within seconds of the event firing. Total latency from client signature to Slack message — including relay execution time in Zapier or Make — is typically under 30 seconds. Formfy retries failed deliveries with exponential backoff for up to 24 hours, so a brief Slack outage or relay restart does not permanently drop the notification.
How do I make sure Slack alerts cannot be spoofed?
Every Formfy webhook delivery includes an X-Formfy-Signature header computed as HMAC-SHA256 of the raw request body using the webhook signing secret. In your relay, recompute the HMAC and reject the request if the signatures do not match before forwarding anything to Slack. This prevents an attacker from posting fake form.signed events to your channel even if they discover your relay URL.
What happens to the Slack alert if my relay is down when a form is signed?
Formfy queues the webhook delivery and retries with exponential backoff for up to 24 hours. Once your relay recovers, the queued deliveries fire in order and the Slack messages appear shortly after. You can also inspect every attempt — including HTTP status codes and response bodies — in the Formfy dashboard's Webhook Deliveries log and replay any failed delivery manually.
Ready to wire Slack into Formfy?
Spin up an API key, run your first webhook, and route signed forms wherever your team already works.
