Requires: Fundations Pro 1.1.0+
Creates and updates contacts in HubSpot CRM when donors donate or fundraisers create pages. Optionally creates deals per donation and sets lifecycle stages. Authentication uses a HubSpot Private App Access Token.

Why use it
HubSpot is a widely used CRM that many organisations already have for sales and marketing. Connecting it to Fundations means donor data flows directly into your existing contact database alongside all other interactions. No manual data entry required.
What it does
When a trigger fires, the connector creates or updates a HubSpot contact using the CRM v3 API. It sets the configured lifecycle stage and writes custom properties for donation data.
Custom HubSpot properties written by the connector:
get_last_donation_amountget_last_donation_date(Unix millisecond timestamp)get_fund_action_titleget_fund_goal_amountlifecyclestage(standard property, set to configured stage)
If deal creation is enabled, the connector creates a deal via the CRM v3 deals endpoint and associates it with the contact.
The sync_donors setting gates donation_received. The sync_fundraisers setting gates user_registered, action_created, campaign_joined, and team_created. Turning either off causes those triggers to be skipped.
Supported triggers
| Trigger | Syncs when | Gated by |
|---|---|---|
donation_received | A donation is confirmed (requires marketing consent) | sync_donors |
user_registered | New user registers via the wizard | sync_fundraisers |
action_created | A new fundation is created | sync_fundraisers |
action_completed | A fundation reaches its goal | sync_fundraisers |
campaign_joined | A user joins a campaign | sync_fundraisers |
team_created | A new team is created | sync_fundraisers |
How to set it up
- In HubSpot, create a Private App (Settings → Integrations → Private Apps). Give it at minimum the scopes:
crm.objects.contacts.write,crm.objects.deals.write(if using deals). - Copy the Access Token from the Private App page.
- Navigate to Fundations Pro → Integrations → HubSpot.
- Enter the Access Token and save.
- Toggle Sync Donors and/or Sync Fundraisers as needed.
- Select a Donor Lifecycle Stage and Fundraiser Lifecycle Stage from the dropdowns.
- To create deals: enable Create Deals, then select a Pipeline and Stage. The pipeline selector loads from your HubSpot account.
- Click Test to verify the connection.
- Enable the integration.

Settings and options
| Setting | Type | Description |
|---|---|---|
| Access Token | Password (encrypted) | HubSpot Private App access token |
| Sync Donors | Checkbox | Enables syncing on donation_received |
| Sync Fundraisers | Checkbox | Enables syncing on fundraiser-related triggers |
| Donor Lifecycle Stage | Select | Stage assigned to donor contacts |
| Fundraiser Lifecycle Stage | Select | Stage assigned to fundraiser contacts |
| Create Deals | Checkbox | Creates a HubSpot deal per donation |
| Deal Pipeline | Select | The HubSpot pipeline for new deals |
| Deal Stage | Select | The stage within the pipeline (shown as Pipeline → Stage) |
Available lifecycle stage values: subscriber, lead, marketingqualifiedlead, salesqualifiedlead, opportunity, customer, evangelist, other.
Authentication uses Authorization: Bearer against https://api.hubapi.com/. There is no OAuth flow in the connector.
What you can and cannot do
You can create or update HubSpot contacts for donors and fundraisers, set a lifecycle stage per contact type, create deals associated with donor contacts, write custom properties for donation amounts and dates, and enable donor and fundraiser syncing independently.
You cannot sync a donor who did not give marketing consent, enrol contacts directly into HubSpot Workflows from Fundations (configure workflows in HubSpot to trigger on property changes set by this integration), remove contacts or downgrade a lifecycle stage automatically, or create contacts via donation_failed (the failed trigger is not supported).
Examples
Basic contact sync: enable sync_donors, set donor lifecycle stage to lead. Every consenting donor becomes a HubSpot lead automatically.
Donor deal pipeline: enable Create Deals, select your fundraising pipeline and an initial stage like “Donation Received”. Each donation creates a deal valued at the donation amount, associated with the donor.
Fundraiser as customer: enable sync_fundraisers, set fundraiser lifecycle stage to customer. Users who create fundations are treated as engaged customers in your CRM.
Goal-reached properties: the get_fund_raised_amount and get_fund_goal_amount properties are updated on action_completed. Create a HubSpot workflow that fires when get_fund_raised_amount equals get_fund_goal_amount for follow-up.
Troubleshooting
| Problem | Likely cause | Fix |
|---|---|---|
| “Unauthorized” error | Invalid or expired access token | Regenerate the token in HubSpot Private Apps |
| Contacts created but no lifecycle stage | Stage not selected in settings | Choose a stage for donors and/or fundraisers |
| Deals not appearing | Create Deals unchecked or pipeline not selected | Enable the setting and pick a pipeline |
| Custom properties missing in HubSpot | Properties not created in HubSpot | Create the get_last_donation_amount etc. properties manually in HubSpot Settings → Properties |
| Pipeline dropdown is empty | Token lacks deal scopes | Add crm.objects.deals.write scope to the Private App |
Developer reference
The HubSpot connector uses HubSpot CRM API v3. Deals are created at crm/v3/objects/deals and associated to contacts via crm/v3/objects/deals/{id}/associations/contacts/{cid}/deal_to_contact.
Use the shared integration filters to modify data:
add_filter( 'get_fund_integration_trigger_data', function( $data, $trigger, $object_id ) {
if ( $trigger === 'donation_received' ) {
// Add a value that maps to a custom HubSpot property
$data['hs_campaign_source'] = get_post_meta( $data['action_id'], '_source', true );
}
return $data;
}, 10, 3 );
See Integration index developer reference for full filter signatures.