Skip to main content
HubSpot and ClickFlare Integration HubSpot is a CRM and marketing platform. Your forms create contacts in it, and your team moves those contacts through lifecycle stages and deals until they become customers. A form fill is easy to track. What you want to optimize on is what happens later: the lead your sales team qualifies, the deal that closes. Those happen in HubSpot, days or weeks after the click. This guide connects the two:
  • ClickFlare → HubSpot: ClickFlare passes its click ID to your page, and a hidden HubSpot form field saves it on the contact.
  • HubSpot → ClickFlare: when the contact reaches the stage you choose, a HubSpot workflow sends the conversion to ClickFlare with that click ID.
Each stage arrives as its own custom conversion, so form fills, qualified leads and customers show as separate columns next to your ad cost. An optional last section covers the reverse direction: sending ClickFlare conversions into HubSpot.

At a glance

To set up HubSpot with ClickFlare:
  1. Create a custom conversion per stage.
  2. Create the property and hidden field.
  3. Add your page as the offer.
  4. Build the workflow webhook.
  5. Test, then turn it on.
Each step is explained in Setup.

How the data flows

The URL parameter name must be the internal name of the HubSpot property. HubSpot fills form fields, hidden ones included, from query string keys that match a property’s internal name.

What you’ll need

  • A ClickFlare account with your own tracking domain, served over HTTPS. HubSpot only sends webhooks to URLs that begin with https. See Tracking domains.
  • A HubSpot form on the page your ads send traffic to. HubSpot says filling form fields from a query string works on all products and plans.
  • A HubSpot subscription that includes workflow webhooks. HubSpot’s own article lists Data Hub Professional or Enterprise for webhooks in workflows.
  • Edit permission for workflows (or Super Admin) to add the webhook, and Publish permission to turn the workflow on.

Setup

1

Set up your own tracking domain

Add a custom tracking domain, for example trk.yourdomain.com, under Tracking domains. The webhook URL in HubSpot is built on it, so changing it later means editing every workflow.
2

Create a custom conversion for each stage

In ClickFlare, go to Settings → Custom Conversions and create one custom conversion per stage you want as a column. For example:The parameter you give each custom conversion is the ct value HubSpot sends. It must match exactly. See Custom conversions.
3

Create the click ID property in HubSpot

In HubSpot, create a single-line text contact property for the click ID, for example ClickFlare click ID. Then click the settings icon, go to Properties, open the property and copy its Internal name. This guide assumes it is cf_click_id.
4

Add the property to your form as a hidden field

Open the HubSpot form on your page, add the click ID property and make it a hidden field. Publish the form.
5

Create the campaign and add your page as the offer

Go to Campaigns → New Campaign, pick your traffic source and tracking domain. See Creating a campaign.In the campaign path, create a new offer inline. Set its URL to the page with the HubSpot form, with the property’s internal name as the parameter:
If your property’s internal name is different, use that name instead of cf_click_id on the left of the =. Keep {cf_click_id} with its braces on the right. Set the offer payout to Auto so ClickFlare uses the payout HubSpot sends.Save the campaign and copy the campaign URL for your ads.
6

Build the workflow

In HubSpot, go to Automation → Workflows (under More if your menu shows it) and create a contact-based workflow. Set the enrollment trigger to the stage you report, for example Lifecycle stage is Sales qualified lead.Click the + icon, and in the Data ops section select Send a webhook.
7

Configure the webhook as a JSON POST

  1. Set Method to POST.
  2. Set the webhook URL to https://trk.yourdomain.com/cf/cv.
  3. Leave authentication off. ClickFlare’s postback doesn’t need it.
  4. Select Customize request body, then add these keys:
For a purchase that can happen more than once per contact, also add txid with a value unique per conversion, such as a record ID.HubSpot sends these keys in the request body. ClickFlare reads cf_click_id, ct, payout, txid and param1 to param20 from a JSON body:
Don’t choose Include all contact properties. That sends HubSpot’s own JSON with every property, and ClickFlare can’t find the click ID in it.
8

Test the action, then turn the workflow on

Open Test action, enter a real ClickFlare click ID as the property test value and click Test. Check the Request tab to see the body HubSpot sent: it should be a JSON object with your three keys. If it isn’t, switch to the GET option. Then check ClickFlare (see Verify the setup). Repeat the workflow for each stage, each with its own ct.

Option: GET postback with query parameters

Use a GET webhook if you prefer the URL postback, or if the POST test doesn’t send a clean JSON body. It carries the same values, txid included. In Send a webhook, set Method to GET and the URL to https://trk.yourdomain.com/cf/cv. Under Query parameters, add each key and pick a property or enter a static value: HubSpot builds the same request as this postback:
Note the key is click_id in the URL and cf_click_id in a JSON body.

Stages, payout and duplicates

One stage, one ct. A conversion with a different ct on the same click is added as a new conversion, not a replacement. So a contact that fills the form, qualifies and buys shows once in each of the three columns. Your reports then show cost per lead, cost per qualified lead and cost per customer side by side. Send the traffic source only what matters. Each custom conversion is mapped to your traffic source’s postback separately. You can keep form fills in ClickFlare and send only qualified or won to the ad platform to optimize on. Payout from the deal amount. In a contact-based workflow, payout can only use contact properties or a static value. To send the deal Amount, build the won webhook in a deal-based workflow (for example, deal stage is closed won). The click ID has to be on the deal for that, so copy it from the contact to a deal property first. Check which property-copy options your HubSpot account offers, and test with one deal. Repeats. If HubSpot sends the same ct for the same click again (a contact re-enrolled in the workflow), it counts as the same conversion. To count a second purchase separately, send a unique txid in the JSON body or the GET query.

Retries and rate limits

  • HubSpot retries a failed webhook for up to three days, starting one minute after the failure, with up to eight hours between tries. A short outage doesn’t lose the conversion.
  • HubSpot does not retry 4XX responses, except 429. A wrong URL fails once and stays failed.
  • Configure rate limit on the action slows the webhook and every action after it. You only need it if you enroll many contacts at once.

Verify the setup

1

Click through the campaign

Open your ClickFlare campaign URL. The page should load with cf_click_id= followed by a real click ID, not the text {cf_click_id}.
2

Submit the form

Submit the form with a test email. In HubSpot, open the new contact and check the click ID property holds the same ID.
3

Move the contact to the stage

Change the contact’s lifecycle stage so it enrolls. In the workflow’s action logs, check that Send a webhook ran.
4

Check ClickFlare

In Logs → Event Logs, the conversion should appear with your ct and payout, on the campaign you clicked through.

Send ClickFlare conversions to HubSpot (optional)

The setup above sends HubSpot stages to ClickFlare. To go the other way, for example to tag a HubSpot contact when ClickFlare records a purchase from another system, use the Custom Webhook integration:
  1. Go to Integrations → Conversion API → New integration and choose Webhooks.
  2. Map the ClickFlare event you want to send, choose POST, and enter the endpoint that receives it.
  3. Put macros such as {cf_click_id} and {payout} in the body. ClickFlare adds Content-Type: application/json to POST webhooks with JSON.
HubSpot needs to know which contact the event belongs to, and the click ID alone isn’t a HubSpot identifier. The simplest receiver is a Zapier, Make or n8n webhook that finds the contact by the click ID property and updates it.

Troubleshooting

  • The URL parameter isn’t the property’s internal name. Copy it again from Settings → Properties.
  • The page URL has {cf_click_id} as literal text. The offer URL in ClickFlare must have the token with braces, and traffic must come through the ClickFlare campaign URL.
  • A lander sits before the form page and links straight to it. The lander’s CTA must use the ClickFlare click URL so the click ID is added on the way to the offer.
  • The campaign uses direct tracking. Then the click ID is not in the page URL. See Direct tracking.
  • The body uses click_id instead of cf_click_id, or the GET URL uses cf_click_id instead of click_id.
  • The ct value doesn’t match a custom conversion’s parameter exactly.
  • The webhook URL isn’t on your tracking domain, or the path isn’t /cf/cv.
  • Include all contact properties is selected instead of Customize request body.
See Troubleshooting S2S postbacks.
HubSpot only accepts URLs that start with https. Use your tracking domain with SSL.
Check that payout is mapped to a number property with a value on that record, and that the offer payout is set to Auto in ClickFlare.

FAQ

Yes. A hidden HubSpot form field saves the ClickFlare click ID on the contact, and a workflow’s Send a webhook action sends it to ClickFlare when the contact reaches a stage.
Yes. Put the conversion tracking pixel on the thank-you page with ct=lead, and use HubSpot workflows only for the later stages.
HubSpot lists webhooks in workflows under Data Hub Professional and Enterprise. Check your subscription in HubSpot before you build. Filling form fields from the query string works on all plans.
Use a relay. Trigger Zapier, Make or n8n from the HubSpot stage change and have it call the ClickFlare postback. If you only get the data later as a file, use Conversion Upload.
Yes. Add param1 to param20 as keys in the body or the query parameters. ClickFlare stores them with the conversion.

Custom conversions

One ct per stage

Postback parameters

click_id, txid, ct

Salesforce

The same flow in Salesforce