This page documents all action hooks and filters that Fundations (FREE, version 2.8.x) exposes for third-party code. Hooks are grouped by subsystem. Each entry lists the parameter signatures as they appear in the source.
Use add_action() for action hooks and add_filter() for filters. All hooks use the get_fund_ prefix.
Why use hooks and filters
Hooks let you extend Fundations behavior without editing plugin files. You can send notifications when donations complete, restrict who can edit a fundraiser, change how amounts are displayed, modify the child-actions query, or add custom validation to the wizard.
Important: get_fund_donation_paid vs get_fund_donation_completed
Two hooks fire when a donation is confirmed. The distinction matters for production use.
get_fund_donation_paid fires in trait-donation-lifecycle.php when a real payment is confirmed. The Stats Model listens to this hook to recalculate totals. Use this hook for any logic that requires an actual payment, such as updating external systems or sending receipts.
get_fund_donation_completed fires in test mode, leads/petition mode, and via the PayPal return and webhook paths. It passes a data array with {amount, action_id, donor_name, donor_email}. PRO’s Integration Manager hooks this event to trigger automations.
For reliable production use, hook get_fund_donation_paid for payment-sensitive logic. Hook get_fund_donation_completed for side effects that should also fire during testing and petition mode.
Donation submission
Source: includes/donation/trait-submission.php
| Hook | Type | Signature |
|---|---|---|
get_fund_submission_rate_limit | filter | (int $max) Default: 5 per IP per 15 minutes |
get_fund_allowed_payment_providers | filter | (array $providers) Default: ['mollie','stripe','paypal','test',''] |
get_fund_donation_require_amount | filter | (bool $required, int $action_id) Default: true |
get_fund_donation_min_amount | filter | (float $min, int $action_id) Default: 1.00 |
get_fund_donation_max_amount | filter | (float $max, int $action_id) Default: 100000.00 |
get_fund_before_donation_process | action | ($action_id, $donation_amount, $donor_email, $payment_provider) |
get_fund_donation_meta_saved | action | ($donation_id, $action_id, $donation_amount, array $donor_data) where $donor_data has keys name and email |
get_fund_donation_status_transition | action | ($donation_id, $new_status, $old_status) |
get_fund_donation_completed | action | ($donation_id, array $data) where $data has keys amount, action_id, donor_name, donor_email |
get_fund_thank_you_url | filter | (string $url, int $donation_id, int $action_id) |
get_fund_before_payment_{$provider} | action | ($donation_id, $donation_amount, $action_id) Dynamic: e.g. get_fund_before_payment_paypal |
get_fund_after_payment_{$provider} | action | ($donation_id, $donation_amount, $action_id) Dynamic hook per provider |
get_fund_create_payment | filter | (WP_Error $result, string $provider, int $donation_id, float $amount, string $description, string $donor_email) PRO only: PRO registers the real handler; FREE returns a WP_Error |
Example: enforce a minimum donation
add_filter( 'get_fund_donation_min_amount', function( $min, $action_id ) {
// Require at least €5 on all fundraisers
return 5.00;
}, 10, 2 );
Example: act on a confirmed payment
add_action( 'get_fund_donation_paid', function( $donation_id ) {
$action_id = get_post_meta( $donation_id, '_get_donation_action_id', true );
$amount = get_post_meta( $donation_id, '_get_donation_amount', true );
// Update an external CRM, send a receipt, etc.
} );
Donation model
Source: includes/class-get-fund-donation-model.php
These hooks fire at the database level when donation records are created, changed, or removed.
| Hook | Type | Signature |
|---|---|---|
get_fund_donation_data_before_create | filter | (array $data, int $action_id) Modify the data array before the record is inserted |
get_fund_donation_created | action | ($donation_id, array $data) |
get_fund_donation_updated | action | ($donation_id, array $data, array $existing) |
get_fund_donation_deleted | action | ($donation_id, array $donation) |
Example: tag high-value donations before creation
add_filter( 'get_fund_donation_data_before_create', function( $data, $action_id ) {
if ( isset( $data['amount'] ) && (float) $data['amount'] >= 500 ) {
$data['tier'] = 'major';
}
return $data;
}, 10, 2 );
Donation lifecycle
Source: includes/donation/trait-donation-lifecycle.php
| Hook | Type | Signature |
|---|---|---|
get_fund_donation_paid | action | ($donation_id) Fires when status transitions to paid via a webhook or reconciliation cron |
Donation form renderer
Source: includes/donation/trait-renderer.php
| Hook | Type | Signature |
|---|---|---|
get_fund_donation_form_fields | filter | (array $field_order, int $action_id, array $attributes) |
get_fund_custom_field_rows | filter | (null $rows, array $attributes) |
get_fund_template_settings | filter | (array $settings, array $attributes) |
get_fund_before_donation_form | action | ($action_id, array $attributes) |
get_fund_donation_amount_options | filter | (array $amounts, int $action_id) |
get_fund_mollie_payment_methods | filter | (array $methods) Relevant only when PRO and Mollie are active |
get_fund_custom_fields | filter | (array $custom_fields, array $attributes) |
get_fund_after_donation_form | action | ($action_id, array $attributes) |
get_fund_donation_form_output | filter | (string $output, int $action_id, array $attributes) |
Example: add a preset amount option
add_filter( 'get_fund_donation_amount_options', function( $amounts, $action_id ) {
$amounts[] = 250;
sort( $amounts );
return $amounts;
}, 10, 2 );
Donation email
Source: includes/donation/trait-donation-email.php
| Hook | Type | Signature |
|---|---|---|
get_fund_donation_email_recipients | filter | (string $email, int $donation_id) Override the confirmation email recipient |
Action Wizard
Source: includes/class-get-fund-action-wizard.php
These hooks let you modify the wizard submission flow: validate input, alter the post data before creation, inject custom meta, and redirect after creation.
| Hook | Type | Signature |
|---|---|---|
get_fund_wizard_campaign_query_args | filter | (array $args, string $search) |
get_fund_wizard_form_data | filter | (array $data) Sanitized form data before validation |
get_fund_wizard_validation_errors | filter | (array $errors, array $data) Return non-empty array to block submission |
get_fund_wizard_post_data | filter | (array $post_data, array $data) wp_insert_post arguments |
get_fund_wizard_meta_values | filter | (array $meta_values, int $post_id, array $data) |
get_fund_action_created | action | ($post_id, array $extra) Second argument is always an empty array |
get_fund_wizard_redirect_url | filter | (string $url, int $post_id) |
get_fund_wizard_user_created | action | ($user_id, string $email, string $first_name, string $last_name) |
get_fund_wizard_allowed_image_types | filter | (array $mime_types, int $post_id) |
get_fund_wizard_upload_image | filter | (int $attachment_id, int $post_id, array $uploaded_file) |
Example: enforce a minimum goal amount in the wizard
add_filter( 'get_fund_wizard_validation_errors', function( $errors, $data ) {
if ( isset( $data['goal_amount'] ) && (float) $data['goal_amount'] < 50 ) {
$errors[] = __( 'Minimum goal amount is €50.', 'my-plugin' );
}
return $errors;
}, 10, 2 );
Example: notify admin when a fundraiser is created
add_action( 'get_fund_action_created', function( $post_id ) {
$title = get_the_title( $post_id );
wp_mail(
get_option( 'admin_email' ),
'New fundraiser created',
'A new fundraiser was created: ' . $title
);
} );
Note: the second parameter of get_fund_action_created is always an empty array. Declare your callback with only one parameter.
Frontend edit form
Source: includes/class-get-fund-frontend-edit.php
| Hook | Type | Signature |
|---|---|---|
get_fund_user_can_edit_action | filter | (bool $can_edit, int $post_id, int $current_user_id) |
get_fund_edit_form_fields | filter | (array $form_data, int $post_id) Keys: post, amount, raised_amount, end_date |
get_fund_before_frontend_edit | action | ($post_id) |
get_fund_after_frontend_edit | action | ($post_id) |
get_fund_edit_form_save_data | filter | (array $post_data, int $post_id) wp_update_post arguments |
get_fund_action_updated | action | ($post_id) |
get_fund_edit_redirect_url | filter | (string $url, int $post_id) |
get_fund_action_closed | action | ($post_id) |
Example: allow a team manager to edit any fundraiser
add_filter( 'get_fund_user_can_edit_action', function( $can_edit, $post_id, $user_id ) {
if ( user_can( $user_id, 'manage_fund_team' ) ) {
return true;
}
return $can_edit;
}, 10, 3 );
Post types
Source: includes/class-get-fund-post-types.php
| Hook | Type | Signature |
|---|---|---|
get_fund_block_template_lock | filter | (bool/string $lock) Default: false. Pass 'all' to lock the block template |
get_fund_block_template | filter | (array $template) Block template array for the get_fund_action CPT |
get_fund_cpt_args | filter | (array $args) Full register_post_type args for get_fund_action |
get_fund_meta_fields_registered | action | () Fires after all meta fields are registered |
get_fund_campaign_post_types | filter | (array $types) Default: ['get_fund_action','get_campaign_action'] |
Block editor
Source: includes/class-get-fund-block-editor.php
| Hook | Type | Signature |
|---|---|---|
get_fund_registered_blocks | action | () Fires after all blocks are registered. Use this to register custom blocks in the Fundations category |
get_fund_progress_block_output | filter | (string $output, array $fund_data, array $attributes, int $post_id) |
get_fund_stats_block_output | filter | (string $output, array $attributes, int $post_id) |
get_fund_child_actions_block_output | filter | (string $output, array $attributes, int $post_id) |
get_fund_child_actions_query_args | filter | (array $args, int $post_id) |
get_fund_action_claimed | action | ($post_id, $user_id) Fires when a guest-created fundraiser is claimed |
Example: sort child fundraisers by amount raised
add_filter( 'get_fund_child_actions_query_args', function( $args, $post_id ) {
$args['orderby'] = 'meta_value_num';
$args['meta_key'] = '_get_fund_raised_amount';
$args['order'] = 'DESC';
return $args;
}, 10, 2 );
Note: the filter passes $post_id as the second argument. Always declare your callback with both parameters.
Expiration cron
Source: includes/class-get-fund-expiration-cron.php
| Hook | Type | Signature |
|---|---|---|
get_fund_should_expire_action | filter | (bool $should, int $action_id) Return false to prevent expiry |
get_fund_before_expiration | action | ($action_id) |
get_fund_action_expired | action | ($action_id, int $creator_id) $creator_id is 0 for unclaimed guest fundraisers |
get_fund_action_reactivated | action | ($action_id, string $new_end_date) $new_end_date is Y-m-d format |
get_fund_expiration_email_placeholders | filter | (array $placeholders, int $action_id, string $recipient_type) $recipient_type is 'user' or 'admin' |
Example: prevent expiry when goal is met
add_filter( 'get_fund_should_expire_action', function( $should, $action_id ) {
$goal = (float) get_post_meta( $action_id, '_get_fund_amount', true );
$raised = (float) get_post_meta( $action_id, '_get_fund_raised_amount', true );
if ( $goal > 0 && $raised >= $goal ) {
return false;
}
return $should;
}, 10, 2 );
Stats model
Source: includes/class-get-fund-stats-model.php
| Hook | Type | Signature |
|---|---|---|
get_fund_stats_updated | action | ($action_id, array $row) Fires after the stats table row is recalculated |
The $row array contains at minimum total_raised, donation_count, donor_count, average_donation, last_donation_at, and last_donation_amount.
Example: check if goal is reached after each donation
add_action( 'get_fund_stats_updated', function( $action_id, $row ) {
$goal = (float) get_post_meta( $action_id, '_get_fund_amount', true );
if ( $goal > 0 && $row['total_raised'] >= $goal ) {
// Goal reached: trigger your own notification here
}
}, 10, 2 );
Gallery
Source: includes/class-get-fund-gallery.php
| Hook | Type | Signature |
|---|---|---|
get_fund_gallery_settings | filter | (array $settings) |
get_fund_gallery_image_data | filter | (array $image_data, int $attachment_id) Keys: id, url, full, thumbnail, medium, large, alt, caption, title |
Settings and currency
Source: includes/class-get-fund-settings.php
| Hook | Type | Signature |
|---|---|---|
get_fund_amount_decimals | filter | (int $decimals, float $amount) |
get_fund_currency_format | filter | (string $formatted, float $amount, int $decimals, string $decimal_sep, string $thousands_sep) |
User dashboard
Source: includes/class-get-fund-user-dashboard.php
| Hook | Type | Signature |
|---|---|---|
get_fund_dashboard_query_args | filter | (array $args, int $user_id) |
get_fund_dashboard_stats | filter | (array $stats, int $post_id) Keys: goal_amount, display_raised, percentage, status |
User profile block
Source: includes/class-get-fund-user-profile-block.php
| Hook | Type | Signature |
|---|---|---|
get_fund_profile_updated | action | ($user_id, array $user_data) |
get_fund_password_changed | action | ($user_id) |
Migration
Source: includes/class-get-fund-migration.php
These hooks are relevant when migrating donation data from the legacy postmeta storage to the custom donations table.
| Hook | Type | Signature |
|---|---|---|
get_fund_donation_migrated | action | ($new_id, int $legacy_post_id, array $data) |
get_fund_migration_completed | action | () |
get_fund_migration_reset | action | () |
QR generator
Source: includes/class-get-fund-qr-generator.php
| Hook | Type | Signature |
|---|---|---|
get_fund_qr_data | filter | (string $data, int $size) The string to encode, usually the fundraiser URL |
get_fund_qr_settings | filter | (array $settings, string $data) Keys: size, margin, foreground_color, background_color (RGB arrays) |
Form builder
Source: includes/class-get-fund-form-builder.php
| Hook | Type | Signature |
|---|---|---|
get_fund_form_builder_system_fields | filter | (array $fields) |
Privacy
Source: includes/class-get-fund-privacy.php
| Hook | Type | Signature |
|---|---|---|
get_fund_export_personal_data | filter | (array $export_items, string $email_address) |
get_fund_erase_personal_data | filter | (array $erase_result, string $email_address, bool $items_removed) |
Cache
Source: includes/donation/trait-form-helpers.php
| Hook | Type | Signature |
|---|---|---|
get_fund_purge_cache | action | (array $urls_to_purge, array $post_ids_to_purge) |
Fundations purges caches from WP Super Cache, W3 Total Cache, LiteSpeed, WP Fastest Cache, SiteGround, Kinsta, and WP Engine after a donation is processed. Hook get_fund_purge_cache to purge additional layers such as a CDN or Varnish.
add_action( 'get_fund_purge_cache', function( $urls, $post_ids ) {
foreach ( $urls as $url ) {
my_cdn_purge( $url );
}
}, 10, 2 );
Emails
Source: includes/class-get-fund-email-manager.php, includes/class-get-fund-email-tags.php, includes/class-get-fund-emails-admin.php
| Hook | Type | Signature |
|---|---|---|
get_fund_email_definitions | filter | (array $definitions) Add or change system email definitions. Each entry has key, category, subject, and a default body. |
get_fund_email_tags | filter | (array $tags, array $context) Register tag families for Get_Fund_Email_Tags. |
get_fund_email_tabs | filter | (array $tabs) Add a tab to the Emails screen. Render it with the get_fund_email_tab_{$key} action. |
get_fund_email_attachments | filter | (array $attachments, array $context) Add attachments to a send. Context carries email_key (lifecycle) or event (per-form), plus donation_id where applicable. The Pro PDF receipt hooks here. |
get_fund_email_recipients | filter | (array $recipients, string $key, array $context) Adjust resolved recipients before send. |
Example: attach a file to the donation receipt
add_filter( 'get_fund_email_attachments', function( $attachments, $context ) {
if ( 'donation_receipt' === ( $context['email_key'] ?? '' ) ) {
$attachments[] = my_build_pdf( (int) $context['donation_id'] );
}
return $attachments;
}, 10, 2 );
Form notifications and confirmations
Source: includes/class-get-fund-form-notifications.php, includes/class-get-fund-form-conditions.php
| Hook | Type | Signature |
|---|---|---|
get_fund_donation_meta_saved | action | Drives the submission notification dispatch. |
get_fund_donation_status_transition | action | Drives the payment_failed notification dispatch. |
get_fund_email_attachments | filter | Per-form sends pass event in the context (payment_completed, submission, payment_failed). |
Notifications and confirmations are stored in the get_fund_form_templates option per template, not via hooks. Conditions are evaluated by Get_Fund_Form_Conditions::passes().
Demo data
Source: includes/class-get-fund-demo-generator.php
| Hook | Type | Signature |
|---|---|---|
get_fund_demo_after_generate | action | (array $created) Fires after the free generator runs. Pro adds tips here. |
get_fund_demo_after_cleanup | action | () Fires after demo data is removed. |
Members and invitations
Source: includes/class-get-fund-post-types.php, includes/class-get-fund-member-invites.php (free stub), Pro engine
| Hook | Type | Signature |
|---|---|---|
get_fund_wizard_campaign_options | action | () Fires in the wizard template where Pro renders the membership field. |
get_fund_member_removed | action | ($target_type, $target_id, $member_action_id) Fires when an accepted member is detached (Pro). |
get_fund_invite_token_ttl | filter | (int $seconds) Invite token lifetime (default 72h, Pro). |
get_fund_invite_bulk_max | filter | (int $max) Maximum addresses per bulk invite (default 50, Pro). |
My Fundations and group assignment
Source: includes/class-get-fund-my-fundations-block.php
| Hook | Type | Signature |
|---|---|---|
get_fund_group_assignment_updated | action | ($post_id) Fires after a page is reassigned to a different campaign, team, or event from the account page. |
Complete quick-reference table
| Hook name | Type | Category |
|---|---|---|
get_fund_submission_rate_limit | filter | Submission |
get_fund_allowed_payment_providers | filter | Submission / Renderer |
get_fund_donation_require_amount | filter | Submission / Model |
get_fund_donation_min_amount | filter | Submission |
get_fund_donation_max_amount | filter | Submission |
get_fund_before_donation_process | action | Submission |
get_fund_donation_meta_saved | action | Submission |
get_fund_donation_status_transition | action | Submission |
get_fund_donation_completed | action | Submission |
get_fund_thank_you_url | filter | Submission |
get_fund_before_payment_{$provider} | action | Submission |
get_fund_after_payment_{$provider} | action | Submission |
get_fund_create_payment | filter | Submission (PRO) |
get_fund_donation_data_before_create | filter | Model |
get_fund_donation_created | action | Model |
get_fund_donation_updated | action | Model |
get_fund_donation_deleted | action | Model |
get_fund_donation_paid | action | Lifecycle |
get_fund_donation_form_fields | filter | Renderer |
get_fund_custom_field_rows | filter | Renderer |
get_fund_template_settings | filter | Renderer |
get_fund_before_donation_form | action | Renderer |
get_fund_donation_amount_options | filter | Renderer |
get_fund_mollie_payment_methods | filter | Renderer |
get_fund_custom_fields | filter | Renderer |
get_fund_after_donation_form | action | Renderer |
get_fund_donation_form_output | filter | Renderer |
get_fund_donation_email_recipients | filter | |
get_fund_wizard_campaign_query_args | filter | Wizard |
get_fund_wizard_form_data | filter | Wizard |
get_fund_wizard_validation_errors | filter | Wizard |
get_fund_wizard_post_data | filter | Wizard |
get_fund_wizard_meta_values | filter | Wizard |
get_fund_action_created | action | Wizard |
get_fund_wizard_redirect_url | filter | Wizard |
get_fund_wizard_user_created | action | Wizard |
get_fund_wizard_allowed_image_types | filter | Wizard |
get_fund_wizard_upload_image | filter | Wizard |
get_fund_user_can_edit_action | filter | Frontend edit |
get_fund_edit_form_fields | filter | Frontend edit |
get_fund_before_frontend_edit | action | Frontend edit |
get_fund_after_frontend_edit | action | Frontend edit |
get_fund_edit_form_save_data | filter | Frontend edit |
get_fund_action_updated | action | Frontend edit |
get_fund_edit_redirect_url | filter | Frontend edit |
get_fund_action_closed | action | Frontend edit |
get_fund_block_template_lock | filter | Post types |
get_fund_block_template | filter | Post types |
get_fund_cpt_args | filter | Post types |
get_fund_meta_fields_registered | action | Post types |
get_fund_campaign_post_types | filter | Post types |
get_fund_registered_blocks | action | Block editor |
get_fund_progress_block_output | filter | Block editor |
get_fund_stats_block_output | filter | Block editor |
get_fund_child_actions_block_output | filter | Block editor |
get_fund_child_actions_query_args | filter | Block editor |
get_fund_action_claimed | action | Block editor |
get_fund_should_expire_action | filter | Expiration |
get_fund_before_expiration | action | Expiration |
get_fund_action_expired | action | Expiration |
get_fund_action_reactivated | action | Expiration |
get_fund_expiration_email_placeholders | filter | Expiration |
get_fund_stats_updated | action | Stats |
get_fund_gallery_settings | filter | Gallery |
get_fund_gallery_image_data | filter | Gallery |
get_fund_amount_decimals | filter | Settings |
get_fund_currency_format | filter | Settings |
get_fund_dashboard_query_args | filter | Dashboard |
get_fund_dashboard_stats | filter | Dashboard |
get_fund_profile_updated | action | Profile |
get_fund_password_changed | action | Profile |
get_fund_donation_migrated | action | Migration |
get_fund_migration_completed | action | Migration |
get_fund_migration_reset | action | Migration |
get_fund_qr_data | filter | QR |
get_fund_qr_settings | filter | QR |
get_fund_form_builder_system_fields | filter | Form builder |
get_fund_export_personal_data | filter | Privacy |
get_fund_erase_personal_data | filter | Privacy |
get_fund_purge_cache | action | Cache |
get_fund_email_definitions | filter | Emails |
get_fund_email_tags | filter | Emails |
get_fund_email_tabs | filter | Emails |
get_fund_email_attachments | filter | Emails |
get_fund_email_recipients | filter | Emails |
get_fund_demo_after_generate | action | Demo data |
get_fund_demo_after_cleanup | action | Demo data |
get_fund_wizard_campaign_options | action | Members |
get_fund_member_removed | action | Members |
get_fund_invite_token_ttl | filter | Members (PRO) |
get_fund_invite_bulk_max | filter | Members (PRO) |
get_fund_group_assignment_updated | action | My Fundations |