Gravity Forms HubSpot integration can be simple. By the end of this tutorial, you’ll have a working form that fills in a person’s first name, last name, and phone number the moment you enter their email no coding needed. It feels like magic: type the email, and the rest appears.
You’ll set this up in a few clear steps: add one contact in HubSpot for testing, create a secure one-time token in HubSpot, connect it in the GravityWP API Connector, and map the returned details to your form fields. When you’re done, your site will save visitors time, reduce typos, and keep data consistent with your HubSpot records.
1) Prepare HubSpot (contact + token)
We need one real contact in HubSpot for the lookup, and a Private App token for authentication.
- In HubSpot, open Contacts and create a test contact with email, first name, last name, and phone.

- Create a Private App in your portal (your UI may show this under Development → Legacy Apps → Private). Grant only the read scope for contacts (for example:
crm.objects.contacts.read). Copy the Access token (starts withpat-…). Keep it secret. You won’t use the Client secret for this tutorial.



crm.objects.contacts.read for this GET-only Gravity Forms HubSpot integration.
2) Build the Gravity Form
Create a form name it anything that make sense and add these fields: Emai, First Name, Last Name, Phone (In this tutorial I used single line text for this fields). Optionally add a temporary JSON Paragraph Text field to hold the full response while testing. Note the field IDs; in this example Email is ID 1, First Name ID 3, Last Name ID 4, Phone ID 5.

3) Add the HubSpot connection in API Connector
Open Forms → Settings → API Connector → Add connection.
Name it anything that make sense but in this tutorial I named it HubSpot (Private App). Set Base URL to https://api.hubapi.com. Choose Authentication method: Bearer Token, then paste your pat-… token and save.

4) Create the GET feed (lookup by email on change)
Open your form → Settings → API Connector → Add New Feed. Select the HubSpot (Private App) connection and set Request Method to GET.
Endpoint (relative to base URL):
/crm/v3/objects/contacts/{Email:1}
{Email:1} is the Gravity Forms merge tag for the Email field value.
Query String (GET) parameters
idProperty = emailproperties = email,firstname,lastname,phone,hs_object_id
Trigger
Choose On form submission and enable store full response and map your JSON paragraph field in order to check the full response when you submit an entry
Target Fields (response → form)
- First Name ←
properties/firstname - Last Name ←
properties/lastname - Phone ←
properties/phone


Why these mappings?
HubSpot’s Contacts v3 API returns a single record with an id and a properties object. First name, last name, and phone live inside properties, so paths like properties/firstname are accurate and stable for this use case.
5) Test the auto-populate
Preview the form. Type the email that exists in HubSpot and tab out. You should see First Name, Last Name, and Phone fill in. Submit the form and review the entry to confirm values. If you mapped JSON for testing, you’ll see the full response, which is handy while you refine mappings.


Why this Gravity Forms HubSpot integration works
It’s read-only and minimal. The Private App token stays on the server in WordPress. The scope is limited to contacts read, so you can’t change HubSpot data by mistake. Using idProperty=email in the endpoint path keeps the request simple; you don’t need a separate search body. Mapping is straightforward because the response groups values inside properties
Optional next step for this integration (POST/PATCH)
If later you want to create or update contacts on submit, add a separate feed that uses PATCH with idProperty=email and expand your Private App scopes to include write access. Keep the GET feed as a dedicated prefill so it stays fast and safe.
Troubleshooting your Gravity Forms HubSpot integration
- Fields don’t fill: Confirm the email exists in HubSpot and matches exactly. Check the feed trigger is set to fire on Email change.
- Auth errors: If you rotated the token in HubSpot, paste the new
pat-…into the connection. Ensure the read scope is granted. - Wrong values: Re-check your Target Field paths:
properties/firstname,properties/lastname,properties/phone, andid. - Cleanup: Once verified, remove the temporary JSON field and keep only the mapped fields you need.
What you achieved with this Gravity Forms HubSpot integration
You built a Gravity Forms HubSpot integration that auto-populates user details with a single GET request. It’s secure, fast, and easy to maintain. From here, you can map any other HubSpot contact property the same way.
Read tutorials about
How to Replace Zapier with n8n (Using the GravityWP n8n Connector)
Tired of burning Zapier tasks on every Gravity Forms submission? This guide shows you how to replace Zapier with n8n using the GravityWP n8n Connector. You’ll learn how to move an existing Zap step-by-step into n8n, cut automation costs, and keep full control over where your data lives.
n8n vs Zapier: Which Automation Tool Actually Fits Your Work?
Trying to decide between n8n vs Zapier? This article breaks down pricing, hosting, integrations, AI features, and where self-hosted n8n on a cheap VPS can beat Zapier’s task-based plans. You’ll also see how Gravity Forms users can plug in the GravityWP n8n Connector and move key workflows off Zapier without rebuilding their forms.
Cloudflare Tunnel + n8n: Expose Local n8n for Webhook Testing (Dev Only)
This guide shows how to use Cloudflare Tunnel Quick Tunnels to put a local n8n instance on the internet for real webhook testing. It’s a dev-only recipe that lets tools like GravityWP’s n8n Connector call your local n8n over HTTPS, without renting a VPS or opening ports.
Self-Host n8n with Docker on a VPS
Learn how to self-host n8n with Docker on a VPS using a production-ready setup. This step-by-step guide walks you through configuring Docker Compose, Postgres, HTTPS, and WEBHOOK_URL so you can run reliable, secure n8n workflows on your own server.