Requires: Fundations Pro 1.1.0+
Connect Fundations to marketing platforms and CRMs so that donor and fundraiser data flows automatically when events occur on your site. Every integration is part of Fundations Pro; none of this functionality is available in the free plugin.

Available Integrations
| Platform | Type | Key use |
|---|---|---|
| Mailchimp | Email marketing | Audience sync, tags, double opt-in |
| Brevo | Email + SMS | Multi-list sync, contact attributes, double opt-in |
| ActiveCampaign | Marketing automation | Contacts, tags, deals pipeline |
| HubSpot | CRM | Contacts, lifecycle stages, deals |
| WP Fusion | WordPress bridge | Connect to 100+ CRMs via WP Fusion |
| Zapier | Workflow automation | 5,000+ app connections, subscription model |
| Webhooks | HTTP callbacks | Send event data to any URL |
How Integrations Work
The integration system has two layers: a set of connector classes (one per platform) and an automation rules engine that routes events to those connectors with optional delays.
Direct path: Each integration listens for specific plugin events and sends data to its platform immediately.
Rules path: Automation Rules let you route events to integrations with a configurable delay (minutes, hours, or days) and per-rule field or list overrides. When rules exist, the rules engine takes precedence over the direct path.
The general flow is:
- Configure the integration with your API credentials.
- Choose which events trigger a sync (see the trigger table on each integration page).
- Optionally set up Automation Rules for delays or conditional logic.
- Use the built-in test button to verify the connection.
- Monitor activity in Sync Logging.
Marketing Consent Requirement
The donation_received trigger, present on every integration, only fires when the donor has given marketing consent on the donation form. If a donor does not check the marketing consent checkbox, no sync occurs for that donation. This applies to all integrations without exception.
This is intentional GDPR behaviour. If you need to capture all donors regardless of consent, use a separate mechanism (such as your own webhook endpoint) and handle the legal basis yourself.
Supported Triggers
The following events can trigger an integration. Not every integration supports every trigger; see each page for the supported subset.
| Trigger key | Fires when |
|---|---|
action_created | A new fundation (fundraising page) is published |
action_updated | An existing fundation is edited and saved |
action_completed | A fundation reaches its fundraising goal |
action_expired | A fundation passes its end date |
action_claimed | A guest-created fundation is claimed by a user |
donation_received | A donation payment is confirmed (requires marketing consent) |
donation_failed | A donation payment fails |
user_registered | A new user registers via the Fundations wizard |
campaign_joined | A user joins an existing campaign |
team_created | A new team is created under a campaign |
milestone_reached | A fundation hits 25%, 50%, or 75% of its goal |
The action_completed trigger fires only once per fundation (guarded internally). The milestone_reached trigger fires once per milestone level per fundation.
Data Payload
Every integration receives a flat array of fields from the event. The exact fields depend on the trigger, but the full set of available keys is:
User fields: user_id, user_email, user_first_name, user_last_name, user_display_name, user_login, user_registered, user_url
Fundation fields: action_id, action_title, action_content, action_url, action_goal, action_raised, action_raised_offset, action_raised_display, action_progress, action_status, action_end_date, action_created, action_image, creator_email, creator_first_name, creator_last_name, creator_name, creator_anonymous, structure_type, campaign_id, campaign_title, team_id, team_name, is_campaign
Donation fields: donation_id, donation_amount, donation_currency, donation_date, donation_status, payment_method, donor_email, donor_first_name, donor_last_name, donor_name, action_id, is_anonymous, message, marketing_consent
Special fields: site_name, site_url, claim_url (guest action_created only), milestone (integer: 25, 50, or 75, on milestone_reached only), error (on donation_failed only)
Rate Limiting
The integration system allows a maximum of 5 trigger firings per object ID per 60-second window. Events beyond this limit are dropped silently. This prevents feedback loops but also means that rapid updates to the same fundation in quick succession may not all sync.
Developer Reference
See the individual integration pages for connector-specific hooks. The filters below apply to all integrations.
Filters
| Filter | Purpose |
|---|---|
get_fund_integration_triggers | Add or modify available triggers |
get_fund_integration_trigger_data | Modify the data payload before it is sent |
// Add a custom trigger
add_filter( 'get_fund_integration_triggers', function( $triggers ) {
$triggers['custom_event'] = [
'label' => 'Custom Event',
'description' => 'Fires when your custom event occurs.',
'data_fields' => [ 'action_id', 'action_title', 'user_email' ],
];
return $triggers;
} );
// Modify outgoing data for all integrations
add_filter( 'get_fund_integration_trigger_data', function( $data, $trigger, $object_id ) {
if ( $trigger === 'donation_received' ) {
$data['custom_source'] = get_post_meta( $data['action_id'], '_my_source', true );
}
return $data;
}, 10, 3 );
Action fired after each trigger
do_action( 'get_fund_after_integration_trigger', $trigger, $data, $object_id );
// @param string $trigger Trigger key, e.g. 'donation_received'
// @param array $data The full flat data payload
// @param int $object_id The primary object ID (donation ID, action ID, etc.)