Charitable Documentation

Learn how to make the most of Charitable with clear, step-by-step instructions.

Ambassadors Invitations: Recruit Fundraisers with Personal Links

Requires: Charitable Pro 1.8.16+
Charitable Ambassadors 3.0.0+

The hardest part of running a peer-to-peer fundraising program isn’t usually the donations – it’s finding new ambassadors to fundraise for you. Invitations turns that on its head: instead of you recruiting one ambassador at a time, your existing supporters do the recruiting for you.

Each one gets a personal “invite link” they can share with their friends, family, and network. Every fundraiser who signs up through that link is automatically credited back to the person who invited them.

It’s a small feature with a big effect: the people most likely to bring you new ambassadors are the ones already involved in your cause.

The Invitations admin tab, showing the enable toggle and configuration settings

When You’d Use It

  • Growing a program past your network. You’ve recruited your initial 10-15 ambassadors. Now those 10-15 ambassadors can each pull in 2-3 of their people.
  • Rewarding your champions. Some supporters are naturally evangelical. Invitations gives you a leaderboard of who’s bringing in the most fundraisers – perfect for public recognition.
  • Running a “bring a friend” campaign. “Forward this link to one person who’d care about the cause” is an ask that fits in a single email, a single text, a single social post.

How Invitations Work and How You Can Benefit

Peer-to-peer fundraising works because people are far more likely to give when someone they know asks them – not when a charity emails them cold. Invitations doubles down on that principle.

Instead of you trying to reach 100 new potential fundraisers a year through marketing, you give the 20 fundraisers you already have a way to each bring in 2-3 of their own people. Within a single fundraising season, your roster has multiplied without you spending an additional dollar on acquisition.

The math is striking. Most nonprofits spend $1-$3 to acquire a new donor through traditional channels (email lists, paid social, direct mail). Acquiring a new fundraiser – someone who will then go on to raise from their network – costs even more.

Invitations brings that cost effectively to zero: the marginal cost of one more recruit is just the recruit clicking a link. The cost savings compound when you remember that fundraisers tend to bring in donations from people who would never have donated to your cause directly, so each new recruit unlocks an entirely new pool of supporters.

There’s a social dimension too. When someone signs up because a friend asked them, they arrive with more emotional investment than someone who saw an ad. They already trust your cause through their personal connection.

They’re statistically more likely to run an active fundraiser (rather than signing up and going dormant), and more likely to stick around for a second campaign next year. Many nonprofits report a 2-3x retention boost on recruited fundraisers vs cold sign-ups.

A few practical tips to get the most out of Invitations:

  • Make a personal ask of your top 5 supporters. Don’t send a generic “now you can recruit!” email to your full ambassador list. Instead, call or email your 5 most engaged supporters directly: “We’re trying a new way to grow the program – would you share this link with two friends?” Champions respond to being asked personally, not bulk-emailed.
  • Recognize publicly. Each month, send a short note (email, social post, or even a brief mention at your next event) thanking your top 3 recruiters by name. Public recognition drives the next month’s behavior more reliably than any feature could.
  • Make the ask specific. “Share this with one runner who’d join you for the marathon” converts better than “share this with anyone who might be interested.” Specificity gives the inviter clarity on who to think of, and makes the recipient feel like the right person to be asked.
  • Watch your moderation queue. If recruits sign up but their fundraisers stay stuck in “Pending” for days, the bottleneck isn’t acquisition – it’s your approval workflow. Set a 24-hour SLA for approving (or rejecting with feedback) new recruits, and you’ll keep the momentum going.
  • Tell stories, not statistics. When a recruited fundraiser hits a milestone (their first $100, their goal, their 10th donor), share their story across your channels. Stories of “Sarah brought in Marcus, who raised $2,500 for the kids” are far more shareable than “we have 50 new recruits this month.”

Where to Find Invitations in Ambassadors

In your WordPress admin, go to Charitable » Ambassadors » Invitations tab.

You’ll see a single toggle the first time you visit. Until you flip it on, everything else stays hidden.

How to Enable Invitations

Invitations is opt-in. Click the Enable Invitations toggle, and the system will ask you to confirm – that’s because turning it on for the first time creates a small custom database table to store the invite tokens. (Don’t worry: turning it off later doesn’t lose any data, and there’s a separate “permanently delete” button if you ever want to wipe the table for good.)

The Enable Invitations toggle in the on position

Once it’s on, five more settings appear:

SettingPlain-English meaning
Who Can RecruitEither “Any Ambassador” (anyone who has at least one published fundraiser) or “Parent Campaign Owners Only” (just the people running the underlying causes). Start with parent-owners only and broaden later.
Landing PageThe page on your site where recruit links land. You’ll create a page, paste the [charitable_invite_landing] shortcode into it, then pick that page here.
Landing Page Intro CopyOptional rich text shown above the cause card on the landing page. Use this to set context – “Help us bring more runners to the marathon,” etc.
Landing Fallback ImageIf the cause campaign someone’s recruiting for doesn’t have a featured image, this is the image the landing page uses instead.
Email Inviter On ApprovalWhen ON, the recruiter gets a celebratory email the moment their recruit’s fundraiser is approved. Highly recommended – it reinforces the behavior you want more of.

Setting up your landing page

  1. Create a new page in WordPress (Pages > Add New). Title it something like “Become a Fundraiser” or “Join Our Team.”
  2. Paste this shortcode into the page content:
    [charitable_invite_landing]
    
  3. Publish the page.
  4. Back on the Invitations tab, pick that page in the Landing Page setting and save.

That’s it – the page will now render with your hero, the cause card for whoever the recruit came from, and a Become a Fundraiser button that walks them into your existing campaign submission form.

If you want to see what it’ll look like before sharing any invite links, visit the page directly while logged out. You’ll see a “generic” version with placeholder content (no specific cause). When someone clicks a real invite URL, the landing page swaps in the actual cause they were referred to.

How Your Ambassadors Will Use It

Once Invitations is enabled, anyone eligible to recruit (per your Who Can Recruit setting) will see a new card at the top of their My Campaigns page:

The Recruit Fundraisers card on My Campaigns, showing the personal invite URL and share icons

The card has:

  • Their personal invite URL – a unique link that ties any signup back to them. They can copy it with one click.
  • Share buttons – email, SMS, WhatsApp, X/Twitter, and Facebook. Each opens the matching app pre-filled with a friendly message.
  • A stats line – how many people they’ve recruited so far, broken down by status.
  • A “Your Recruits” toggle – they can switch their My Campaigns page to see everyone they’ve brought in.

If they own multiple parent campaigns, they also get a per-campaign Recruit button (in the actions row of each campaign card) that opens a popover with a campaign-specific invite URL. That way they can say “recruit for this cause” instead of leaving it up to the recruit to pick one.

What Happens When Someone Clicks The Link

The journey, from the recruit’s perspective:

  1. Click the invite URL their friend sent them.
  2. Land on your invite landing page, which shows the cause they’re being invited to support.
  3. Click “Become a Fundraiser” to walk into the campaign submission form.
  4. Sign up and submit their fundraiser.
  5. Your moderation team approves it (if you’re using Manual Approval) – or it publishes immediately under auto-approval.

Behind the scenes, the system has been quietly tracking that this recruit came from a specific inviter, using a 30-day cookie. For the full mechanics, see How attribution works.

Ambassadors invite

Seeing Who Recruited Whom

The Recruitment widget on the Overview dashboard gives you the program-level view: total recruits this month, status breakdown, time-series chart, and a Top Recruiters leaderboard.

Individual ambassadors see their own recruits by clicking the “Your Recruits” toggle on their My Campaigns page:

Filter chips at the top split the list into All / Approved / Pending / Rejected. Each chip shows a count, so they can see at a glance how many of their recruits are still waiting for your approval.

When Something’s Off – The Self-Check Notices

The Invitations tab shows colored banners at the top when something needs your attention:

A self-check notice indicating that Invitations are enabled but the database table is missing
You’ll seeWhat’s wrongWhat to do
Red: “Enabled but database table missing”A plugin update or manual DB cleanup wiped the table.Click Recreate Table – the schema gets rebuilt in place.
Yellow: “Schema out of date”An upgrade introduced a newer table schema; your install hasn’t migrated yet.Click Run Upgrade. It’s safe and idempotent.
Blue: “Disabled but data exists”You turned the feature off but recruit history is still in the table.Either Re-enable to restore access, or click Permanently delete and remove table to purge. (The destructive option asks you to type the table name to confirm.)
Blue: “Cache compatibility off”Some caching plugins may cache your invite landing page, which would prevent the click-to-attribution flow.Turn on Cache Compatibility under Charitable > Settings > Advanced > Misc.
Yellow: “No landing page configured”You enabled Invitations but didn’t pick a Landing Page setting.Pick one – see “Setting up your landing page” above.

Each banner also has a “Learn about invite storage” link to the storage docs page if you want more detail.

Tips for Getting Recruitment Going

  • Email your top 5 ambassadors personally. “We’re trying a new way to grow the program – would you be willing to share this link with one or two people who’d care?” beats any generic announcement.
  • Recognize recruiters publicly. A monthly “shout out to our top 3 recruiters” email or social post drives the next month’s behavior.
  • Make the ask specific. “Share this link with one runner who’d join you” converts better than “share this link with people who might be interested.”
  • Watch the Pending column. If recruits keep showing up but their fundraisers stay in Pending, the bottleneck is moderation – make sure someone owns reviewing the queue.

Developer Reference

The rest of this page is for developers customizing the Invitations system.

Settings storage

All Invitations settings are stored under the ambassadors sub-array of wp_options.charitable_settings, e.g.:

charitable_settings > ambassadors > invites_enabled
charitable_settings > ambassadors > invites_who_can_recruit
charitable_settings > ambassadors > invites_landing_page_id
…

Read via the helper:

charitable_ambassadors_get_invites_setting( $key, $default );
charitable_ambassadors_invites_enabled(); // bool

Custom table

When the feature is first enabled, Charitable_Ambassadors_Invites_Schema::create() creates a small custom table named {$wpdb->prefix}charitable_ambassadors_invite_tokens via dbDelta(). The schema is managed entirely by the plugin – the class exposes create(), exists(), is_current(), upgrade(), and drop(). The current schema version is stored in wp_option('charitable_ambassadors_invites_schema_version'). See How invitation data is stored for the full table lifecycle (creation, soft-disable, schema upgrades, destructive uninstall).

Filters

FilterDefaultPurpose
charitable_ambassadors_invitations_settings_field_definitionsarray of 6 fieldsAdd, remove, or modify Invitations admin settings.
charitable_ambassadors_user_can_invitebool (computed)Override eligibility for who sees the recruit card. Signature ( $can, $user_id, $campaign_id_or_null ).
charitable_ambassadors_invite_attribution_mode'last_click'Return 'first_click' to credit the earliest clicked inviter instead of the most recent.
charitable_ambassadors_invite_cookie_lifetime30 * DAY_IN_SECONDSOverride the cookie TTL.
charitable_ambassadors_invitations_storage_docs_urlwpcharitable.com URLOverride the docs URL the self-check notices link to.
charitable_ambassadors_recruit_card_learn_more_url''Add a “Learn more” link to the recruit card. Empty string suppresses it.
charitable_ambassadors_recruit_card_learn_more_label__( 'Learn more' )Label for the Learn more link.
charitable_ambassadors_recruit_card_empty_text“No recruits yet…”Empty-state copy when an inviter has zero recruits.
charitable_ambassadors_recruits_view_empty_text“You haven’t recruited anyone yet…”Empty-state copy on the Your Recruits tab. Receives $status + $user_id.
charitable_ambassadors_invitations_csv_max_rows10000Cap on CSV exports.

Actions

ActionArgsFires when
charitable_ambassadors_my_campaigns_before_grid$campaigns, $user_idJust before the campaign grid renders. The recruit card mounts here.
charitable_ambassadors_my_campaigns_card_actions$campaign_id, $contextIn each campaign card’s actions row. The per-campaign Recruit popover mounts here for parent campaigns.
charitable_ambassadors_recruit_card_footer$user_id, $token, $invite_urlInside the recruit card, just above the Learn more link. Echo your own HTML; callbacks responsible for escaping.
charitable_ambassadors_invite_clicked$token_row, $requestAfter the URL handler resolves a valid token.
charitable_ambassadors_invite_claimed$token_row, $fundraiser_id, $inviter_user_idAfter attribution meta is stamped.
charitable_ambassadors_invite_self_recruit_skipped$token_row, $fundraiser_idSelf-recruit guard blocked an attribution.

Helper functions

charitable_ambassadors_invites_enabled()                       // bool
charitable_ambassadors_get_invites_setting( $key, $default )   // mixed
charitable_ambassadors_user_can_invite( $user_id, $campaign_id = null )  // bool, filterable
charitable_ambassadors_invites_log( $code, $context )          // logs to Charitable Tools > Log

The eligibility helper is the function the recruit card uses to decide whether to render. Use it in your own code (e.g. an admin notice or a custom My Campaigns extension) to keep eligibility consistent.

Classes

ClassFileRole
Charitable_Ambassadors_Invitesincludes/invites/class-charitable-ambassadors-invites.phpBootstrap. Registers the [charitable_invite_landing] shortcode, the URL handler, the attribution listener, the email trigger, and the My Campaigns render hooks.
Charitable_Ambassadors_Invites_Schemaclass-charitable-ambassadors-invites-schema.phpCreate/drop/upgrade for the invite tokens table.
Charitable_Ambassadors_Invites_Tokensclass-charitable-ambassadors-invites-tokens.phpToken CRUD: get_or_create, lookup, increment_view, increment_claim, revoke, build_invite_url.
Charitable_Ambassadors_Invitations_Dataclass-charitable-ambassadors-invitations-data.phpAdmin-side queries: top recruiters, recent activity, breakdown, recruits-for-user.
Charitable_Ambassadors_Invitationsclass-charitable-ambassadors-invitations.phpAdmin tab renderer, 5 AJAX endpoints, form-POST destructive uninstall handler, self-check notices.
Charitable_Ambassadors_Invitations_CSVclass-charitable-ambassadors-invitations-csv.phpCSV export handler with formula-injection neutralization.
Charitable_Ambassadors_Email_Inviter_Recruit_Approvedclass-charitable-ambassadors-email-inviter-recruit-approved.phpThe transactional email. Resolves 5 shortcode tags via charitable_email_content_field_value_* filters.

URL handler

The URL handler runs on init priority 1. It looks for ?charitable-invite=<token> and, if a valid token is found:

  1. Sets the charitable_invite_token cookie (30 days, SameSite=Lax, secure when SSL).
  2. Increments the token’s view_count.
  3. Emits no-cache headers via charitable_nocache_headers() (Pro 1.8.15.2+) or nocache_headers() (WP core fallback).
  4. Redirects to the configured landing page with ?charitable-invite stripped.

The redirect uses 302 (not 301) so cache layers don’t memoize the redirect itself.

Attribution

Attribution is triggered by Pro’s charitable_campaign_submission_save action with signature ( $data, $campaign_id, $user_id, $form ). The hook handler in Charitable_Ambassadors_Invites::on_campaign_submission_save():

  1. Reads the charitable_invite_token cookie.
  2. Looks the token up; bails silently on miss.
  3. Checks inviter_user_id !== submitter_user_id (self-recruit guard).
  4. Writes two post-meta keys on the new fundraiser:
    • _charitable_ambassadors_invited_by_user_id
    • _charitable_ambassadors_invited_via_token_id
  5. Increments the token’s claim_count + last_claimed_at.

The handler is signature-adaptive: it accepts both the canonical 4-arg shape and a legacy 2-arg ( $fundraiser_id, $user_id ) shape used by the verification harness.

Logging

Every invite event is logged to Charitable Tools > Log via charitable_log():

type=addon
source=ambassadors_invites
level=info  (or warning for the skip cases)

Log codes: invite_clicked, invite_claimed, self_recruit_skipped, inviter_deleted_at_approval, attribution_skipped_revoked_token, unconfigured_landing_page_admin_view, recreate_table_invoked, permanent_delete_invoked.

AJAX endpoints

All on wp_ajax_ only, nonce charitable_ambassadors_invitations, capability manage_charitable_settings:

ActionPurpose
charitable_ambassadors_invitations_recreate_tableRun Schema::create() after a self-check showed the table missing.
charitable_ambassadors_invitations_run_schema_upgradeRun Schema::upgrade() from the self-check “out of date” state.
charitable_ambassadors_invitations_disable_featureToggle invites_enabled off.
charitable_ambassadors_invitations_re_enableToggle invites_enabled back on without re-running the create-table modal.
charitable_ambassadors_invitations_search_landing_pagesPage autocomplete for the Landing Page setting.

The destructive uninstall (“permanently delete and remove table”) is a form-POST handler at admin-post.php?action=charitable_ambassadors_invitations_purge, gated by a nonce + a manually-typed table-name confirmation.

Cache Compatibility

The invite landing page is dynamic (per-user, per-token). Pro 1.8.15.2’s charitable_is_dynamic_page filter is wired to flag the landing page so cache plugins skip it. If that Pro feature isn’t available (older Pro), the URL handler still emits nocache_headers() directly.

Customization Examples

Common tweaks. Add any of these to your theme’s functions.php or a site-specific plugin.

Switch to first-click attribution (credit the first inviter, not the most recent):

add_filter( 'charitable_ambassadors_invite_attribution_mode', function () {
    return 'first_click';
} );

Extend the recruit-tracking cookie from 30 days to 90 days:

add_filter( 'charitable_ambassadors_invite_cookie_lifetime', function () {
    return 90 * DAY_IN_SECONDS;
} );

Add a “Learn more” link to the recruit card on My Campaigns:

add_filter( 'charitable_ambassadors_recruit_card_learn_more_url', function () {
    return home_url( '/ambassador-handbook/recruiting/' );
} );

add_filter( 'charitable_ambassadors_recruit_card_learn_more_label', function () {
    return 'Tips for inviting friends';
} );

Inject your own content (e.g. a video) into the recruit card:

add_action( 'charitable_ambassadors_recruit_card_footer', function ( $user_id, $token, $invite_url ) {
    echo '<p style="margin-top: 16px;"><a href="https://example.com/recruiting-video">Watch our 2-minute walkthrough</a></p>';
}, 10, 3 );

Restrict recruiting to a custom role (e.g. only users with verified_ambassador):

add_filter( 'charitable_ambassadors_user_can_invite', function ( $can, $user_id, $campaign_id ) {
    if ( ! $can ) {
        return false;
    }
    $user = get_userdata( $user_id );
    return $user && in_array( 'verified_ambassador', (array) $user->roles, true );
}, 10, 3 );

Customize the empty-state copy on the Your Recruits tab:

add_filter( 'charitable_ambassadors_recruits_view_empty_text', function ( $message, $status, $user_id ) {
    if ( 'rejected' === $status ) {
        return 'No rejected recruits - your standards are solid!';
    }
    return $message;
}, 10, 3 );

Related

Helpful Links

🤝 Get help when you need it

Connect with Customer Support →  

📑 Find the guide you need

Browse the Documentation Hub →  

⬇️ Download proven strategies, campaign ideas, and expert tools
Get the Fundraising Kit →  

💸 Get Free Fundraising Resources
Head to the Charitable Fundraising Hub

🤔 Got questions about Charitable?
Charitable FAQs

Need help understanding non-profit terms and jargon?
See our Non-Profit Glossary

Still have questions? We’re here to help!

Last Modified:

What's New In Charitable

View The Latest Updates
🔔 Subscribe to get our latest updates
📧 Subscribe to Emails

Email Subscription

Join our Newsletter

We won’t spam you. We only send an email when we think it will genuinely help you. Unsubscribe at any time!

automation update

⚡ Visual Automation Builder: Drag and Drop With No Code!

Charitable Automation Connect 2.3.0 introduces the Visual Automation Builder, a full-screen canvas that lays each automation out as a flow of connected cards: a trigger, optional conditions, and a list of actions that run in order.

🧩 Many actions, one trigger: Tag a donor, send an email, add a note, and fire a webhook from a single event, dragged into any order.

✉️ Act inside Charitable: New Send Email, Tag Donor, and Add Donor Note actions run with no external service required.

🔤 Merge tags: Personalize emails and notes with live fields like {first_name}, {total}, and {campaign_name}.

🔁 Apply to existing donors: Run Tag Donor and Add Donor Note against the donors you already have.

🖥️ Canvas or Simple: Switch views anytime, and automations built before 2.3.0 keep working unchanged.

Read more here.

Integration updated

📬 Introducing Brevo for Charitable: Turn Donors into Subscribers Automatically

The moment a supporter makes a gift is when they are most engaged. With the new Brevo integration for Charitable, you can automatically turn those one-time donors into long-term subscribers without touching a single spreadsheet.

Simply collect donor consent right on your donation form and start your welcome series immediately.

What’s New:

🔄 Automated Subscriber Sync: New donors who opt in are added straight to your Brevo contact list as soon as their payment clears—no manual exports or CSV imports required.

🎯 Granular Consent & Opt-In Control: Customize your checkbox label, choose whether it defaults to checked or unchecked, or turn on Brevo double opt-in to keep your list clean and compliant.

📋 Per-Campaign List Mapping: Route supporters to your global email list or map specific campaigns to targeted Brevo lists to tailor your follow-up messaging.

⚡ 5-Minute Setup: Connect instantly by pasting your Brevo API key into the Newsletter settings, map your contact fields, and start building your email list on autopilot.

Ready to grow your mailing list? Brevo is available now starting on the Charitable Plus plan—connect your account today!

recurring donations updated

💳 Introducing Card Updates: Fix Expired Cards Without Losing Subscriptions!

newExpired or updated credit cards are one of the biggest silent leaks in recurring fundraising. With Card Updates in the Recurring Donations extension, donors can now refresh their payment details directly—keeping their subscription, schedule, and giving history completely intact.

No canceled plans, no lost history, and zero administrative headache for your team.

What’s New:

⚡ 30-Second Self-Service: Donors get a dedicated “Update Card” button in their dashboard that opens Stripe’s secure, PCI-compliant Customer Portal to update card details instantly.

🔒 Scoped & Safe Access: Scoped exclusively to card updates by default, donors can’t accidentally cancel or alter their plans from inside the portal, keeping your webhooks and data in sync.

🤝 Admin-Assisted Support: Helping a donor on the phone? Open their secure Stripe portal in one click from your admin screen or generate a single-use update link to email them.

📋 Automatic Audit Trail: Every payment method update is recorded automatically with a timestamp in both system-wide logs and the individual donor’s profile.

Ready to protect your recurring revenue? Get the Plus or Pro plan and update Recurring Donations to 2.3.0+ and enable “Update Payment Method” under your Settings today!

Integration page builder

Divi Fans Rejoice! Native Divi 5 Campaign Progress Bar Module!

With our new native Divi 5 module, you can anchor your microsites with real-time fundraising stats directly on the visual canvas. Here’s how it works, and why it’s worth turning on today.

Create campaign updates that are VISUAL AND LIVE. You can also:

📊 Campaign Progress Bar: Drop a live progress bar into any Divi 5 layout and show goal progress in real time.

🎨 Deep styling controls: Easily customize the bar and track color, height, and radius to match your brand perfectly.

👁️ Visual Builder ready: Configure and preview everything directly on the Divi canvas as a first-class module.

🔁 Identical rendering: The same exact engine powers this module, meaning consistent design without legacy shims.

✅ Faster launches: Never leave the Divi 5 interface to configure shortcodes or guess how your goal labels will look.

Learn more here.

Integration page builder

👉🏻 New in Charitable: Native Elementor Widgets for Seamless Campaign Building

With native Elementor widgets, you design donation campaigns right alongside the rest of your page without touching code. Here’s how it works, and why it’s worth turning on today.

Create fundraising pages that are VISUAL, NATIVE, AND SHORTCODE-FREE. You can also:

⚡ Mini Donation: Add a compact, high-converting donation widget with preset amounts and full color control.

⏳ Campaign Countdown: Build urgency for a deadline-driven appeal, complete with optional confetti when the goal is hit.

📣 Donation Feed: Prove momentum by showing visitors the social proof of real people giving right now.

🏆 Donor Leaderboard: Celebrate top supporters with gold, silver, and bronze styling to spark friendly giving.

🖼️ Campaign Showcase: Feature multiple campaigns in a landing page grid or carousel, with search, filters, and badges.

Learn more here.