Charitable Documentation

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

Activity Tracking

Requires: Charitable Pro plugin 1.8.16+
Pro plan and higher
Charitable Ambassadors 3.4.7+

Do you want your peer-to-peer fundraiser pages to show more than the money raised?

A read-a-thon counts minutes. A walkathon counts miles. A food drive counts meals packed, and a volunteer day counts hours given.

Activity lets your fundraiser pages show that progress alongside the money. You define what gets counted once, choose which campaigns count it, and your fundraisers log their own numbers from their own pages.

See the full feature announcement »

This guide covers turning Activity on, creating definitions, setting up each campaign, what fundraisers see, managing entries, and the developer hooks.

Supporters share a page more often when it shows what they did. So it helps to get the setup right before your campaign opens.

The Ambassadors Activity tab, showing the recording strip, the Definitions table, and the first Recent Entries rows

What’s in This Guide?

Watch the Activity Setup Video

This 3-minute walkthrough covers turning recording on, adding a definition, choosing what each campaign counts, and logging an entry from a fundraiser’s own page.

What You Can Track With Activity

  • Read-a-thons and math-a-thons. Each child’s page shows minutes read or problems solved. With a short code snippet, the class total can also roll up to the parent page.
  • Walkathons, bike rides and step challenges. Miles logged sit next to dollars raised, so supporters see the effort behind the ask.
  • Service and volunteer drives. The page shows hours given, meals packed, trees planted or kits assembled.
  • Milestone campaigns. Some campaigns have no number at all. A moment like “we broke ground” or “the van is paid off” shows as a badge once it happens.
  • Anything your fundraisers already share proudly. If they post it on social media, it probably belongs on their page.

Where to Find the Activity Settings

In your WordPress admin, go to Charitable » Ambassadors » Other » Activity.

How to Set Up Activity in 3 Steps

1. Turn On Activity Recording

Activity is switched off after you update, and nothing is recorded or displayed until you turn it on. The strip at the top of the Activity tab is the switch.

The Activity tab in Charitable Ambassadors, with the recording strip and its Turn On button

To get started, click “Turn On”. This creates the small database table that holds activity entries, and recording starts from that moment.

Important Note: Recording starts from now. Activity can’t count things that happened before you switched it on, because nothing was storing them. Last month’s numbers won’t be there.

If you switch recording off again later, everything already recorded is kept. Activity stops recording and stops displaying until you turn it back on.

2. Add a Definition for Each Thing You Count

A definition is one thing you count, and you set it up once for the whole site. Activity comes with 2 built-in definitions.

DefinitionWhat it doesStarts as
SupportersIt counts how many donations a campaign received.It starts switched off, because it can’t count donations from before you turned recording on. Switch it on and it counts from there.
Goal ReachedIt marks a campaign’s page once the campaign hits its fundraising goal.It starts switched on and works without any per-campaign setup.
The Definitions card, with the Add Definition button, the Start From An Example cards and the 2 built-in definitions

To add your own, click “Add Definition”. The panel on the right previews where each field will appear on the campaign page, and it updates as you type.

The Add Definition form, with the live preview panel on the right

Here’s what each field does.

  • Label is the public name. Call it whatever fits your program.
  • Key is the machine name used in exports and in code. It can’t be changed once anything has been recorded against it, so choose it carefully.
  • Type is either a Number or a Milestone. A Number counts a quantity and can have a target and a progress bar. A Milestone is one thing that is either done or not done.
  • How Values Combine decides how many separate entries become the one number on the page. The table below explains each option.
  • Unit is printed after the number, so 1,250 reads as “1,250 miles.”
  • Default Target draws the progress bar. Each campaign can set its own target instead.

When you choose Milestone, the form hides Unit, Default Target and How Values Combine, because a milestone doesn’t use them.

The same form with Milestone selected, showing the number-only fields hidden

Pro tip: If you’re not sure where to start, the “Start From An Example” links on a fresh install fill in the form with a working definition you can adjust.

What the How Values Combine Setting Does

SettingWhat the page showsWhen to use it
SumEvery entry is added together.It suits miles, minutes, meals and other running totals.
CountIt counts how many entries there are and ignores their values.It suits supporters, shifts worked and visits made.
LatestOnly the most recent entry shows.It suits a weight, a rank or a current reading.
BestThe highest entry shows.It suits a personal record or a longest run.

Important: Type and How Values Combine also lock once entries exist, because both describe how the entries already recorded are read.

3. Choose Which Campaigns Track Each Definition

Next, open a campaign in the campaign builder, click “Settings”, and choose “Ambassadors & Peer to Peer Fundraising”. Expand the “Peer to Peer Fundraising” group, and you’ll see the Activity Tracking block at the bottom of it.

The Activity Tracking block inside the campaign builder's Peer to Peer Fundraising settings group
  • Activity Types Tracked. Tick the definitions this campaign counts. You can also give each one a Target that overrides the site default.
  • Where Activity Displays. Progress draws a bar for each counted value, Milestones shows a row of badges, and Feed shows a list of what happened, newest first. Tick any combination.
  • Include donations in the feed. This mixes the campaign’s own donations into that list, so it reads as one story.
  • Who May Record Activity. Choose either The Campaign Owner or Administrators Only.

Note: A campaign you’ve never configured counts every enabled definition and shows all 3 displays. Untick anything you don’t want.

How Activity Shows on Fundraiser Pages

The module appears on its own on the Enhanced fundraiser page layouts, so there’s nothing to place or configure.

At the top, each number the campaign tracks gets a progress bar, and each milestone it has reached gets a badge.

The top of the Activity module on a fundraiser page, showing a progress bar and a Goal Reached milestone badge

A value the site counted by itself carries an AUTOMATIC badge. That way nobody mistakes it for a number a person typed in.

Below that, the Recent Activity feed lists the newest entries. The See all activity link opens the rest.

The Recent Activity feed at the bottom of the Activity module, with the See all activity link

How Fundraisers Log an Activity Entry

A signed-in campaign owner, or an administrator, sees a “+ Log Activity” button on the page.

Clicking it opens a short form right there. The form only lists the things that campaign tracks.

The inline Log Activity form open on a fundraiser page

Entries are append-only, so there’s no edit button. To correct a number, add a new entry, or have an administrator delete the wrong one.

This keeps the feed honest. It also means every total can be worked out again from the entries.

Add Activity to Legacy and Visual Campaign Builder Pages

On the Legacy template style, and on any page built with the Visual Campaign Builder, place the module where you want it with this shortcode.

[charitable_activity]
AttributeTypeDefaultDescription
campaignintcurrent postThe campaign to show. It defaults to the current page when that page is a campaign.
modestringthe campaign’s own settingA comma-separated list of progress, milestones and feed. Anything else is ignored.

A parent campaign page is the most common place you’ll need it, because the Charitable Pro plugin builds those pages, not Ambassadors. Replace 123 with your campaign ID.

[charitable_activity campaign="123" mode="progress,feed"]

The module only appears for a campaign the visitor is allowed to see. A draft, pending, private or password-protected campaign shows nothing.

How to View and Delete Activity Entries

The Recent Entries card lists what has been recorded, newest first. Each row shows the campaign, the value, whether it was automatic or reported, and who recorded it.

The Recent Entries card, with the Export CSV and Add Entry buttons
  • Add Entry records an entry by hand from the admin side, for a campaign you pick.
  • Export CSV downloads everything for a spreadsheet or a report.
  • The bin icon on each row deletes that entry.

Turn Off Activity or Remove All Entries

Storage Details at the bottom of the tab holds the option you can reverse and the one you can’t.

The Storage Details disclosure, open, showing the table state and the removal option
  • Turn Off stops all recording and hides the module everywhere, while keeping every entry.
  • Remove table and entries deletes the table and everything in it. It asks you to type the word remove first, and it can’t be undone.

Note: Uninstalling Charitable Ambassadors leaves your activity table and entries in place on purpose, so a reinstall or a plugin conflict never costs you data.

Where to See Activity in Charitable Reports

Activity also shows up where you already read your numbers.

Go to Charitable » Reports. The Activity report lists what your campaigns logged, alongside donations.

Activity rows in the Charitable Reports Activity panel

The Overview tab adds an Ambassadors line to the Pro Addons card, with your verified ambassador count and total raised.

Tips Worth Keeping in Mind

These habits keep your activity numbers accurate from the first day of a campaign to the last.

  • Turn recording on before the campaign opens. Activity only counts from the moment you switch it on, so starting halfway through leaves a gap.
  • Choose each Key carefully. The Key, Type and How Values Combine all lock after the first entry, so set them up the way you want them to stay.
  • Switch definitions off instead of deleting them. Switching off hides a definition everywhere and keeps its history for next season.
  • Use the shortcode on parent campaign pages. The module only places itself on fundraiser pages with an Enhanced layout.
  • Tell fundraisers the one step they need. “Sign in, open your page, click Log Activity and type the number” is enough, because the form only offers what the campaign tracks.

Troubleshooting Activity

The Module Isn’t Appearing on a Fundraiser Page

The module shows nothing at all rather than an empty box, so check these 4 things in order.

  1. Recording is on in Charitable » Ambassadors » Other » Activity.
  2. At least one definition is enabled.
  3. The campaign has at least one definition ticked under Activity Tracking.
  4. At least one display is ticked under Where Activity Displays.

The Module Isn’t Appearing on a Parent Campaign Page

The Charitable Pro plugin builds parent campaign pages, not Ambassadors, so the module isn’t placed there automatically. Add the [charitable_activity] shortcode to the page.

Nothing Shows on the Legacy Template Style

The module places itself on the Enhanced layouts only. Use the shortcode on Legacy pages.

The Supporters Count Is Showing Zero

Supporters starts switched off, and it can’t count donations that arrived before you turned recording on. Switch it on under Charitable » Ambassadors » Other » Activity and it counts from that point forward.

The Log Activity Form Has Nothing to Log

The form only offers what that campaign tracks, so if the campaign has no definitions ticked, there’s nothing to log. Also check that Who May Record Activity isn’t set to Administrators Only.

I Can’t Change a Definition’s Key or Type

Both lock once anything has been recorded against that definition, because entries point to it and both fields describe how those entries are read. Create a new definition instead, and switch the old one off.

I Can’t Delete a Definition

Activity won’t delete a definition that has entries. The entries would be left without a definition, and the feed would list them under a raw machine name.

Switch the definition off instead. That hides it everywhere and keeps the history.

Developer Reference for Activity

Activity Hooks and Filters

HookTypeWhat it does
charitable_ambassadors_activity_definitionsfilterRegisters definitions in code rather than in the admin.
charitable_ambassadors_activity_can_recordfilterDecides who may record on a campaign. It runs even for user 0.
charitable_ambassadors_activity_can_viewfilterDecides whether the current request may see a campaign’s activity.
charitable_ambassadors_activity_entry_valuefilterAdjusts a value immediately before it is written.
charitable_ambassadors_activity_aggregationsfilterPost-processes or replaces a computed aggregate.
charitable_ambassadors_activity_targetfilterSupplies a computed target, or removes one when it returns null.
charitable_ambassadors_activity_cache_ttlfilterChanges the aggregate cache lifetime. Returning 0 or less turns caching off.
charitable_ambassadors_activity_observed_keysfilterSets which definitions the site records by itself.
charitable_ambassadors_activity_observed_campaign_idfilterSets which campaign an automatic entry belongs to.
charitable_ambassadors_activity_render_modesfilterSets which displays render for a given pageview.
charitable_ambassadors_activity_headingsfilterChanges the section headings on the public module.
charitable_ambassadors_activity_feed_itemsfilterChanges the assembled feed rows.
charitable_ambassadors_activity_csv_max_rowsfilterSets the row cap on the CSV export.
charitable_ambassadors_activity_recordedactionRuns after an entry is written.
charitable_ambassadors_activity_deletedactionRuns after an entry is removed.

Override the Activity Template in Your Theme

your-theme/charitable/charitable-ambassadors/campaign/activity.php

PHP Classes for Reading and Writing Entries

  • Charitable_Ambassadors_Activity_Entries::record( $campaign_id, $key, $value, $source, $user_id ) writes one entry.
  • Charitable_Ambassadors_Activity_Entries::can_record( $campaign_id, $user_id ) is the write gate.
  • Charitable_Ambassadors_Activity_Entries::can_view( $campaign_id ) is the read gate.
  • Charitable_Ambassadors_Activity_Aggregate::value( $campaign_id, $key ) returns the displayed number.
  • Charitable_Ambassadors_Activity_Aggregate::flush( $campaign_id, $key ) clears its cache.

Code Example to Roll a Parent Campaign Up From Its Children

This shows a school page with the total of its pupils’ pages. The 2 actions keep the parent figure fresh, because a write or a delete on a child only clears the child’s own cache.

add_filter( 'charitable_ambassadors_activity_aggregations', function ( $out, $agg, $values, $campaign_id, $key ) {
    $children = get_children( array( 'post_parent' => $campaign_id, 'post_type' => 'campaign', 'fields' => 'ids' ) );
    if ( empty( $children ) ) {
        return $out;
    }

    $total = 0.0;
    foreach ( $children as $child_id ) {
        $total += (float) Charitable_Ambassadors_Activity_Aggregate::value( $child_id, $key );
    }

    return $total;
}, 10, 5 );

$cap_flush_parent = function ( $id, $campaign_id, $key ) {
    $parent = wp_get_post_parent_id( $campaign_id );
    if ( $parent ) {
        Charitable_Ambassadors_Activity_Aggregate::flush( $parent, $key );
    }
};

add_action( 'charitable_ambassadors_activity_recorded', $cap_flush_parent, 10, 3 );
add_action( 'charitable_ambassadors_activity_deleted', $cap_flush_parent, 10, 3 );

Code Example for a Computed Target

add_filter( 'charitable_ambassadors_activity_target', function ( $target, $campaign_id, $key ) {
    if ( 'minutes_read' !== $key ) {
        return $target;
    }

    $pupils = count( get_children( array( 'post_parent' => $campaign_id, 'post_type' => 'campaign', 'fields' => 'ids' ) ) );

    return $pupils ? $pupils * 500 : $target;
}, 10, 3 );

Code Example to Show a Live Number Instead of a Cached One

add_filter( 'charitable_ambassadors_activity_cache_ttl', function () {
    return 0; // 0 or less skips the cache entirely
} );

Code Example to Let a Teacher Record on a Pupil’s Page

add_filter( 'charitable_ambassadors_activity_can_record', function ( $allowed, $campaign_id, $user_id ) {
    if ( $allowed || ! $user_id ) {
        return $allowed;
    }

    return user_can( $user_id, 'edit_others_campaigns' );
}, 10, 3 );

Wrapping Up

You now know how to turn Activity on, create definitions, choose what each campaign counts, and manage the entries your fundraisers log. Your fundraiser pages can show the effort behind every gift.

If you get stuck on any step, our support team is happy to help.

You May Also Want to Read

These guides cover the parts of Ambassadors that Activity builds on.

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!

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.

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.