Automation recipe · All recipes
Send a Formfy Form After a Stripe Payment
When a client pays through Stripe, the next step — signing a service agreement, completing an intake form, or returning onboarding paperwork — still falls on someone to do manually. Someone has to notice the payment, find the right form, and remember to send it. The client waits, paperwork piles up between shifts, and new accounts stall before they even begin.
One Stripe payment event triggers a Formfy form send in seconds. The moment payment clears, the client receives their intake or consent form by email — signed and archived before anyone lifts a finger.
How the recipe flows
Trigger (Stripe)
Stripe fires checkout.session.completed or payment_intent.succeeded
Step 1
Your webhook handler verifies the Stripe signature and extracts the customer email
Step 2
Your server calls POST /api/v1/forms/{id}/send with the customer email and form ID
Outcome
The client receives the Formfy form by email, completes their e-signature, and the signed PDF archives automatically — onboarding is done before the Stripe receipt lands.
Build the recipe step-by-step
Connect Stripe payment webhooks to Formfy form delivery so every new paying customer automatically receives an intake, consent, or onboarding form.
Collect your Formfy form ID and API key
In the Formfy dashboard, open the form you want to send post-payment and copy its form ID from the URL bar or the Settings panel. Navigate to Settings → API Keys, click Create key, and save the fk_live_… token to a password manager. Use a fk_test_… key during development so test submissions do not count against your live plan.
Confirm the form is published and ready to send
Call GET /api/v1/forms/{id} with your Bearer token before wiring the automation. Verify the form status is published and that signer fields are present. Sending a draft form produces a delivery with no valid signing link — catch this in staging, not in production.
GET
/api/v1/forms/{id}See in the OpenAPI spec →Register a Stripe webhook for payment success events
In the Stripe dashboard under Developers → Webhooks, add your server endpoint and subscribe to checkout.session.completed and payment_intent.succeeded. Stripe provides a signing secret starting with whsec_; store it alongside your Formfy API key. Verify every delivery with stripe.webhooks.constructEvent before trusting the payload.
Send the Formfy form on payment success
Inside your Stripe webhook handler, extract the customer email and call POST /api/v1/forms/{id}/send with recipient_email and an optional message body. Formfy queues the delivery immediately. The client receives a signing link within seconds of payment clearing — no manual step required on your end.
POST
/api/v1/forms/{id}/sendSee in the OpenAPI spec →Subscribe to Formfy form.signed to close the loop
POST /api/v1/webhooks with event_types: ["form.signed"] and a target_url pointing at your server or a Zapier catch hook. Formfy returns a signing secret for HMAC verification. When the client signs, Formfy delivers the event payload — your handler can then fetch the PDF, update your CRM, or trigger the next onboarding step.
POST
/api/v1/webhooksSee in the OpenAPI spec →Fetch and archive the signed PDF
After form.signed fires, call GET /api/v1/forms/{id}/signed-pdf to receive a time-limited download token. Pass that token to GET /api/v1/files/pdf/{token} to retrieve the final PDF. Store it in your document system, attach it to the customer record in your CRM, or forward it to the client as their completed paperwork receipt.
GET
/api/v1/forms/{id}/signed-pdfSee in the OpenAPI spec →Rotate both webhook secrets on schedule
Quarterly, or after any suspected key exposure, POST /api/v1/webhooks/{id}/rotate-secret in Formfy and regenerate the Stripe signing secret in the Stripe dashboard. Update both values in your environment variables. Deliveries fail closed until the new secrets are live — schedule the rotation during a low-traffic window.
POST
/api/v1/webhooks/{id}/rotate-secretSee in the OpenAPI spec →
Send a Formfy intake form after Stripe payment clears
Call this inside your Stripe webhook handler after verifying the checkout.session.completed or payment_intent.succeeded signature. Replace FORM_ID with your published form ID and set recipient_email from the Stripe event payload.
curl -X POST https://formfy.ai/api/v1/forms/FORM_ID/send \
-H "Authorization: Bearer fk_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"recipient_email": "client@example.com",
"message": "Thanks for your payment — please complete your intake form to get started."
}'Frequently asked questions
Does Formfy have a native Stripe integration?
Formfy does not bundle a click-to-connect Stripe integration today. The connection takes roughly 20 lines of webhook handler code: your server listens for Stripe payment events, verifies the signature, extracts the customer email, and calls POST /api/v1/forms/{id}/send. If you prefer no-code, Zapier and Make both support Stripe triggers and can call the Formfy API via their HTTP or Webhooks modules.
Which Stripe events should trigger the form send?
checkout.session.completed is the most reliable trigger for Stripe Checkout flows — it fires after payment confirmation and includes the customer email directly in the payload. payment_intent.succeeded is the better choice when you use Stripe Elements or the Payment Intents API directly. Subscribe to both in a single endpoint and deduplicate on the payment_intent ID to avoid sending the form twice when both events fire for the same transaction.
How quickly does the form reach the customer after payment?
Form delivery is queued immediately on a successful API call and typically lands in the recipient inbox within seconds. The full end-to-end path — Stripe fires its webhook, your handler calls Formfy, Formfy sends the email — completes in under 15 seconds in most production environments. You can pass a custom message in the send payload to personalize the subject line and body the client sees.
Can I send different forms for different Stripe products?
Yes. Build a map of Stripe price IDs or product IDs to Formfy form IDs in your webhook handler config. When checkout.session.completed arrives, read the line_items to identify the purchased product, look up the corresponding form ID, and call POST /api/v1/forms/{id}/send with the right ID. Use GET /api/v1/forms to list all published forms and confirm the IDs before going live.
What happens if the client never signs the form?
Formfy fires a form.expired event when a form link passes its expiration window. Subscribe to that event via POST /api/v1/webhooks with event_types: ["form.expired"]. Your handler can re-send the form via the send endpoint, post a Slack alert, or flag the account in your CRM for a follow-up call. This event loop closes the most common post-payment gap: unsigned paperwork sitting unnoticed for days.
How do I verify Formfy webhook payloads are authentic?
Formfy signs every delivery with HMAC-SHA256 and includes the digest in the X-Formfy-Signature header. In your form.signed handler, recompute HMAC-SHA256(signing_secret, raw_request_body) and compare it to the header value before processing the payload. The signing secret is returned once when you POST /api/v1/webhooks to create the subscription, and can be refreshed at any time with POST /api/v1/webhooks/{id}/rotate-secret.
Does this recipe work with Stripe subscriptions as well as one-time payments?
Yes. For subscription workflows, listen to customer.subscription.created or invoice.payment_succeeded instead of checkout.session.completed. The Formfy send call is identical — extract the customer email and call POST /api/v1/forms/{id}/send. You can differentiate first-cycle versus renewal flows by checking the invoice billing_reason field: subscription_create fires on the first payment, subscription_cycle on all renewals.
Can this work with Zapier or Make instead of custom server code?
Yes. In Zapier, use the Stripe trigger "New Payment" or "Checkout Session Completed", then add a Webhooks by Zapier action set to POST. Point it at https://formfy.ai/api/v1/forms/{id}/send, set the Authorization header to your Bearer token, and map the customer email from the Stripe trigger. In Make, use the Stripe module as the trigger and an HTTP module for the Formfy API call. No custom server required.
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.
