Relating Contacts to Deals

I am a marketer responsible for driving trials. I am having a hard time tying the contact attributes like a form fill, lifecycle stage, and source to a deal and it’s stage.

My goal is to be able to look back at trials generated in a previous month and see specifically the deals associated with those form signups and their deal stage. Please help!

Hi @zacbadgley,

Form submissions aren’t a data source in the custom report builder (yet), so this requires a small workaround. For this workaround, a Professional subscription is needed; without one, this can currently not be solved.

The approach here is as follows:

  1. Create a custom contact dropdown property with options corresponding to each of your forms
  2. Add this property as a hidden field on each form and pre-select the option matching the form (e.g. your dropdown has the option “Form A”, add the hidden field on form A and select the value “Form A”, see here: Pass contact property values with hidden form fields)
  3. Create a custom deal dropdown property with the exact same options
  4. Use a contact-based workflow to enroll contacts when the custom contact property is known (enable re-enrollment), then use the “Copy property value” workflow action to update the value of the custom deal property from step 3.
  5. You now have a property on the deal record which tells you which form submission it is associated to.

Keep the following things in mind:

  • Multiple touchpoints are not recorded with a dropdown property. If these are likely, use a multiple checkboxes property, and in step 4 append values instead of replacing them.
  • This will only work from now on, going forward, unless you retroactively bulk edit contacts who submitted a form so they get their respective value in the property from step 1.

Let me know if you have any follow-up questions!

@karstenkoehler This is a great recommendation. Before I accept it as a solution, I’m realizing in a few weeks, our current trial request form will be replaced with an upgrade trial provisioning process and will begin using an API call instead of a HubSpot form. I’m not sure if that would mean major changes to the recommendations, but have some additional details that may help with setting a plan that works now and in the next phase.

Trials enter to HubSpot as “lead” status (currently with HS form). A related workflow also marks the lead as marketing contact, sends a confirmation email, and routes non-qualified leads a separate notification (primarily students). Sales/Marketing do some manual processing to decide if it’s Unqualified, Marketing Qualified, or a sales Opportunity.

Because I am looking at the deals data from the perspective of marketing-influenced trials, I want to report on only deal stages that have a contact associated with the deal that occurred because of 1) Current Trial Request HubSpot Form or 2) Current API call for lower-value sandbox conversion.

That said, do you think the same workaround applies or would there be other ways to do this with the contact source/lifecycle and the upcoming signup process moving from HS form to API call from our product?

@zacbadgley I don’t see an issue with submitting the form via API or updating the contact record via API. You would simply set the hidden field value directly then, not having to hide that field.


@zacbadgley wrote:

I want to report on only deal stages that have a contact associated with the deal that occurred because of 1) Current Trial Request HubSpot Form or 2) Current API call for lower-value sandbox conversion.


This however I don’t think is possible. If you look at touchpoint X and event Y, you can never be sure that Y was because of X. This will always be an approximation, regardless of the technical solution you choose. It’s just that Y came after X and that’s why it’s very likely that Y was caused by X. But it doesn’t have to be.

I believe i’ll run into a problem in step 4 if the deal has yet to be created. There could be a lag between the form fill (update of contact property) and a deal being created.

@karstenkoehler