Automation recipe · All recipes

Send a Formfy Form via Twilio SMS

When a client texts your clinic, agency, or studio, someone still has to open a dashboard, find the right form, type the phone number, and hit send — every single time. That three-minute task compounds across dozens of daily messages and turns your front desk into a form-routing queue. One missed step means a client shows up without a signed consent, a job starts without a liability waiver, or a deal stalls waiting for a signature nobody chased.

Connect Twilio to Formfy and route the right form automatically the moment an inbound SMS arrives. Formfy sends a signed-form link back by SMS in seconds — no one on your team has to touch it.

How the recipe flows

  1. Trigger (Twilio)

    An inbound SMS arrives in your Twilio number (or a keyword reply fires a Twilio Studio flow)

  2. Step 1

    Your server or Twilio Studio webhook POSTs to Formfy with the recipient phone number and the target form ID

  3. Step 2

    Formfy delivers the form link to the client via SMS within seconds

  4. Outcome

    The client taps the link, signs on their phone, and the completed consent or intake lands in your dashboard — no app download, no PDF email, no follow-up call

Build the recipe step-by-step

Wire a Twilio inbound-SMS webhook to Formfy's send endpoint so every qualifying text message triggers an automatic form delivery.

  1. Generate a Formfy API key

    Open the Formfy dashboard, go to Settings → API Keys, and click Create key. Copy the fk_live_… token to a secure location — Formfy shows it once. During initial development use a fk_test_… key so test sends do not consume live credits or reach real clients.

  2. Find the form ID you want to send

    Call GET /api/v1/forms to retrieve your form library. Each form object includes an id field — note the id of the intake, consent, or waiver you want to dispatch. You can also list template-generated forms via GET /api/v1/templates if you want to generate a fresh form instance per recipient.

    GET/api/v1/formsSee in the OpenAPI spec →

  3. Configure a Twilio inbound-SMS webhook

    In the Twilio console, open your phone number and set the "A message comes in" webhook URL to an endpoint on your server (or a Twilio Studio HTTP Request widget). This endpoint receives the sender's phone number and message body on every inbound text, giving you the data needed to trigger Formfy.

  4. POST to Formfy to send the form via SMS

    From your webhook handler, call POST /api/v1/forms/{id}/send with your Bearer token and the JSON body containing the recipient phone number. Formfy dispatches an SMS to that number within seconds containing a tap-to-sign link scoped to that recipient — no login or app required.

    POST/api/v1/forms/{id}/sendSee in the OpenAPI spec →

  5. Subscribe to the form.signed webhook for completion alerts

    POST /api/v1/webhooks with event_types: ["form.signed"] and a target_url pointing at your server or a Zapier catch hook. Formfy fires this event the moment the client submits their signature, delivering the submission_id and signer metadata so you can update your CRM, notify staff via Twilio, or trigger a follow-up flow.

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

  6. Download the signed PDF after completion

    When the form.signed event arrives, extract the form id from the payload and call GET /api/v1/forms/{id}/signed-pdf to retrieve a time-limited download token. Pass that token to GET /api/v1/files/pdf/{token} to fetch the final signed document for storage, audit, or forwarding.

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

  7. Test the full SMS loop end-to-end

    Text your Twilio number from a real phone. Confirm your webhook handler calls Formfy and that the form link arrives as an SMS within 30 seconds. Open the link on the phone, complete the form, and verify the form.signed webhook fires and the signed PDF is accessible. Rotate the webhook signing secret quarterly via POST /api/v1/webhooks/{id}/rotate-secret.

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

Send a Formfy form to a phone number via SMS

Replace FORM_ID with the id of your target form and the phone value with the E.164-formatted number extracted from the Twilio inbound-SMS payload. Formfy dispatches the SMS immediately and returns the delivery status.

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": {
      "phone": "+15555550123",
      "name": "Jordan Rivera"
    },
    "message": "Hi Jordan — please sign your intake form before your appointment: {link}"
  }'

Frequently asked questions

Does Formfy send the SMS itself, or do I need Twilio to deliver it?

Formfy sends the form-link SMS directly through its own delivery layer — you do not need to route the outbound message back through Twilio. Your Twilio number handles the inbound trigger (the client's first text), and Formfy handles the outbound form link. The client receives a tap-to-sign URL as a standard SMS within seconds of your server calling POST /api/v1/forms/{id}/send.

Which Formfy events can I listen to after the form is sent?

Five webhook event types are live in v1: form.created, form.sent, form.viewed, form.signed, and form.expired. For SMS-driven workflows, form.signed is the most important — it fires the moment the client submits their signature and delivers the submission_id, signer details, and timestamp. Subscribe to multiple events in a single webhook by passing all of them in the event_types array.

What phone number format does Formfy expect for SMS delivery?

Formfy expects E.164 format for the recipient phone field — for example, +15555550123 for a US number. Twilio's inbound-SMS webhook delivers the From number in E.164 automatically, so you can pass it directly to POST /api/v1/forms/{id}/send without reformatting. Strip any spaces or dashes before forwarding if your system normalizes numbers differently.

Can I send different forms based on the SMS keyword a client texts?

Yes. In your Twilio Studio flow or webhook handler, branch on the message body to select the correct Formfy form ID. For example, text WAIVER → send the liability waiver form, INTAKE → send the new-client intake. Each branch calls POST /api/v1/forms/{id}/send with the matching form ID. Use GET /api/v1/forms upfront to build a keyword-to-form-id map in your handler.

How do I get the signed PDF after a client completes the form on their phone?

Subscribe to the form.signed webhook event. When it fires, extract the form id from the payload and 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 fetch the completed, signed PDF. You can then store it in Google Drive, attach it to a HubSpot deal, or forward it to the client via a Twilio MMS.

Does the client need to download an app to sign the form on their phone?

No. The form link Formfy delivers by SMS opens in the client's mobile browser — Safari, Chrome, or any standard browser works. Clients tap to sign using a finger-drawn signature on the touchscreen. No account, no download, and no login is required. The experience is purpose-built for mobile completion, typically taking under two minutes for a standard consent or intake form.

How do I prevent the same client from receiving duplicate form SMS messages?

Track sent form IDs server-side — store the Formfy form id alongside the recipient phone number in your database when you call sendForm. Before each send, query that store to check whether a form is already outstanding for that number. Alternatively, call GET /api/v1/forms/{id}/signers after sending to confirm the signer status: if the form is already delivered and unsigned, hold the next dispatch until form.signed or form.expired fires.

What happens if the client never signs the form?

Formfy emits a form.expired webhook event when the form's expiry window closes without a signature. Subscribe to this event in your POST /api/v1/webhooks call alongside form.signed. In your handler, use the expiry event to trigger a Twilio follow-up SMS reminding the client that their form has expired and prompting them to request a fresh link from your team.

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.