DOCS

CRM & Marketing Integrations

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.

Integrations overview screen

Available Integrations

PlatformTypeKey use
MailchimpEmail marketingAudience sync, tags, double opt-in
BrevoEmail + SMSMulti-list sync, contact attributes, double opt-in
ActiveCampaignMarketing automationContacts, tags, deals pipeline
HubSpotCRMContacts, lifecycle stages, deals
WP FusionWordPress bridgeConnect to 100+ CRMs via WP Fusion
ZapierWorkflow automation5,000+ app connections, subscription model
WebhooksHTTP callbacksSend 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:

  1. Configure the integration with your API credentials.
  2. Choose which events trigger a sync (see the trigger table on each integration page).
  3. Optionally set up Automation Rules for delays or conditional logic.
  4. Use the built-in test button to verify the connection.
  5. Monitor activity in Sync Logging.

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 keyFires when
action_createdA new fundation (fundraising page) is published
action_updatedAn existing fundation is edited and saved
action_completedA fundation reaches its fundraising goal
action_expiredA fundation passes its end date
action_claimedA guest-created fundation is claimed by a user
donation_receivedA donation payment is confirmed (requires marketing consent)
donation_failedA donation payment fails
user_registeredA new user registers via the Fundations wizard
campaign_joinedA user joins an existing campaign
team_createdA new team is created under a campaign
milestone_reachedA 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

FilterPurpose
get_fund_integration_triggersAdd or modify available triggers
get_fund_integration_trigger_dataModify 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.)