Charitable Documentation

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

Ambassadors Visual Template Mode – Design Once, Apply To Every Fundraiser

Requires: Charitable Pro 1.8.16+
Charitable Ambassadors 3.0.0+

Visual Template Mode lets you design a single campaign using the Charitable Visual Campaign Builder – drag blocks around, set typography, place a donor wall, add a sponsor strip.

Next, you can have every ambassador fundraiser inherit that design, personalized to each ambassador.

  • Their name where placeholders sit.
  • Their story where the template’s story block sits.
  • Their image where the template’s hero image sits.
  • Their progress against their goal where the template’s progress bar sits.

It’s the difference between every fundraiser looking the same (boring) and every fundraiser looking consistent (on-brand). The template is the brand layer; the ambassador’s content fills in the details.

The Templates sub-tab showing the Frontend Template Style chooser with Legacy, Enhanced, and Visual cards

When You’d Use It

  • Sponsored events – the marathon’s gold-tier sponsor wants their logo on every ambassador’s page. Template carries the logo block; every fundraiser inherits it.
  • Strict brand programs – your visual identity team wants tight control over how every page renders. Design it once; lock it in.
  • A/B testing – clone the template, edit the copy, swap which template is active; every fundraiser swaps in real time.
  • Cinematic causes – memorial campaigns, gala fundraisers – the same hero, the same color palette, the same emotional rhythm across every ambassador.

Finding the Visual Templates

In your WordPress admin, head to Charitable » Ambassadors » Templates

The Templates sub-tab has three settings groups:

  1. Frontend Template Style – the Legacy / Enhanced / Visual chooser. This is where you turn Visual mode on.
  2. Fundraiser Template Campaign – the campaign chooser that picks which existing campaign acts as the template. Only shown when Visual is selected.
  3. Frontend Template – the layout-variant chooser (same as the Fundraiser Page sub-tab). When a template campaign is configured, this is informational only – the template wins.

Picking a Frontend Template Style

Three modes, each progressively more capable:

ModeRenders fundraiser pages with…
LegacyThe original 1.x templates. CSS and markup unchanged. Pick this if you’ve customized templates or CSS and don’t want anything to change.
EnhancedThe 3.0 templates (progress bars, icon stats, share popover, search) on top of the existing pages. Uses the Fundraiser Page layout chooser for shape.
VisualEvery fundraiser page is rendered from a Visual Campaign Builder layout you choose below. Maximum control.

You can switch between modes at any time. Switching back to Legacy doesn’t lose any saved settings – Visual mode’s template-campaign pointer is preserved so you can flip back later.

Picking a Template Campaign

Once Visual is selected, the Fundraiser Template Campaign chooser appears.

The chooser is autocomplete-driven – start typing your template’s title, pick from results. It only offers campaigns that:

  • Have been opened in the Visual Campaign Builder (have campaign_settings_v2 post-meta).
  • Are not the fundraiser you’re about to render (no infinite loop).
  • Pass any charitable_ambassadors_onboarding_visual_template_candidates filter you’ve added.

Pick one, save, and Visual mode is active. Every ambassador fundraiser on your site now renders using that campaign’s design.

How the Substitution Works

When a visitor loads an ambassador fundraiser page, Ambassadors intercepts the get_post_metadata filter for the campaign’s campaign_settings_v2 meta key. Here’s what happens:

  1. Pro asks for the fundraiser’s campaign_settings_v2 builder data.
  2. Ambassadors checks: are we in Visual mode? Is a template configured? Is this a fundraiser page (not the template itself)? Does this fundraiser have its own builder data (if so, the fundraiser’s own data wins)?
  3. If all gates pass, Ambassadors deep-clones the template’s campaign_settings_v2, rewrites id to the fundraiser’s ID and title to the fundraiser’s title.
  4. Every string in the cloned data is run through the token substituter – any {ambassador_name}, {parent_title}, {percent_raised}, etc. is replaced with the fundraiser’s actual values.
  5. Pro reads the substituted data and renders. Each dynamic block (donate-form, progress-bar, donor-wall) rebinds to the fundraiser’s ID at render time.

The result: a fundraiser page that looks exactly like the template, but with the right ambassador’s content.

Available Tokens

You can use any of these tokens in the template’s text fields, alt text, captions, etc:

TokenSubstituted with
{title}The fundraiser’s post title.
{ambassador_name}The author’s display name.
{parent_title}The parent campaign’s title.
{parent_url}The parent campaign’s permalink.
{goal}The fundraiser’s goal amount (formatted).
{raised}The fundraiser’s raised amount (formatted).
{donor_count}The number of unique donors.
{percent_raised}Progress as a percentage (e.g. 42%).
{fundraiser_image}Featured image URL.

Drop them anywhere in the template’s text content. For example, a hero heading of “Help {ambassador_name} reach their {goal} goal” becomes “Help Sarah Chen reach their $5,000 goal” on Sarah’s fundraiser, “Help Marcus Liu reach their $2,500 goal” on Marcus’s.

Per-Fundraiser Overrides

A fundraiser can opt out of the template by having its own campaign_settings_v2 meta. If you (or the ambassador) open a specific fundraiser in the Visual Campaign Builder and save it, that fundraiser’s data wins from then on – the template no longer applies to it.

To restore the template’s design on a fundraiser that’s gone its own way: delete the campaign_settings_v2 post-meta on that fundraiser:

delete_post_meta( $fundraiser_id, 'campaign_settings_v2' );

The next page load will re-apply the template.

Dynamic Blocks Still Work

Even though the template’s structure is cloned to every fundraiser, dynamic blocks like the donate form, progress bar, and donor wall still bind to the fundraiser’s ID at render time. So:

  • The progress bar shows the fundraiser’s progress, not the template’s.
  • The donate form posts to the fundraiser’s campaign.
  • The donor wall lists the fundraiser’s donors, not the template’s.

This is what makes Visual mode work – the design is shared, but the data is per-fundraiser.

Social Links

If the template includes a Social Links block, that block becomes the ambassador’s social handles (pulled from their user profile fields). Ambassadors who haven’t filled out their social handles get an empty Social Links block – so we surface a warning in the admin if your template includes Social Links but the ambassador profile-completion is low.

Which Ambassador Template Shows What

Charitable Ambassadors has two layers of template control under Ambassadors → Templates:

  1. Frontend Template Style — the overall engine:
    • Legacy — the original templates and CSS, unchanged. The Fundraiser Page settings (QR, donor wall, share popover, etc.) do not apply here.
    • Enhanced — modern templates with hero image, progress bar, icon stats, share and search. Recommended for most installs. The Fundraiser Page settings apply.
    • Visual — use a campaign you built in the Visual Builder as the template.
  2. Frontend Template — when the style is Enhanced, this picks the layout. Each layout renders a different mix of elements. Use the table below to choose the one that fits.

Enhanced template feature comparison

TemplateQR code (when enabled)*Hero imageProgress barIcon statsDonor wallDonate cardSticky navBest for
ClassicCorner sticker + Share popoverYesYesYesYesRight sidebarNoA clean, familiar hero + story + donate layout
Story-ForwardCorner sticker + Share popoverYesYesYesYesConversion band at bottomNoNarrative-first campaigns
Stats-ForwardCorner sticker + Share popoverYes (short)YesYesYesOverlay on heroNoLeading with progress and numbers
Donate-FirstCorner sticker + Share popoverYes (banner)YesYesYesInline, above storyNoMaximizing conversions; story collapsed
MagazineCorner sticker + Share popoverYes (cinematic)YesYesYes (top or bottom)Stats band below storyNoEditorial / premium feel
ShowcaseCorner sticker + Share popoverYesYesYesYesStat bandYesImage-forward, browsable (tabbed)
Showcase PosterCorner sticker + Share popoverYes (tall)YesYesYes (tiered)Inline bandSticky FABBig visual “poster” pages
RallyInline QR card + Share popoverYesYesYesYesMini widget (right)NoSharing in person; QR featured on the page

* Turn on Ambassadors → Templates → Fundraiser Page → “Show QR Code On Fundraiser Page” to display the QR. When off, no QR appears on any template.

How the QR code appears

With “Show QR Code On Fundraiser Page” enabled, every Enhanced template shows the QR, with the placement suited to its layout:

  • Rally features the QR as a large inline card in the sidebar — the most prominent placement.
  • Every other Enhanced template shows a compact “Scan” QR sticker pinned to the top-right corner of the fundraiser card.
  • All Enhanced templates also include a QR tile inside the Share popover (click Share → QR code) for a downloadable PNG.

So you no longer have to pick Rally just to get a QR — choose the layout you like best and enable the setting.

Notes: Changing the template only affects how the public fundraiser page is laid out, not your data. Switch freely and use Preview to compare. The QR is off by default; enabling it is a one-click setting.

Tips

  • Start with an Enhanced layout – most cases don’t need Visual. Use one of the 8 enhanced variants as your “good enough” baseline; promote to Visual when you have a sponsor or brand reason to need maximum control.
  • The template is just a campaign. You can preview the template directly – it has its own permalink, just like any campaign. Visit the URL while logged out to see exactly what ambassadors will see (with the template’s own content, not substituted).
  • Use tokens for everything text-heavy. Don’t hardcode “Help Sarah” in the template – use Help {ambassador_name} so the template stays generic.
  • Don’t put the template in your primary nav. It’s an internal “design source” that shouldn’t be findable as a real fundraiser. Set _wp_old_slug or noindex it.

Developer Reference

The rest of this page is for developers customizing Visual Template Mode.

Settings storage

charitable_settings > ambassadors > ambassadors_ui_version          # 'legacy' | 'enhanced' | 'visual'
charitable_settings > ambassadors > p2p_template_campaign_id        # int (0 = none)
charitable_settings > ambassadors > ambassadors_enhanced_layout_variant  # used for Enhanced; informational under Visual

Helpers:

charitable_ambassadors_ui_version();                                // 'legacy' | 'enhanced' | 'visual'
charitable_ambassadors_should_use_p2p_template( $fundraiser_id );   // bool
charitable_ambassadors_substitute_p2p_tokens( $string, $fundraiser_id ); // string
charitable_ambassadors_fundraiser_template_is_theme_overridden();   // bool

Substitution gate

The substitution only fires when ALL of these are true:

  1. ambassadors_ui_version === 'visual'.
  2. p2p_template_campaign_id > 0.
  3. The requested post is a published fundraiser (a child of a peer-to-peer-enabled parent).
  4. The fundraiser is NOT the template itself.
  5. The fundraiser has no campaign_settings_v2 meta of its own (raw $wpdb check to avoid filter recursion).
  6. The template DOES have campaign_settings_v2 meta.
  7. The request is not an admin context (so the Visual Builder can edit a fundraiser’s own meta normally).

If any gate is false, the substitution is a no-op and Pro reads the fundraiser’s own meta (or falls back to legacy rendering).

The substitution hook

add_filter( 'get_post_metadata', [ self::class, 'maybe_substitute_p2p_template' ], 10, 4 );

The filter handler:

  1. Returns early on the gates above.
  2. Reads the template’s campaign_settings_v2 meta directly via $wpdb (no filter recursion).
  3. Deep-clones the data, rewrites id/title.
  4. Recursively walks every string leaf and runs each through the token substituter.
  5. Returns the cloned-and-substituted array as if it were the fundraiser’s own meta.

Filters

FilterDefaultPurpose
charitable_ambassadors_p2p_template_tokensarray of 9Add custom tokens to the substituter. Receives ($tokens, $fundraiser_id).
charitable_ambassadors_should_use_p2p_templatecomputed boolForce-on or force-off the substitution for a specific fundraiser. Receives ($should, $fundraiser_id).
charitable_ambassadors_p2p_template_campaign_idsetting valueOverride the template ID at runtime (e.g. for per-parent template).
charitable_ambassadors_onboarding_visual_template_candidatescomputedWhich campaigns appear in the admin chooser autocomplete.

Actions

ActionArgsFires when
charitable_ambassadors_p2p_template_applied$fundraiser_id, $template_idSubstitution committed for a fundraiser render.

Token registry

add_filter( 'charitable_ambassadors_p2p_template_tokens', function ( $tokens, $fundraiser_id ) {
    $author = get_user_by( 'id', get_post_field( 'post_author', $fundraiser_id ) );
    $tokens['{ambassador_city}'] = $author ? (string) get_user_meta( $author->ID, 'billing_city', true ) : '';
    return $tokens;
}, 10, 2 );

Capabilities

Settings access: manage_charitable_settings. Front-end rendering has no capability gate.

Compatibility

When a Pro version older than the campaign-builder support is active, the chooser is gated and Visual mode falls back to Enhanced rendering. The check is implemented in charitable_ambassadors_visual_mode_is_available().

Customization Examples

Use a per-parent template (each parent campaign has its own template):

add_filter( 'charitable_ambassadors_p2p_template_campaign_id', function ( $template_id ) {
    $fundraiser_id = get_the_ID();
    $parent_id     = (int) get_post_meta( $fundraiser_id, '_campaign_parent', true );
    if ( $parent_id ) {
        $per_parent = (int) get_post_meta( $parent_id, '_ambassadors_template_campaign_id', true );
        if ( $per_parent > 0 ) {
            return $per_parent;
        }
    }
    return $template_id;
} );

Add a {donate_url} token:

add_filter( 'charitable_ambassadors_p2p_template_tokens', function ( $tokens, $fundraiser_id ) {
    $tokens['{donate_url}'] = add_query_arg( 'donate', '1', get_permalink( $fundraiser_id ) );
    return $tokens;
}, 10, 2 );

Skip Visual mode for fundraisers in a specific term (e.g. legacy migration):

add_filter( 'charitable_ambassadors_should_use_p2p_template', function ( $should, $fundraiser_id ) {
    if ( has_term( 'legacy-migration', 'campaign_tag', $fundraiser_id ) ) {
        return false;
    }
    return $should;
}, 10, 2 );

Restrict the template-chooser to a specific category:

add_filter( 'charitable_ambassadors_onboarding_visual_template_candidates', function ( $candidates ) {
    return array_filter( $candidates, function ( $candidate ) {
        return has_term( 'p2p-templates', 'campaign_category', $candidate['id'] );
    } );
} );

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 →

🔗 Let your AI Assistant do the fundraising work for you.

Connect Charitable to your AI assistant →

💸 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!

Improvement Payments

💸 Introducing Tiered Rates for Fee Relief: Match the Ask to the Gift!

Fee Relief asks your donors one short question at checkout: would you like to cover the processing fee on this gift? Until now that question used a single rate for every donation on a gateway, so a $10 gift and a $500 gift were asked for the same percentage. Fee Relief 1.3.0 lets you set as many donation bands as you like, each carrying its own rate. Why this is important:

  • 🪙 Gentler on small gifts: A fixed transaction cost is a far bigger share of a $10 donation than a $500 one, so bands let you ask for less at the bottom.
  • 🎚️ As many bands as you need: Each band carries its own percentage and its own fixed amount, and the top band runs on with no upper limit.
  • 🛑 An optional ceiling: A Maximum fee field stops any donor being asked for more than a number you choose, however large the gift.
  • 🔌 Set per payment gateway: Stripe can run on four bands while Windcave and Payfast stay on a single rate, because bands belong to a gateway and not to your whole site.
  • 🛡️ Nothing changes until you say so: Your current rates stay exactly as they are until you switch Use Tiered Rates on under Charitable » Settings » Advanced » Fee Relief.

Check out our announcement here.

Donations Improvement

📊 Your Pro Dashboard Can Now Compare, Export, and Score!

Most fundraising dashboards only tell you how much you have raised. Charitable Pro 1.8.19 rebuilds the dashboard and the Reports Overview around the harder questions: whether anything is broken, whether this period beat the last one, and which single change would make the most difference today. Why this is important:

  • 📈 Every figure has a trend: Pick a period and the tiles and the chart move together, with each total shown against the previous period.
  • 🗓️ Charts that stay readable: Short ranges group donations day by day, while longer ranges group by week or month, so a full year reads as a curve instead of a flat line.
  • 🔀 Compare any 2 periods: Not just consecutive ones, so you can ask how this December did against last December. That matters because fundraising is seasonal.
  • 📤 Export the whole summary: Send the full overview out as CSV or PDF, ready for a board pack or a funder report.
  • 🎯 Score your setup for free: Have your fundraising setup scored, so the one change worth making next is the one you can see.

Check out our announcement here.

Feature New

🎟️ Introducing Charitable Events: Sell Tickets Inside Your Campaigns!

Most nonprofits sell event tickets in one tool and collect donations in another, which leaves two sets of reports and a manual match at the end of the year. Charitable Events brings both together, selling tickets through the same donation forms and payment gateways you already run in Charitable. Why this is important:

  • 🎟️ Every ticket is a donation: Ticket sales run through the gateway you already use and count toward the campaign goal, with everything managed under Charitable » Events.
  • 📱 QR check-in from any phone: Each attendee gets their own QR code on the receipt, and volunteers scan at the door through a check-in link that needs no WordPress account.
  • 🧾 Receipts ready for tax time: Give each ticket type a fair market value, and Charitable puts the correct tax-deductible amount on every donor receipt.
  • 📋 Attendee details at checkout: Ask every guest for a meal choice, shirt size, or access needs, with a separate attendee record created for each ticket.
  • 🗓️ Blocks and calendars included: Three editor blocks plus Sugar Calendar and The Events Calendar support put your events where supporters already look.

Check out our announcement here.

ai New

🚀 Unleash AI Power in Charitable!

Your AI assistant can now build, edit, and manage your Charitable fundraising campaigns directly — just by asking. With Charitable Pro adding write support for the WordPress Abilities API, tools like ChatGPT, Claude, and Cursor can handle full administrative actions safely through MCP. Why this is important:

  • 🤖 Campaign creation in plain language: Prompt your assistant with a goal like “Set up a fundraiser for the shelter with a $5,000 goal”, and it builds a real draft campaign complete with suggested donation tiers.
  • 🎨 Instant donation form tweaks: Add custom fields, change button colors, or reorder elements without diving into form settings.
  • 📝 Offline gift logging: Tell your assistant about cash or check gifts, and it will match donor emails and record transactions into your history.
  • 🛡️ Safety and control by default: Write access stays strictly off until turned on in Charitable » Tools » AI MCP, keeping read-only reporting safe by default.
  • 📜 Full audit logging: Every change made by an AI assistant is tracked under Charitable » Tools » Logs, so you always know who (or what) updated your site.

Check out our announcement here.

Improvement Payments

💰 Accept Recurring Donations with Windcave and Charitable

A donor sets their gift up once on Windcave’s secure payment page, and Charitable bills every renewal after that on schedule. Why this is important:

🏦 Organizations banked in New Zealand or Australia: monthly giving on the gateway your bank already set you up with, with no second processor to onboard.
⛪ Churches taking regular tithes and offerings: congregants set their own schedule once, which is the simplest way to launch recurring church giving without a separate platform.
🌏 Groups with donors in several currencies: Windcave handles more than 20, so a supporter can give in the currency they actually hold.
📅 Operating funds rather than one-time campaigns: switch on Recurring Only mode and the one-off option disappears, so every gift to that campaign is a subscription.
🧾 Teams with no developer on staff: 3 sets of credentials pasted into a settings page, and no code anywhere.

Check out our announcement here.