Hooks and Filters
Payment Hooks & Filters

This guide maps every action hook and filter hook that fires during the GiftFlow payment process — from the moment a donor submits the form to the final webhook confirmation. All hooks and filters are extracted directly from the plugin source code.


The Payment Process at a Glance

[Donor submits form]


① giftflow_donation_form_fields          ← filter: modify/add form fields
② giftflow_donation_form_before_process_donation  ← action: validate (recaptcha)


③ giftflow_donation_validate             ← filter: custom validation logic
④ giftflow_donation_before_create        ← filter + action: intercept before DB insert
⑤ giftflow_donation_post_data            ← filter: modify WP post args
⑥ giftflow_donation_created              ← action: donation post created (status = pending)
⑦ giftflow_donation_meta_saved           ← action: all meta saved


⑧ [gateway::process_payment()]           ← each gateway runs its own logic

        ├── giftflow_stripe_prepare_payment_intent_data  ← Stripe filter
        ├── giftflow_stripe_customer_data                ← Stripe filter
        ├── giftflow_paypal_prepare_payment_data         ← PayPal filter


⑨ giftflow_donation_before_status_update ← action: fires before status changes
⑩ giftflow_donation_status_updated       ← action: status changed
⑪ giftflow_donation_status_{$status}     ← dynamic action: e.g. _completed, _failed


⑫ giftflow_donation_after_payment_processed  ← action: emails, user creation

① Submission Layer — class-forms.php

giftflow_donation_form_fields — filter

Runs after the form payload is sanitized but before nonce verification and validation. Use this to inject extra fields from the frontend into the processing pipeline.

Type:       filter
Parameters: array $fields — sanitized form fields
Returns:    array
Source:     class-forms.php
add_filter( 'giftflow_donation_form_fields', function( $fields ) {
    // Example: parse a hidden field your template added
    $fields['my_custom_field'] = sanitize_text_field( $fields['my_custom_field'] ?? '' );
    return $fields;
} );

giftflow_donation_form_before_process_donation — action

Fires before validation, after the nonce is verified. Use it for additional pre-processing checks. Throwing a wp_send_json_error() here will abort the entire submission.

GiftFlow uses this hook internally to run reCAPTCHA validation (priority 10).

Type:       action
Parameters: array $fields — sanitized form fields
Priority:   10 (reCAPTCHA), add yours at higher priority
Source:     class-forms.php
add_action( 'giftflow_donation_form_before_process_donation', function( $fields ) {
    $min = 5.00;
    if ( floatval( $fields['donation_amount'] ) < $min ) {
        wp_send_json_error( array( 'message' => 'Minimum donation is $5.' ) );
    }
}, 20 );

② Donation Creation Layer — class-donations.php

giftflow_donation_validate — filter

Custom validation gate. Return a WP_Error to block the donation from being created.

Type:       filter
Parameters: true|WP_Error $valid, array $data
Returns:    true|WP_Error
Source:     class-donations.php :: validate_donation_data()
add_filter( 'giftflow_donation_validate', function( $valid, $data ) {
    if ( empty( $data['campaign_id'] ) ) {
        return new WP_Error( 'no_campaign', 'A campaign must be selected.' );
    }
    return $valid;
}, 10, 2 );

giftflow_donation_before_create — filter + action

Available in two forms. The filter runs first and lets you modify donation data before it reaches wp_insert_post. The action fires right after and is read-only (use for notifications/logging).

filter parameters: array $data
filter returns:    array (modified data)

action parameters: array $data
Source: class-donations.php :: create()
// Filter — modify data
add_filter( 'giftflow_donation_before_create', function( $data ) {
    $data['donor_name'] = ucwords( strtolower( $data['donor_name'] ) );
    return $data;
} );
 
// Action — log or notify
add_action( 'giftflow_donation_before_create', function( $data ) {
    // fire-and-forget logging, not modifying data
    error_log( 'Creating donation for: ' . $data['donor_email'] );
} );

giftflow_donation_post_data — filter

Modify the WP_Post data array that is passed to wp_insert_post. Useful for setting a custom post title or author.

Type:       filter
Parameters: array $post_data, array $data
Returns:    array
Source:     class-donations.php :: create()
add_filter( 'giftflow_donation_post_data', function( $post_data, $data ) {
    $post_data['post_title'] = 'Donation — ' . gmdate( 'Y-m-d H:i' );
    return $post_data;
}, 10, 2 );

giftflow_donation_create_failed — action

Fires if wp_insert_post returns a WP_Error. Use for logging or alerting.

Type:       action
Parameters: WP_Error $error, array $data
Source:     class-donations.php :: create()
add_action( 'giftflow_donation_create_failed', function( $error, $data ) {
    // Alert admin
    wp_mail( get_option('admin_email'), 'Donation creation failed', $error->get_error_message() );
}, 10, 2 );

giftflow_donation_created — action

Fires after the donation post is inserted and all meta is saved. The donation is in pending status at this point — payment has not yet run.

Type:       action
Parameters: int $donation_id, array $data
Source:     class-donations.php :: create()
add_action( 'giftflow_donation_created', function( $donation_id, $data ) {
    // Donation row exists in DB. Payment not yet processed.
    update_post_meta( $donation_id, '_my_custom_meta', 'value' );
}, 10, 2 );

giftflow_donation_meta_saved — action

Fires at the very end of save_donation_meta(), after all native meta keys are written. Ideal for writing your own meta in the same save cycle.

Type:       action
Parameters: int $donation_id, array $data
Source:     class-donations.php :: save_donation_meta()
add_action( 'giftflow_donation_meta_saved', function( $donation_id, $data ) {
    if ( ! empty( $data['my_custom_field'] ) ) {
        update_post_meta( $donation_id, '_my_custom_field', sanitize_text_field( $data['my_custom_field'] ) );
    }
}, 10, 2 );

③ Gateway Processing Layer

giftflow_register_gateways — action

The single registration hook. All gateways must be instantiated inside this action — it fires inside Gateway_Base::init_gateways().

Type:       action
Parameters: none
Source:     class-gateway-base.php :: init_gateways()
add_action( 'giftflow_register_gateways', function() {
    new My_Custom_Gateway();
} );

giftflow_gateways_initialized — action

Fires after all gateways are registered and sorted by $order. The complete registry is passed as a parameter.

Type:       action
Parameters: array $gateway_registry — [ id => Gateway_Base instance, ... ]
Source:     class-gateway-base.php :: init_gateways()
add_action( 'giftflow_gateways_initialized', function( $registry ) {
    // All gateways are now registered and sorted
    foreach ( $registry as $id => $gateway ) {
        if ( $gateway->is_enabled() ) {
            // do something per enabled gateway
        }
    }
} );

giftflow_gateway_registered — action

Fires immediately after each individual gateway registers itself in the static registry.

Type:       action
Parameters: string $gateway_id, Gateway_Base $gateway_instance
Source:     class-gateway-base.php :: register_gateway()
add_action( 'giftflow_gateway_registered', function( $id, $gateway ) {
    if ( 'stripe' === $id ) {
        // custom Stripe initialization
    }
}, 10, 2 );

giftflow_gateway_init_hooks — action

Fires at the end of each gateway's init_hooks() call. Use this to attach extra hooks to a specific gateway instance from outside the class.

Type:       action
Parameters: Gateway_Base $gateway_instance
Source:     class-gateway-base.php :: init_hooks()
add_action( 'giftflow_gateway_init_hooks', function( $gateway ) {
    if ( $gateway->get_id() === 'stripe' ) {
        // add extra Stripe-specific hooks
    }
} );

giftflow_payment_gateways — filter

The gateway list used when rendering the payment step in the donation form. Each gateway's add_gateway_to_list() method hooks here automatically. Use it to add or remove gateways from the form.

Type:       filter
Parameters: array $gateways — keyed by gateway ID
Returns:    array
Source:     class-gateway-base.php :: init_hooks()
// Remove a gateway from the donation form
add_filter( 'giftflow_payment_gateways', function( $gateways ) {
    unset( $gateways['direct_bank_transfer'] );
    return $gateways;
} );

giftflow_payment_methods_settings — filter

Controls which settings fields appear in the Settings → Payment tab. Each gateway registers its own settings fields here. Used to add or modify payment gateway settings.

Type:       filter (hooked as action with return)
Parameters: array $payment_fields
Returns:    array
Source:     class-gateway-base.php :: init_hooks()
add_filter( 'giftflow_payment_methods_settings', function( $fields ) {
    // Add a custom global payment setting
    $fields['my_setting'] = array(
        'id'    => 'giftflow_my_setting',
        'name'  => 'giftflow_payment_options[my_setting]',
        'type'  => 'textfield',
        'label' => __( 'My Setting', 'my-plugin' ),
    );
    return $fields;
} );

④ Stripe-Specific Hooks & Filters

giftflow_stripe_prepare_payment_intent_data — filter

Modify the array sent to Stripe's paymentIntents->create(). Use this to add statement descriptors, metadata, or other Stripe-specific parameters.

Type:       filter
Parameters: array $payment_intent_data, array $form_data, int $donation_id
Returns:    array
Source:     class-stripe.php :: prepare_payment_intent_data()
add_filter( 'giftflow_stripe_prepare_payment_intent_data', function( $intent_data, $form_data, $donation_id ) {
    $intent_data['statement_descriptor'] = 'CHARITY ORG';
    $intent_data['metadata']['custom_key'] = 'custom_value';
    return $intent_data;
}, 10, 3 );

giftflow_stripe_customer_data — filter

Modify the customer object sent to stripe->customers->create() when a new Stripe Customer is being created for a recurring donation.

Type:       filter
Parameters: array $customer_data, array $form_data, int $donation_id
Returns:    array
Source:     class-stripe.php :: get_or_create_stripe_customer()
add_filter( 'giftflow_stripe_customer_data', function( $customer_data, $form_data, $donation_id ) {
    $customer_data['metadata']['site_id'] = get_current_blog_id();
    return $customer_data;
}, 10, 3 );

giftflow_stripe_currency — filter

Override the currency code used in Stripe API calls.

Type:       filter
Parameters: string $currency — default 'USD'
Returns:    string
Source:     class-stripe.php :: get_currency()
add_filter( 'giftflow_stripe_currency', function( $currency ) {
    return 'EUR';
} );

giftflow_stripe_country_code — filter

Override the country code for Stripe's Payment Request Button (Apple Pay / Google Pay).

Type:       filter
Parameters: string $country — default 'US'
Returns:    string
Source:     class-stripe.php :: get_country_code()
add_filter( 'giftflow_stripe_country_code', fn() => 'DE' );

giftflow_stripe_gateway_supports — filter

Modify the $supports array for the Stripe gateway.

Type:       filter
Parameters: array $supports, Stripe_Gateway $gateway
Returns:    array
Source:     class-stripe.php :: init_gateway()
add_filter( 'giftflow_stripe_gateway_supports', function( $supports ) {
    $supports[] = 'recurring';
    return $supports;
}, 10, 2 );

giftflow_stripe_payment_completed — action

Fires when a Stripe payment intent reaches succeeded status during the synchronous payment flow (form submission).

Type:       action
Parameters: int $donation_id, string $transaction_id, array $payment_intent_data
Source:     class-stripe.php :: handle_successful_payment_intent()
add_action( 'giftflow_stripe_payment_completed', function( $donation_id, $transaction_id, $intent_data ) {
    // Send custom receipt, update CRM, etc.
}, 10, 3 );

giftflow_stripe_subscription_created — action

Fires when a new Stripe Subscription is successfully created (recurring donation first payment).

Type:       action
Parameters: int $donation_id, string $subscription_id, array $subscription_data
Source:     class-stripe.php :: process_recurring_payment()
add_action( 'giftflow_stripe_subscription_created', function( $donation_id, $sub_id, $sub_data ) {
    // Store sub_id in your own table, notify admin, etc.
}, 10, 3 );

giftflow_stripe_recurring_renewal_created — action

Fires when a renewal donation post is created from a invoice.paid webhook (recurring only).

Type:       action
Parameters: int $renewal_id, int $parent_donation_id, string $subscription_id, array $invoice_data
Source:     class-stripe.php :: handle_invoice_paid()
add_action( 'giftflow_stripe_recurring_renewal_created', function( $renewal_id, $parent_id, $sub_id, $invoice ) {
    // e.g. sync to external fundraising platform
}, 10, 4 );

Stripe Webhook Action Hooks

These fire inside the Stripe webhook handler (wp_ajax_nopriv_giftflow_stripe_webhook) when Stripe sends async events.

HookFires OnParameters
giftflow_stripe_webhook_payment_completedpayment_intent.succeeded$donation_id, $payment_intent
giftflow_stripe_webhook_payment_failedpayment_intent.payment_failed$donation_id, $payment_intent
giftflow_stripe_webhook_payment_canceledpayment_intent.canceled$donation_id, $payment_intent
giftflow_stripe_webhook_charge_refundedcharge.refunded$donation_id, $charge
giftflow_stripe_recurring_payment_failedinvoice.payment_failed$parent_donation_id, $subscription_id, $invoice
giftflow_stripe_subscription_cancelledcustomer.subscription.deleted$parent_donation_id, $subscription_id, $subscription
giftflow_stripe_subscription_updatedcustomer.subscription.updated$parent_donation_id, $subscription_id, $subscription
// Example — send a refund receipt on charge.refunded
add_action( 'giftflow_stripe_webhook_charge_refunded', function( $donation_id, $charge ) {
    $donation = giftflow_get_donation_data_by_id( $donation_id );
    wp_mail( $donation->donor_email, 'Your refund has been processed', '...' );
}, 10, 2 );
 
// Example — handle subscription cancellation
add_action( 'giftflow_stripe_subscription_cancelled', function( $donation_id, $sub_id, $sub ) {
    update_post_meta( $donation_id, '_recurring_status', 'cancelled' );
    do_action( 'giftflow_donation_after_payment_processed', $donation_id, false );
}, 10, 3 );

⑤ PayPal-Specific Hooks & Filters

giftflow_paypal_gateway_supports — filter

Modify the $supports array for the PayPal gateway.

Type:       filter
Parameters: array $supports, PayPal_Gateway $gateway
Returns:    array
Source:     class-paypal.php :: init_gateway()

giftflow_paypal_prepare_payment_data — filter

Modify the payment data array before it is sent to PayPal's API (legacy payment flow).

Type:       filter
Parameters: array $paypal_data, array $form_data, int $donation_id
Returns:    array
Source:     class-paypal.php :: prepare_payment_data()
add_filter( 'giftflow_paypal_prepare_payment_data', function( $data, $form_data, $donation_id ) {
    $data['metadata']['source'] = 'landing_page_campaign';
    return $data;
}, 10, 3 );

giftflow_paypal_payment_completed — action

Fires when a PayPal order capture completes successfully — both in the synchronous JS SDK capture flow and the legacy response flow.

Type:       action
Parameters: int $donation_id, string $transaction_id, array $response_data
Source:     class-paypal.php :: capture_paypal_order(), handle_successful_payment()
add_action( 'giftflow_paypal_payment_completed', function( $donation_id, $transaction_id, $data ) {
    // Log or sync with external system
}, 10, 3 );

PayPal Webhook Action Hooks

These fire inside the PayPal webhook handler (wp_ajax_nopriv_giftflow_paypal_webhook).

HookFires OnParameters
giftflow_paypal_webhook_payment_completedPAYMENT.CAPTURE.COMPLETED / PAYMENT.SALE.COMPLETED$donation_id, $resource
giftflow_paypal_webhook_payment_deniedPAYMENT.CAPTURE.DENIED / PAYMENT.SALE.DENIED$donation_id, $resource
giftflow_paypal_webhook_payment_refundedPAYMENT.CAPTURE.REFUNDED / PAYMENT.SALE.REFUNDED$donation_id, $resource
add_action( 'giftflow_paypal_webhook_payment_completed', function( $donation_id, $resource ) {
    // Extra handling for PayPal webhook confirmation
}, 10, 2 );

⑥ Status Update Layer — class-donations.php

giftflow_donation_before_status_update — action

Fires before update_post_meta( $id, '_status', $new_status ) is called. Use it to intercept or prevent a status transition.

Type:       action
Parameters: int $donation_id, string $new_status, string $old_status
Source:     class-donations.php :: update_status()
add_action( 'giftflow_donation_before_status_update', function( $donation_id, $new_status, $old_status ) {
    // Log the incoming transition
    error_log( "Donation #{$donation_id}: {$old_status} → {$new_status}" );
}, 10, 3 );

giftflow_donation_status_updated — action

Fires after a status is successfully written to post meta. This is the authoritative hook for accurate status change tracking.

Type:       action
Parameters: int $donation_id, string $new_status, string $old_status
Source:     class-donations.php :: update_status()
add_action( 'giftflow_donation_status_updated', function( $donation_id, $new_status, $old_status ) {
    if ( 'completed' === $new_status && 'pending' === $old_status ) {
        // Trigger a campaign milestone check
    }
}, 10, 3 );

giftflow_donation_status_{$status} — dynamic action

A dynamic hook that fires for each specific final status. Always fires after giftflow_donation_status_updated.

Available: giftflow_donation_status_completed, giftflow_donation_status_failed, giftflow_donation_status_refunded, giftflow_donation_status_cancelled, giftflow_donation_status_pending.

Type:       action (dynamic)
Parameters: int $donation_id, string $old_status
Source:     class-donations.php :: update_status()
// React when a donation completes
add_action( 'giftflow_donation_status_completed', function( $donation_id, $old_status ) {
    // Send custom thank-you SMS, update leaderboard, etc.
}, 10, 2 );
 
// React when a donation is refunded
add_action( 'giftflow_donation_status_refunded', function( $donation_id, $old_status ) {
    // Adjust campaign totals or notify the team
}, 10, 2 );

giftflow_donation_valid_statuses — filter

Add custom status slugs to the validation allowlist.

Type:       filter
Parameters: array $statuses — default: ['pending','completed','failed','refunded','cancelled']
Returns:    array
Source:     class-donations.php :: get_valid_statuses()
add_filter( 'giftflow_donation_valid_statuses', function( $statuses ) {
    $statuses[] = 'on_hold';
    return $statuses;
} );

⑦ Post-Payment Layer — class-forms.php + mail.php

giftflow_donation_after_payment_processed — action ⭐

The most important hook in the entire payment pipeline. Fires after process_payment() returns without error. This is where notifications, user creation, and downstream integrations live.

Type:       action
Parameters: int $donation_id, mixed $payment_result
Source:     class-forms.php :: process_donation()
            class-paypal.php :: capture_paypal_order() (also fires manually)

Built-in subscribers (from hooks.php and mail.php):

PriorityFunctionEffect
10giftflow_send_mail_notification_donation_to_adminSends admin notification email (always)
10giftflow_auto_create_user_on_donationCreates WP user for first-time donor
12giftflow_send_mail_thank_you_to_donor_payment_successfulSends donor thank-you email (only if $payment_result === true)
// Add your own post-payment logic
add_action( 'giftflow_donation_after_payment_processed', function( $donation_id, $payment_result ) {
    if ( $payment_result !== true ) {
        return; // Skip if not a direct success
    }
 
    $donation = giftflow_get_donation_data_by_id( $donation_id );
 
    // Example: sync to a CRM
    my_crm_sync( array(
        'email'    => $donation->donor_email,
        'amount'   => $donation->amount,
        'campaign' => $donation->campaign_name,
    ) );
}, 20, 2 );

:::warning Async payments (webhooks) For PayPal and Stripe, the synchronous process_payment() may return before the webhook confirms the payment. The gateway fires giftflow_donation_after_payment_processed again from the webhook handler when it gets the async confirmation. To avoid duplicate processing, always check $payment_result === true and consider setting a flag on the donation post. :::


⑧ Email Filter Hooks — mail.php

These filters run inside the two email functions that are hooked to giftflow_donation_after_payment_processed.

Admin Notification Email

// Modify all data passed to the admin email template
add_filter( 'giftflow_new_donation_admin_email_args', function( $args, $donation_id, $donation_data ) {
    $args['custom_note'] = 'Processed via mobile app';
    return $args;
}, 10, 3 );
 
// Modify admin email subject line
add_filter( 'giftflow_new_donation_admin_email_subject', function( $subject, $donation_id, $donation_data ) {
    return '[URGENT] ' . $subject;
}, 10, 3 );
 
// Modify admin email header text
add_filter( 'giftflow_new_donation_admin_email_header', function( $header, $donation_id, $donation_data ) {
    return '🎉 New Donation Received';
}, 10, 3 );

Donor Thank-You Email

// Modify all data passed to the donor thank-you template
add_filter( 'giftflow_thanks_donor_email_args', function( $args, $donation_id, $donation_data ) {
    $args['custom_message'] = 'Your receipt number is ' . $donation_id;
    return $args;
}, 10, 3 );
 
// Modify donor email subject
add_filter( 'giftflow_thanks_donor_email_subject', function( $subject, $donation_id, $donation_data ) {
    return $subject . ' 🙏';
}, 10, 3 );
 
// Modify donor email header
add_filter( 'giftflow_thanks_donor_email_header', function( $header, $donation_id, $donation_data ) {
    return 'Thank you for making a difference!';
}, 10, 3 );

⑨ Bank Transfer — Specific Hook

giftflow_bank_transfer_payment_pending — action

Fires at the end of Direct Bank Transfer's process_payment(). The donation is in pending status and awaiting manual confirmation.

Type:       action
Parameters: int $donation_id, string $reference_number, array $data
Source:     class-direct-bank-transfer.php :: process_payment()
add_action( 'giftflow_bank_transfer_payment_pending', function( $donation_id, $ref_number, $data ) {
    // Email admin with reference number for manual matching
    $msg = "New bank transfer pending.\nRef: {$ref_number}\nDonation: #{$donation_id}";
    wp_mail( get_option('admin_email'), 'Bank Transfer Pending', $msg );
}, 10, 3 );

Complete Hook Reference

#Hook NameTypeFired ByKey Parameters
1giftflow_donation_form_fieldsfilterclass-forms.php$fields
2giftflow_donation_form_before_process_donationactionclass-forms.php$fields
3giftflow_donation_validatefilterclass-donations.php$valid, $data
4giftflow_donation_before_createfilter+actionclass-donations.php$data
5giftflow_donation_post_datafilterclass-donations.php$post_data, $data
6giftflow_donation_create_failedactionclass-donations.php$error, $data
7giftflow_donation_createdactionclass-donations.php$donation_id, $data
8giftflow_donation_meta_savedactionclass-donations.php$donation_id, $data
9giftflow_register_gatewaysactionclass-gateway-base.php
10giftflow_gateways_initializedactionclass-gateway-base.php$registry
11giftflow_gateway_registeredactionclass-gateway-base.php$id, $instance
12giftflow_gateway_init_hooksactionclass-gateway-base.php$instance
13giftflow_payment_gatewaysfilterclass-gateway-base.php$gateways
14giftflow_payment_methods_settingsfilterclass-gateway-base.php$fields
15giftflow_stripe_prepare_payment_intent_datafilterclass-stripe.php$intent_data, $data, $id
16giftflow_stripe_customer_datafilterclass-stripe.php$customer_data, $data, $id
17giftflow_stripe_currencyfilterclass-stripe.php$currency
18giftflow_stripe_country_codefilterclass-stripe.php$country
19giftflow_stripe_gateway_supportsfilterclass-stripe.php$supports, $gateway
20giftflow_stripe_payment_completedactionclass-stripe.php$donation_id, $txn_id, $data
21giftflow_stripe_subscription_createdactionclass-stripe.php$donation_id, $sub_id, $data
22giftflow_stripe_recurring_renewal_createdactionclass-stripe.php$renewal_id, $parent_id, $sub_id, $invoice
23giftflow_stripe_webhook_payment_completedactionclass-stripe.php$donation_id, $payment_intent
24giftflow_stripe_webhook_payment_failedactionclass-stripe.php$donation_id, $payment_intent
25giftflow_stripe_webhook_payment_canceledactionclass-stripe.php$donation_id, $payment_intent
26giftflow_stripe_webhook_charge_refundedactionclass-stripe.php$donation_id, $charge
27giftflow_stripe_recurring_payment_failedactionclass-stripe.php$donation_id, $sub_id, $invoice
28giftflow_stripe_subscription_cancelledactionclass-stripe.php$donation_id, $sub_id, $subscription
29giftflow_stripe_subscription_updatedactionclass-stripe.php$donation_id, $sub_id, $subscription
30giftflow_paypal_gateway_supportsfilterclass-paypal.php$supports, $gateway
31giftflow_paypal_prepare_payment_datafilterclass-paypal.php$data, $form_data, $id
32giftflow_paypal_payment_completedactionclass-paypal.php$donation_id, $txn_id, $data
33giftflow_paypal_webhook_payment_completedactionclass-paypal.php$donation_id, $resource
34giftflow_paypal_webhook_payment_deniedactionclass-paypal.php$donation_id, $resource
35giftflow_paypal_webhook_payment_refundedactionclass-paypal.php$donation_id, $resource
36giftflow_donation_before_status_updateactionclass-donations.php$donation_id, $new, $old
37giftflow_donation_status_updatedactionclass-donations.php$donation_id, $new, $old
38giftflow_donation_status_{$status}dynamic actionclass-donations.php$donation_id, $old_status
39giftflow_donation_valid_statusesfilterclass-donations.php$statuses
40giftflow_donation_after_payment_processedaction ⭐class-forms.php / gateways$donation_id, $payment_result
41giftflow_new_donation_admin_email_argsfiltermail.php$args, $donation_id, $data
42giftflow_new_donation_admin_email_subjectfiltermail.php$subject, $donation_id, $data
43giftflow_new_donation_admin_email_headerfiltermail.php$header, $donation_id, $data
44giftflow_thanks_donor_email_argsfiltermail.php$args, $donation_id, $data
45giftflow_thanks_donor_email_subjectfiltermail.php$subject, $donation_id, $data
46giftflow_thanks_donor_email_headerfiltermail.php$header, $donation_id, $data
47giftflow_bank_transfer_payment_pendingactionclass-direct-bank-transfer.php$donation_id, $ref, $data