Automation recipe · All recipes
GoHighLevel Lead to Formfy Intake Automation
Agencies running GoHighLevel pipelines collect leads all day, then manually email intake forms, chase signatures, and re-enter data when the PDF finally comes back. A booked consultation with no signed intake forces the provider to delay the session or skip the paperwork entirely. Multiply that across every sub-account and every campaign, and the manual handoff between your CRM and your form stack becomes the highest-friction point in the client lifecycle.
Wire GoHighLevel's Workflow webhooks to Formfy's send endpoint. The moment a contact hits a trigger stage, Formfy dispatches a signed intake form by email or SMS — no manual steps, no chasing PDFs.
How the recipe flows
Trigger (GoHighLevel)
A contact is created or advances to a qualifying pipeline stage in GoHighLevel
Step 1
GoHighLevel Workflow fires a POST webhook to the Formfy send endpoint
Step 2
Formfy dispatches the intake form to the contact by email or SMS
Outcome
The lead receives and signs a Formfy intake or consent form before the first appointment, and the signed PDF is available for download and logging back into the contact record
Build the recipe step-by-step
Configure a GoHighLevel Workflow to POST to the Formfy API on a lead trigger and collect signed intake forms from every new contact automatically.
Generate a Formfy API key
Open the Formfy dashboard, navigate to Settings → API Keys, and click Create key. Copy the fk_live_… token to your password manager — Formfy shows it only once. During GoHighLevel workflow testing, use a fk_test_… key so no live form credits are consumed. You will paste this token into GHL's Webhook action headers in step 4.
List your published intake forms
Call GET /api/v1/forms to retrieve every form in your Formfy workspace. Find the intake or consent template you want to dispatch to new leads and note its id. If the intake form does not exist yet, POST /api/v1/forms/generate with a plain-language description and Formfy builds a field set from it automatically.
GET
/api/v1/formsSee in the OpenAPI spec →Configure your GoHighLevel Workflow trigger
In GoHighLevel, open Automations → Workflows and create a new workflow. Set the trigger to Contact Created, Pipeline Stage Changed, or Tag Added — whichever maps to a qualified lead in your funnel. Name the step clearly so future sub-accounts can copy the workflow without guessing when the intake form fires.
Add a Webhook action in GoHighLevel to send the form
Add a Webhook action after the trigger step. Set the method to POST, the URL to https://formfy.ai/api/v1/forms/{id}/send (replace {id} with the form id from step 2), and the Authorization header to Bearer fk_live_YOUR_KEY. Map GHL's {{contact.email}} and {{contact.phone}} merge fields into the JSON body so Formfy routes the form to the correct lead.
POST
/api/v1/forms/{id}/sendSee in the OpenAPI spec →Subscribe to form.signed events to update the contact
POST /api/v1/webhooks with event_types set to ["form.signed"] and target_url pointing to a GoHighLevel inbound webhook or Make.com scenario. When the lead signs, Formfy posts the signer email, form id, and a PDF download token to your URL, letting the GHL workflow advance — tagging the contact, moving the pipeline stage, or sending a confirmation SMS.
POST
/api/v1/webhooksSee in the OpenAPI spec →Retrieve and store the signed PDF
Once the form.signed event fires, call GET /api/v1/forms/{id}/signed-pdf to get the download token for the completed document. Fetch the PDF from GET /api/v1/files/pdf/{token} and attach it to the GoHighLevel contact's document record or forward it to the clinic's intake folder. The token is scoped and time-limited, so download it on first receipt.
GET
/api/v1/forms/{id}/signed-pdfSee in the OpenAPI spec →Test the automation end-to-end
Create a test contact in GoHighLevel that meets your trigger criteria. The workflow should fire within seconds, POST to Formfy, and dispatch the form. Open the test email or SMS link to sign the form, then confirm the form.signed webhook delivered to GHL and the contact tag or pipeline stage updated correctly. Remove the test contact when finished.
Send a Formfy intake form when a GoHighLevel contact enters the pipeline
Call this from a GoHighLevel Webhook action. Replace {id} with your intake form's Formfy id and swap in GHL merge fields for email and phone.
curl -X POST "https://formfy.ai/api/v1/forms/frm_YOUR_FORM_ID/send" \
-H "Authorization: Bearer fk_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"email": "{{contact.email}}",
"phone": "{{contact.phone}}",
"message": "Hi {{contact.firstName}}, please complete your intake form before your appointment."
}'Frequently asked questions
Does Formfy have a native GoHighLevel integration?
Not yet in the GoHighLevel Marketplace, but Formfy's public REST API connects cleanly to GoHighLevel Workflows via the built-in Webhook action. You configure the connection once per workflow — no third-party connector required. A dedicated GoHighLevel sub-app or HighLevel Marketplace listing is on the Formfy roadmap but is not needed to run intake automation today.
Which GoHighLevel trigger events pair best with a Formfy intake form?
Contact Created and Pipeline Stage Changed are the highest-signal triggers. Contact Created fires the moment a lead fills out a GHL landing page form, making it ideal for immediate dispatch. Pipeline Stage Changed lets you gate the intake on a qualifying step — send the form only after a rep books a consultation call, not on every raw lead capture.
Can I send a Formfy form via SMS through GoHighLevel?
Yes. Include a phone field in the POST /api/v1/forms/{id}/send request body. Formfy dispatches the form link as an SMS alongside the email. Combine this with GoHighLevel's SMS reply trigger: when the contact texts back a keyword, GHL can advance the pipeline and fire another Formfy send for a follow-up waiver if the original intake was not completed.
How do I route the signed PDF back into the GoHighLevel contact record?
After the form.signed webhook fires, call GET /api/v1/forms/{id}/signed-pdf to get a download token, then GET /api/v1/files/pdf/{token} to pull the file. Post the PDF URL to GoHighLevel's contact document endpoint, or route it through Make.com with a GoHighLevel module. Tagging the contact with intake-signed on receipt is a simpler alternative if you only need status tracking rather than document storage.
What if the lead never opens or signs the intake form?
Formfy fires a form.expired event when the link ages out. Subscribe to that event by adding "form.expired" to the event_types array when you POST /api/v1/webhooks. When GHL receives the expired signal, re-trigger a reminder SMS, move the contact to a re-engagement stage, or dispatch a fresh form link automatically — no daily manual audit of unsigned forms required.
Can multiple GoHighLevel sub-accounts send forms through one Formfy account?
Yes. One Formfy API key covers all forms in a single Formfy workspace. Agency operators typically create one intake form per clinic or service type and share the same fk_live_… key across multiple GoHighLevel sub-account workflows. If a sub-account needs isolated billing or branding, create a separate Formfy workspace and generate a dedicated API key for it.
Is there a rate limit on Formfy form sends from GoHighLevel?
Yes. Rate limits are enforced per API key and scale with your Formfy plan. X-RateLimit-Remaining and X-RateLimit-Reset response headers show how much headroom remains in the current window. For high-volume agency campaigns, add time delays inside your GoHighLevel Workflow rather than firing all sends at once. GoHighLevel logs failed webhook attempts so you can replay any that hit the limit.
How do I verify that a Formfy webhook delivery is authentic?
Formfy signs every delivery with HMAC-SHA256 and includes the digest in the X-Formfy-Signature header. If you route deliveries through Make.com or Zapier first, add a code step that recomputes the HMAC against the secret returned when you POSTed to /api/v1/webhooks. Reject payloads that fail verification before advancing the GoHighLevel pipeline — this blocks replay attacks from forged webhook calls.
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.
