Charitable Blog

Everything you need to know about Charitable and our team.

AWARE: 30 for 30 campaign banner

An Inside Look at AWARE Whistler’s Unique “30 for 30” Fundraiser (Tutorial)

Last updated on

  • By

AWARE Whistler is a charity committed to protecting the natural environment of Whistler, Canada. It marks its 30th anniversary as an organisation this year and is celebrating the occasion by launching the 30 for 30 Fundraiser.

The goal of the 30 for 30 Fundraiser is to raise $60,000, with $30,000 raised from businesses and $30,000 raised from individual donations.

AWARE are using Charitable’s campaign-driven fundraising approach to power this campaign, with two individual fundraising campaigns set up: one for businesses, and one for individuals.

The challenge

Of course, unique campaigns like this tend to have unique needs, and the 30 for 30 Fundraiser is no exception.

Since one of the two fundraising campaigns is specifically focused on getting donations from businesses, a Company Name field is needed in that campaign’s donation form. Also, when donors are shown on the site (using the Donors shortcode or widget), it’s the company’s name that should be shown — not the name of the person donating.

Thankfully, Charitable’s flexibility is ideally suited for AWARE’s needs. Let’s see how.

Step 1. Add a “Company Name” field

The first thing we need to do is to create a new donation field, using the Donation Fields API.

Let’s look at the code required to achieve that:

/**
 * STEP 1: Register the "Company Name" Donation Field.
 *
 * On the `init` hook, we create a new Donation Field. It has a
 * key of `company_name` (this is how we will reference it later),
 * and it's set up as a required field in the donation form, shown
 * after the `last_name` field.
 */
add_action( 'init', function() {
        /**
         * Add a "Company Name" field.
         */
        $field = new Charitable_Donation_Field(
            'company_name',
            [
                'label' => 'Company Name',
                'data_type' => 'user',
                'donation_form' => [
                    'show_after' => 'last_name',
                    'required' => true,
                ],
                'admin_form' => true,
                'show_in_meta' => true,
                'show_in_export' => true,
                'email_tag' => [
                    'description' => 'The company name',
                ],
            ]
        );

        /**
         * Register the field.
         */
        charitable()->donation_fields()->register_field( $field );
}, 100 );

There’s a bit going on here. First of all, right at the top, we are setting up a function to be run on the init hook. This is the best hook to use any time you want to register a new donation field.

Inside of our function, we create a new Donation Field with the Charitable_Donation_Field object. Let’s take a closer look at that bit:

$field = new Charitable_Donation_Field(
     'company_name',
     [
         'label' => 'Company Name',
         'data_type' => 'user',
         'donation_form' => [
             'show_after' => 'last_name',
             'required' => true,
         ],
         'admin_form' => true,
         'show_in_meta' => true,
         'show_in_export' => true,
         'email_tag' => [
             'description' => 'The company name',
         ],
     ]
 );

What we’re doing here is creating a field with a key of company_name (we’ll need this later on). We have set a label, defined it as a user field, and set up some basic rules for how it should appear in the donation form: right after the last_name field and as a required field.

We’ve also set it up to show in the admin donation form, the donation meta and donations export file. We even told Charitable to create an email tag for it, so we can use it in our donation receipt emails.

Finally, we register this field with the Donation Fields API:

charitable()->donation_fields()->register_field( $field );

Step 2. Only show the “Company Name” field on one campaign

By default, when you set up a donation field, it will show up in every campaign’s donation form. For the “30 for 30” campaign though, AWARE only want the field to appear in the donation form of the Business fundraiser.

Here’s how we achieve that:

/**
 * STEP 2: Only show the field on a specific campaign.
 *
 * We only want the field to show up on a single campaign's
 * form, so we *remove* it from all other campaigns' donation
 * forms.
 */
add_filter( 'charitable_donation_form_user_fields', function( $fields, Charitable_Donation_Form $form ) {
    /**
     * Check the campaign ID of the donation form being
     * shown. If it isn't the one where we want the field,
     * remove the field using the unset() function.
     */
    if ( 123 != $form->get_campaign()->ID ) {
        unset( $fields['company_name'] );
    }

    return $fields;
}, 10, 2 );

The way we solve this problem is by removing the company_name field when we are not showing the Business campaign’s donation form. All the magic happens rights here:

if ( 123 != $form->get_campaign()->ID ) {
     unset( $fields['company_name'] );
 }

In this case, we’re imaging that the Business campaign has an ID of 123. So when we’re looking at the fields in a particular form, we check the ID of the campaign for the form, and if it isn’t 123, we use the unset() function to get rid of our field, referencing to it by the key of company_name, which we set in Step 1.

Step 3. Customise the donor name in the Donors shortcode or widget

Now that we’ve added our Company Name field, all that’s left is for us to use that instead of the donor’s first and last name when showing donations to the Businesses campaign.

Let’s see the code:

/**
 * STEP 3: Use the company name for the donor name.
 *
 * When showing the donor name for a particular donation,
 * check if the donation was to the campaign with our
 * Company Name field. If it was, show the Company Name
 * instead of the individual's name.
 */
add_filter( 'charitable_donor_loop_donor_name', function( $name, $args ) {
    /**
     * Get the Donor object from the argument array.
     */
    $donor = $args['donor'];

    /**
     * Check if there is a Donation object associated
     * with this Donor.
     */
    $donation = $donor->get_donation();

    if ( ! $donation ) {
        return $name;
    }

    /**
     * Get the campaign that received the donation.
     */
    $campaign_id = current( $donation->get_campaign_donations() )->campaign_id;

    /**
     * If this was a donation to our campaign,
     * let's change the donor name.
     */
    if ( 123 == $campaign_id ) {
        $name = $donation->get( 'company_name' );
    }

    return $name;
}, 15, 2 );

First of all, notice that this is set up as a function called on the charitable_donor_loop_donor_name hook. We use this hook since it is shown whenever a list of donors is shown with the Donors widget or shortcode.

Inside the function, we first get the Charitable_Donor object from the $args parameter. We then get the Charitable_Donation object through the $donor->get_donation() method:

/**
 * Check if there is a Donation object associated
 * with this Donor.
 */
$donation = $donor->get_donation();

if ( ! $donation ) {
    return $name;
}

You may wonder why we check whether $donation is set. The reason for this is because sometimes, Charitable_Donor is not set up with a specific donation. One such example is when the Donors widget/shortcode is set up to group multiple donations by the same donor into one — in that case, no Charitable_Donation object is called up, and we will just show the donor’s name.

Therefore, an important caveat of this approach is that this will only work if the Donors widget/shortcode is set up to show each donation individually, instead of grouping multiple donations by the same person.

Moving on, we use the Charitable_Donation object to find out which campaign was donated to, and check if it’s our Business campaign (the one with an ID of 123):

/**
 * Get the campaign that received the donation.
 */
$campaign_id = current( $donation->get_campaign_donations() )->campaign_id;

/**
 * If this was a donation to our campaign,
 * let's change the donor name.
 */
if ( 123 == $campaign_id ) {
    $name = $donation->get( 'company_name' );
}

The last part of this simply checks that the $campaign_id is 123. If it is, we get the company name like this:

$donation->get( 'company_name' );

Note that company_name matches the key of the donation field we registered back in step 1.

And with that, we’re all done!

The complete solution

You can see all the code put together in one place in our Github code library:

https://github.com/Charitable/library/blob/master/tutorials/new-donation-field-plus-customized-donor-name.php

To see it in action – and if you would like to show your support for the important work done by AWARE Whistler – visit the 30 for 30 Fundraiser page on their website.

Final word

If you enjoyed this tutorial and would like to see us write one about a different topic, let us know! You can reach us via email by filling out the form over at our Support page, or leave a comment below.

author avatar
Eric Daams

Disclosure: Our content is reader-supported. This means if you click on some of our links, then we may earn a commission. We only recommend products that we believe will add value to our readers.

Leave a Reply

Your email address will not be published. Required fields are marked *

Get free tips and resources right in your inbox, along with 60,000+ others

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!

Featured Video:

Watch more videos on our YouTube channel.

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 Migrations

↔️ Importing From GiveWP, Donorbox, GiveButter… even CSV!

Whether you’re migrating from another platform or consolidating your records, moving your data to Charitable is now faster and more flexible than ever. We’ve streamlined the process so you can bring over your entire fundraising history in just a few clicks.

🔄 Native GiveWP, Donorbox, & GiveButter Support: Switching from a major platform? Our dedicated migration tools handle the heavy lifting, automatically mapping your donors and donations directly into Charitable—no technical skills required.

📂 Universal CSV Import: Moving from a custom system or a specialized CRM? If you can export it to a CSV, you can import it here. Our smart mapping tool lets you align your columns to Charitable fields like names, emails, phone numbers, and addresses in seconds.

Instant Donor Profiles & Custom Tags: Automatically create rich donor profiles and bring in custom tags to keep your data organized. Segment and engage your supporters from day one with a clean, professional database structure.


Ready to make the switch?

Check out our GiveWP Migration Guide

Learn more about our Import Tools

author avatar
Eric Daams
Improvement Payments

💳 New Braintree Features For Your European Donors

With the release of Braintree addon version 1.3.0, you can now empower your European donors with the payment methods they trust and prefer, making giving seamless for international supporters.

🌍 Six New European Payment Methods: Support popular local options like iDEAL (Netherlands), Bancontact (Belgium), BLIK (Poland), and more to meet donors where they are.

⚡ Frictionless Donor Experience: These bank-based methods allow donors to authenticate directly with their own bank in a secure popup… no credit card numbers required.

⚙️ Automatic Currency Sync: No complex setup needed. The builder automatically displays the correct payment buttons based on your site’s currency (EUR or PLN), ensuring a relevant experience for every visitor.

author avatar
Eric Daams
Campaigns New

🖼️ Campaign Featured Images: Pro-Level Visuals Made Simple

With the new Campaign Featured Image setting in our visual builder, you now have a single, dedicated place to manage how your fundraisers look across your entire site and beyond.

🖼️ One Image, Everywhere: Set a primary thumbnail that automatically syncs to campaign grids, lists, and shortcodes—no more relying on layout order.

📱 Social Sharing Optimized: Easily upload images at the perfect size to ensure your campaigns look stunning and professional when shared on social media.

🔍 SEO & Accessibility Ready: Add custom alt text directly within the builder to improve search rankings and ensure your mission is accessible to every supporter.

author avatar
Eric Daams
Improvement receipts

🗓️ Annual Receipts 2.0: Send Year-End Receipts to Every Donor in Minutes

You can now send annual receipts in minutes with a few clicks to all your donors.

📧 One-Click Bulk Send Wizard that guides you to sending to hundreds of donors simultaneously directly from your WordPress dashboard.

🔍 Smart “Dry Run” Mode: See exactly who will receive a receipt and who will be skipped (and why) before a single email leaves your server.

🛡️ SMTP-Aware & Limit Protection: Charitable now detects your email setup and automatically adjusts batch sizes and pauses for daily limits to ensure your emails land in inboxes.

✅ Complete Audit Trail: Dedicated system log and on the individual donor’s profile, giving you a clear history for every fiscal year.

Stop dreading tax season and start spending that time on your mission. Update to Annual Receipts 2.0 and automate your year-end reporting today.

author avatar
Eric Daams
Addon Donations Improvement

🎈Recurring Donations 2.0: Smarter Automation, Better Recovery, and More Control

We’ve completely rebuilt our Recurring Donations system to help you grow your reliable income stream while giving you (and your donors) more powerful tools than ever before.

What’s New:

🔒 Recurring-Only Campaigns: You can toggle “Recurring Only” mode in the campaign builder to hide the one-time option entirely, ensuring your supporters stay focused on long-term commitment.

📧 Automatic Payment Recovery: Our new Payment Failed Email fires automatically the moment a subscription fails.

🛠️ Self-Service Donor Control:The new Cancel Subscription Button appears directly in the donor dashboard, allowing supporters to pause or end their recurring gifts on their own terms—reducing your admin burden and payment disputes.

📊 Real-Time Revenue Insights: Track your growth, monitor active subscriptions, and see exactly how much predictable support is coming in each month at a glance.

Our new Recurring Donations addon gives you the professional-grade tools you need to grow your mission.

author avatar
Eric Daams