Fundations supports peer-to-peer (P2P) fundraising, where individual supporters create their own fundraising pages under a shared campaign, optionally organised into teams. This is a free feature.

Why use this
Peer-to-peer fundraising multiplies reach by letting supporters fundraise on behalf of an organisation or cause. A single campaign can have hundreds of individual fundraising pages, each with its own goal, and optionally grouped into competing teams.
What it does
Data model
All fundraising pages, campaigns, and individual actions share a single custom post type: get_fund_action. The hierarchy is managed through post meta, not WordPress post parent/child relationships.
| Meta key | Description |
|---|---|
_get_fund_is_campaign | true on the post that acts as the campaign root |
_get_fund_campaign_id | Post ID of the parent campaign (set on child actions) |
_get_fund_team_id | Post ID of the team this action belongs to |
_get_fund_structure_type | individual, join_team, or create_team |
_get_fund_children_disabled | Prevents new actions being created under this campaign |
Teams use a separate post type: get_fund_team. Each team carries _get_fund_campaign_id, _get_fund_team_goal, and _get_fund_team_raised meta.
Events taxonomy
Fundations are assigned to events using the get_fund_event taxonomy (hierarchical). See Events for full details.
Campaign search in the wizard
When a user creates an action and selects to join a campaign, the wizard searches for campaigns that:
- Have a featured image set.
- Have a status other than
closed. - Do not have
_get_fund_children_disabledset to1.
The query can be modified with the get_fund_wizard_campaign_query_args filter.
Disabling child actions
A campaign owner (or admin) can set _get_fund_children_disabled = 1 to prevent new fundraising pages from being created under that campaign. From the frontend edit form, this is a one-way action for non-admins: they can disable but cannot re-enable. Only users with edit_others_posts can re-enable.
PRO distinction
The free P2P mechanism uses get_fund_action posts flagged with _get_fund_is_campaign. Pro adds a separate get_campaign_action post type for lead-generation and signature campaigns, which is distinct from P2P fundraising.
How to use it
Setting up a campaign
- Create a new Fundation post in Fundations > Add New.
- In the post meta panel, check the Is Campaign option.
- Set a goal, description, featured image, and publish the post.
Letting supporters join
- Ensure the campaign has a featured image (required for campaign search).
- Ensure
_get_fund_children_disabledis not set. - Share the Wizard page URL. When supporters create an action, they can search for and join this campaign.
Setting up teams
- Go to Fundations > Teams > Add New.
- Set the team name, goal, and link it to a campaign.
- In the wizard, supporters can then choose to create a team or join an existing one.
Settings and options
| Option key | Default | Description |
|---|---|---|
get_fund_event_creation | admin_only | Controls who can assign/create events: admin_only or all_users |
What you can and cannot do
You can:
- Nest individual actions under a campaign.
- Organise actions into teams within a campaign.
- Prevent new joiners by setting
_get_fund_children_disabled. - View member counts and team totals in the admin list.
You cannot:
- Create multi-level campaign hierarchies (the model is flat via meta).
- Use the
get_campaign_actionpost type (lead/signature campaigns) without Pro. - Re-enable
_get_fund_children_disabledas a non-admin once it is set.
Troubleshooting
Campaign does not appear in the wizard search. Check that the campaign has a featured image, its status is not closed, and _get_fund_children_disabled is not 1.
Team raised amount is wrong. The team raised amount is a denormalised sum. If it drifts, go to the campaign admin page and trigger a stats recalculation, or fire get_fund_stats_updated programmatically.
Child actions count is zero in admin. Confirm that child actions have _get_fund_campaign_id set to the correct campaign post ID.
Developer reference
Filters
| Hook | Arguments | Description |
|---|---|---|
get_fund_campaign_post_types | array $post_types | Array of post type slugs that can act as campaigns. |
get_fund_wizard_campaign_query_args | array $args, string $search | Modify the WP_Query arguments used to search for joinable campaigns. |
get_fund_cpt_args | array $args | Modify get_fund_action post type registration arguments. |
get_fund_child_actions_block_output | string $output, array $attributes, int $post_id | Filter the rendered HTML of the Child Actions block. |
Actions
| Hook | Arguments | Description |
|---|---|---|
get_fund_action_created | int $post_id, array $data | Fires when a new action is created via the wizard. |
get_fund_action_updated | int $post_id | Fires when an action is updated. |
get_fund_action_closed | int $post_id | Fires when an action is closed. |