This guide covers three migration scenarios: the internal donation data migration, the 2.8.0 Form Template assignment, and migrating from external platforms.
Applies to: Fundations 2.8.0+.
Contents
1. Internal donation data migration
Fundations stores donations in a dedicated custom database table ({prefix}get_fund_donations). Sites created before this table was introduced (approximately version 1.5.0) may have donation records stored as a legacy WordPress post type. The migration tool converts those records to the custom table.
Until the migration completes, the Entries admin page and some stats calculations use the legacy data source.
Before you start
- Back up your database.
- The migration processes donations in batches of 50. On a site with thousands of donations, this may take several minutes.
- You can pause and resume at any time without data loss.
- Legacy donation posts are not deleted until you explicitly run the cleanup step after verifying the migration.
How to run the migration
- Go to Fundations, Settings (or the migration admin page if surfaced separately).
- Under the Migration section, check the current status.
- Click Start Migration.
- The page shows progress as each batch completes. Do not close the browser tab while batches are processing.
- When all batches are done, the status changes to
completed. - Click Verify Migration to confirm all records transferred correctly.
- After verification, click Clean Up Legacy Data to remove the legacy
get_fund_donationposts.

Migration states
| State | Meaning |
|---|---|
not_started | No migration has been run |
in_progress | Batches are processing |
completed | All donations migrated |
failed | A batch error stopped the process |
If the status is failed, click Reset Migration and start again. If batches consistently time out, ask your hosting provider to increase max_execution_time.
What data is migrated
The migration reads all _get_donation_* post meta fields from legacy donation posts:
| Meta field | Column in custom table |
|---|---|
_get_donation_action_id | action_id |
_get_donation_user_id | user_id |
_get_donation_amount | amount |
_get_donation_currency | currency |
_get_donation_status | status |
_get_donation_payment_provider | payment_provider |
_get_donation_payment_id | payment_id |
_get_donation_first_name | first_name |
_get_donation_last_name | last_name |
_get_donation_email | email |
_get_donation_is_anonymous | is_anonymous |
_get_donation_marketing_consent | marketing_consent |
_get_donation_message | message |
_get_donation_ip_address | ip_address |
_get_donation_created_at | created_at |
All other _get_donation_* keys | metadata JSON column |
After each donation migrates, the legacy post receives a meta key _get_donation_migrated_to_custom_table containing the new table row ID. This marker prevents duplicate migration.
On completion, the migration automatically enables the custom table for reads (option get_fund_use_custom_donations_table) and triggers a full stats recalculation.
Developer reference
AJAX actions (admin-only, require nonce get_fund_migration):
| Action | Purpose |
|---|---|
wp_ajax_get_fund_start_migration | Initialize migration |
wp_ajax_get_fund_migrate_batch | Process one batch of 50 |
wp_ajax_get_fund_get_migration_status | Poll current status |
wp_ajax_get_fund_reset_migration | Reset to not_started |
wp_ajax_get_fund_verify_migration | Verify record counts |
wp_ajax_get_fund_cleanup_legacy | Delete legacy posts in batches |
Hooks fired during migration:
| Hook | When |
|---|---|
get_fund_donation_migrated( $new_id, $legacy_post_id, $data ) | After each donation record migrates |
get_fund_migration_completed() | When all batches finish |
get_fund_migration_reset() | When migration is reset |
2. Form Template assignment (2.8.x)
As of version 2.8.0, the donation form block (“Forms”) requires a Form Template. Blocks without one show a migration banner in the editor and nothing to site visitors.
This affects every site upgrading from a version before 2.8.0, because the old inline configuration was removed.
Steps
- Update Fundations to 2.8.0 (or install it fresh).
- Go to Fundations, Forms in the admin.
- Click New Template (or import a preset if available).
- Drag system fields onto the canvas: at minimum, add Donation Amounts, Payment Methods, and Submit Button.
- Configure each field as needed and click Save Template.
- A dashboard admin notice lists every post that contains a donation form block without a template assigned. Click an edit link.
- In the block editor, find the donation form block (now labeled “Forms”).
- In the block sidebar, open the Form Template panel and select your template.
- Save the post.
- Repeat for all posts in the notice.

The notice refreshes every 15 minutes and disappears when all posts have a template assigned.
What if I had inline settings (amounts, colors, columns) configured?
Those inline settings no longer apply. You must recreate equivalent settings inside the Form Template’s system field configuration. The block attribute data is still stored in the database (for parsing safety) but the renderer ignores it.
3. Platform migration
This section covers migrating existing crowdfunding data from another platform to Fundations.
Before you start
- Install and configure Fundations on your WordPress site first.
- Run the Page Installer from Fundations, Settings to create all required pages.
- Configure your payment gateway before importing, so donors can donate immediately after launch.
- Recurring donations are not supported in the current release.
Migrating from GoFundMe
GoFundMe does not provide a data export API. Migration is primarily manual.
- Export your GoFundMe campaign data from your dashboard (CSV if available).
- For each campaign, create a new fundraising page using the Action Wizard or directly in the WordPress admin.
- Set the goal amount and raised amount offset (
_get_fund_raised_amount_offset) to reflect existing donations if you want to carry over totals. - Notify your existing donors of the new donation link.
- Donor history from GoFundMe cannot be imported into the Fundations donation table automatically. Document legacy totals in the offset field.
Migrating from GiveWP
| GiveWP concept | Fundations equivalent |
|---|---|
| Give Form | Donation form block with Form Template |
| Donation | {prefix}get_fund_donations record |
| Donor | Donor fields in donations table |
| Campaign | get_fund_action post (or Pro get_fund_campaign) |
| Form fields | Custom fields in Forms Builder |
Steps:
- Export GiveWP donations using GiveWP’s built-in exporter (Donations, Export).
- Create matching fundraising pages in Fundations.
- Import donations to
{prefix}get_fund_donationsusing a database tool or a custom import script that maps GiveWP fields to Fundations columns (see the field mapping in the Internal donation data migration section for column names). - After import, run a stats recalculation from the admin meta box on each campaign page.
Migrating from WP Charitable
| WP Charitable concept | Fundations equivalent |
|---|---|
| Campaign | get_fund_action post |
| Donation | {prefix}get_fund_donations record |
| Campaign goal | _get_fund_amount meta |
| Amount raised | _get_fund_raised_amount meta (backed by stats table) |
| Custom fields | Forms Builder custom fields |
| Campaign end date | _get_fund_end_date meta |
Notes:
- Recurring donations: WP Charitable recurring donors cannot be migrated to active recurring plans in Fundations because recurring is currently disabled.
- Custom donation forms: recreate them in the Fundations Forms Builder.
Migrating from a non-WordPress platform
- Export donor and donation records from your current platform in CSV or JSON format.
- Map each field to a column in
{prefix}get_fund_donations(see field list above). - Use WP-CLI or a custom script to insert rows directly into the custom table.
- After import, set
get_fund_use_custom_donations_tabletotruein the WordPress options table if not already set. - Run
Get_Fund_Stats_Model::recalculate_all()(or use the per-campaign recalculate button) to rebuild aggregated totals. - Verify totals match your source platform before going live.
Migrating between WordPress sites
- Export the source site’s database.
- On the destination site, import the database and run WordPress search-replace for the domain change (
wp search-replace old.domain new.domain). - Activate Fundations on the destination site.
- Verify that page IDs stored in Fundations settings (for wizard, archive, account, claim, edit, checkout, thank-you pages) still match the actual pages. Re-run page installation if pages were lost.
- Flush permalinks (Settings, Permalinks, Save Changes).