Charitable Documentation

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

DonationGuard: Real-Time Bot Attack Protection for Donation Forms

Requires: Charitable Pro 1.8.16+

Note: DonationGuard is currently in beta in 1.8.16.

DonationGuard is a real-time bot-attack detection layer for your donation forms. It watches submissions for the patterns coordinated attackers leave behind — abnormally fast form fills, runs of failed cards from rotating IPs, donor-to-view ratios that no human browsing rhythm produces — opens severity-tiered Attack Records when it sees them, and alerts you the moment a campaign starts taking fire.

Key Features

  • Monitor every donation submission in real time for five distinct attack signals
  • Score activity against a learned baseline of your site’s normal donation traffic
  • Open a structured “attack record” so you can review and bulk-act on suspicious donations
  • Alert the site admin by email, admin-bar warning, and an in-plugin notification
  • Apply a one-click “Recommended Settings” preset that turns on Honeypot, Time Trap, and Rate Limit modules
  • Block repeat offenders by email address with a configurable threshold and lookback window
  • Store IP addresses as one-way hashes for GDPR-friendly attack logging
  • Auto-clean closed attack records after a retention window you choose

Why Use DonationGuard?

Card-testing bots target nonprofits because donation forms are public, free to submit, and instantly tell the attacker whether a stolen card works. A single bot run can post hundreds of declined transactions in minutes, inflate your gateway fees, and trigger fraud reviews from your processor. DonationGuard watches for those patterns automatically and lets you respond in seconds, instead of finding out from Stripe a day later.

Requirements

  • Charitable Pro 1.8.16 or later
  • An active Charitable Pro license (required for the Quick Protection preset, which enables Spam Blocker modules)
  • WordPress 6.0 or later

Getting Started

Activation

  1. In your WordPress admin, go to Charitable > Settings.
  2. Click the Security tab.
  3. Click the DonationGuard sub-tab.
  4. Check Enable and click Save Changes.

DonationGuard begins monitoring on the next donation submission. The detector throttles to one full cycle per 60 seconds, so a single spike of activity is consolidated into one attack record rather than dozens of duplicates.

DonationGuard Settings

One-Click Recommended Settings

Inside the DonationGuard tab you will see a Quick Protection card with an Apply Recommended Settings button. Clicking it enables three Spam Blocker modules with sensible defaults:

  • Honeypot — adds an invisible field that real donors never fill in
  • Time Trap — rejects submissions that arrive faster than a human could type
  • Rate Limit — caps submissions from a single visitor to 10 per window

These modules require an active Pro license. If your license is inactive, the button is replaced with an Activate License link.

Configuration Options

Core Detection Parameters

ParameterTypeDefaultDescription
EnablecheckboxOffMaster switch for DonationGuard.
Detection SensitivityselectNormalLow, Normal, or High. Higher catches more attacks but may flag legitimate fundraising spikes.
Additional Alert Recipientemail(empty)Optional second email that critical alerts are BCCed to in addition to the site admin.
Send ‘All Clear’ EmailcheckboxOffSend a follow-up email when an attack ends.
Attack Record RetentionselectForeverAuto-delete closed and dismissed attack records older than 30 days, 90 days, 1 year, or never.
Hash IP Addresses (Privacy Mode)checkboxOffStore one-way hashes instead of plain IPs. Disables the one-click blacklist add from Attack Review.

Repeat-Attempter Block Parameters

The Repeat-Attempter Block stops card-testing floods that come from a single email address without false-positiving real donors who simply had card trouble.

ParameterTypeDefaultDescription
Enable Repeat-Attempter BlockcheckboxOffBlock submissions from an email with multiple non-successful donations and no successful history.
Block After Failed Attemptsnumber2Block once this many non-successful donations (pending, failed, cancelled) accumulate. Recommended: 2 or 3.
Lookback Windowselect24 HoursOnly attempts within this window count. Choices: 1 hour, 6 hours, 24 hours, 7 days, 30 days, Forever.
Action on MatchradioBlockBlock stops the donation. Log only records the match in Tools > Logs but lets the donation through.
Error Messagetext(default)Shown to the donor when blocked. Leave blank to use the built-in message.

Quick Protection Preset

ModuleDefaultWhat It Does
HoneypotOffAdds an invisible form field that bots fill in but humans cannot see.
Time TrapOffRejects submissions that arrive in less than the configured minimum seconds.
Rate LimitOffCaps the number of submissions a single visitor can make per window (default: 10).

How Detection Works

DonationGuard runs a detection cycle each time a donation enters pending status (via the charitable_donation_pending_recorded action), throttled to one cycle per 60 seconds. Each cycle:

  1. Computes five signals against a learned per-hour baseline of your normal traffic.
  2. Combines those deviations into a single weighted score.
  3. Maps the score to a tier: Warning or Critical.
  4. Opens a new attack record, escalates an existing one, or closes a quiet attack.
  5. Dispatches notifications subject to a 4-hour cooldown and a 6-emails-per-day cap.

The Five Signals

SignalWhat It Watches
Pending RateVolume of pending donations in the recent window vs. the baseline for this hour.
RatioRatio of pending to successful donations.
IP FanoutDistinct IP addresses submitting in the window. A high count from many IPs is a classic botnet signal.
Decline RateShare of gateway declines in the window. Card-testing produces a decline burst.
TimingTime-to-submit pattern. Bots tend to submit far faster than humans.

Until your site has collected enough donation history to learn its own baseline, DonationGuard falls back to a safe static default (“warmup mode”).

Reviewing Attacks

When DonationGuard opens an attack, you have several ways to see and act on it.

Admin Bar and Banner

Open attacks surface as a warning in the WordPress admin bar and an inline banner on the Charitable dashboard. Click either to jump to the Attack Review screen.

Attack Review Screen

Located at Charitable > Tools > Logs > Attack Reviews. The screen lists open attacks with severity tier, signal breakdown, donation count, and time opened. Click into an attack to see every suspicious donation grouped together, with bulk actions to mark them as spam, cancel them, or dismiss false positives.

Email Alerts

Critical alerts go to the site admin and to the optional Additional Alert Recipient address. Each email includes the severity, the top signals that triggered it, the donation count, and a direct link to the Attack Review screen. Email volume is rate limited to one every 4 hours and 6 per day so an extended attack does not bury your inbox.

Customization

Filter the Alert Recipient List

add_filter( 'charitable_bot_email_recipients', function ( $recipients ) {
    $recipients[] = '[email protected]';
    return $recipients;
} );

Adjust Signal Weights

add_filter( 'charitable_bot_signal_weights', function ( $weights ) {
    $weights['ip_fanout'] = 2.0;
    return $weights;
} );

Disable the Feature for a Specific Environment

add_filter( 'charitable_bot_protection_enabled', '__return_false' );

Troubleshooting

Recommended Settings button is greyed out or replaced by an Activate License link

The Quick Protection preset toggles Spam Blocker modules that require an active Pro license. Visit Charitable > Settings > Licensesand activate your license, then return to the DonationGuard tab.

No attack records are opening despite suspicious activity

Confirm that Enable is checked under Settings > Security > DonationGuard. The detector also requires that the master kill-switch filter charitable_bot_protection_enabled returns true. The first 14 days of detection use a static baseline (warmup), which is intentionally conservative.

Repeat-Attempter Block is flagging legitimate donors

Switch Action on Match to Log only (dry-run) for a week. Matches will appear in Tools > Logs filtered by source DonationGuard so you can review without blocking real donations. Lengthen the Lookback Window or raise Block After Failed Attempts if you see false positives.

Email alerts stopped arriving during an active attack

DonationGuard enforces a 4-hour cooldown between alert emails and a hard cap of 6 emails per day per site. Banner, admin-bar, and in-plugin notifications continue to update in real time even when email is throttled.

Privacy team is asking about IP storage

Turn on Hash IP Addresses (Privacy Mode) under the DonationGuard tab. IPs in attack records will be stored as one-way hashes. The one-click “blacklist this IP” action on the Attack Review screen is disabled in this mode.

Misc Notes.

Note: Activation of DonationGuard will automatically activate Usage Tracking. While no new information is sent as the result of this action, and no changes to how privacy is maintained, the data will allow DonationGuard to be improved in future updates.

What gets protected

DonationGuard inspects every donation form submission against a rolling set of behavioral signals (timing, decline rate, IP fanout, ratio, pending rate) and computes a severity score. When the score crosses a threshold, an Attack Record is opened. As more submissions arrive matching the same pattern, the record escalates from Warning to Critical. When activity dies down, the record auto-closes; you can also Dismiss false positives manually.

The 1.8.16 feature ships with three layers that work independently:

LayerWhat it doesWhere it lives
DonationGuard detectorPassive, signal-based scoring. Opens Attack Records, sends email alerts, optionally blocks the repeat-attempter pattern.Settings > Security > DonationGuard
Form-field modulesActive per-submission defenses: Honeypot (decoy field bots fill) and Time Trap (rejects sub-2-second submits).Settings > Security > Forms & Campaigns
Cloudflare Turnstile + setup wizardA free, no-friction captcha alternative to reCAPTCHA. A 3-step inline wizard helps you get a key and paste it in.Settings > Security > Captcha

Finding it

WhatWhere
Attack history (the running record of detected attacks)Charitable > Tools > Logs > Bot Events
DonationGuard settings (detection sensitivity, alerts, repeat-attempter rule)Charitable > Settings > Security > DonationGuard
Honeypot + Time Trap togglesCharitable > Settings > Security > Forms & Campaigns
Cloudflare Turnstile setup wizardCharitable > Settings > Security > Captcha (when Turnstile is the selected provider)

Attack History

The Bot Events sub-tab under Tools > Logs is where every detected attack lands. Each row is one Attack Record:

ColumnWhat it shows
StatusOpen (currently active), Closed (activity died down — DonationGuard closed it automatically), or Dismissed (you marked it as a false positive).
StartedWhen the first qualifying submission landed.
DurationHow long the burst lasted from first to last matching submission, or (ongoing) if still open.
Peak SeverityThe highest score the record reached during its run. Critical or Warning, with a numeric score (e.g. Critical (0.9)).
Donations FlaggedNumber of form submissions tied to this attack pattern.
ActionsA View Detail link to the per-record drill-in.

Below the table, the Clear History button removes closed and dismissed records but leaves open attacks in place (so you can’t accidentally hide an active incident from your own view).

Honeypot and Time Trap

DonationGuard works with two new no-friction form modules ship in 1.8.16, both under Settings > Security > Forms & Campaigns:

The Forms & Campaigns sub-tab showing Math Validation, Honeypot, and Time Trap toggles plus Default Minimum Donation.

Honeypot

A hidden decoy field is injected into every donation form. Real humans never see it (it’s a <input type="hidden">). Naive bots auto-fill anything that looks like a URL or website input — when the field comes back populated, the submission is silently rejected.

  • Setting: Honeypot — a single on/off toggle.
  • Donor experience: zero. No captcha, no math problem, no friction.
  • What it catches: dumb form-spam bots that fill every field on a form. Doesn’t catch sophisticated bots that target Charitable specifically.
  • Recommended: always on. Costs nothing, catches a meaningful chunk of low-effort abuse.

Time Trap

Rejects donation form submissions completed in less than 2 seconds. Donors don’t fill out a multi-field form that fast; bots do.

  • Setting: Time Trap — a single on/off toggle.
  • Donor experience: zero. Real humans take 8–60 seconds to fill the form even if they’re fast.
  • What it catches: scripted submitters that POST directly to the form endpoint without rendering the page first. Good complement to Honeypot.
  • Recommended: always on.

Math Validation (older but still here)

A pre-existing module, kept for completeness on this tab: adds a random math problem (8 - 5 = ?) to the donation form that donors must answer correctly to submit. More friction than Honeypot or Time Trap; turn this on only if you’re getting through bots that defeat the no-friction layers.

Tips

  • Dry-run before blocking. When you first enable Repeat-Attempter Block, set Action on Match to Log only (dry-run) for a week. Watch the matches under Tools > Logs. If they’re all real attackers, flip to Block. If you see legitimate donors, raise the threshold or lookback window first.
  • Privacy Mode trade-off. Hash IP Addresses makes Attack Records GDPR-friendlier but disables one-click blacklist-add. If you don’t blacklist by IP anyway, leave it on.
  • Quick Protection is one click. If you’re not sure where to start, hit Apply Recommended Settings on the DonationGuard panel — it enables Honeypot, Time Trap, and Rate Limiting in one shot.
  • An open attack record is more useful than a closed one. Don’t dismiss-as-false-positive in the heat of an incident. Leave it open until the burst is over so you can drill in, gather IP/email patterns, and only then make calls about whether it was real.
  • The ‘All Clear’ email is the calmest signal. Watching active incidents tick down to closed is more reassuring than tracking ongoing alerts. Turn this on.

Developer reference

Storage

WhereWhat
Post type charitable_bot_atkEach attack record is a post of this type. Statuses are publish (open), cb_bot_closed, cb_bot_dismissed.
Post meta _charitable_bot_attack_severityNumeric severity score (0.0 — 1.0+) for an attack at peak.
Post meta _charitable_bot_attack_severity_tierString: warning or critical.
Post meta _charitable_bot_attack_signals_at_peakJSON snapshot of the five signal values at the moment severity peaked.
Post meta _charitable_bot_attack_donation_idsJSON array of donation post IDs flagged by this attack.
Option charitable_bot_protection_settingsInternal mirror of the DonationGuard settings that the detector hot path reads directly (no setting round-trip to charitable_settings).

Actions

ActionWhen it fires
charitable_bot_attack_openedA new attack record is opened. Receives $post_id, $tier.
charitable_bot_attack_escalatedAn existing record’s tier changes upward (warning → critical). Receives $post_id, $previous_tier, $new_tier.
charitable_bot_attack_closedA record is auto-closed because activity died down. Receives $post_id, $reason.

Signal extension

The five built-in signals live in includes/pro/bot-protection/class-charitable-bot-signal-*.php. Each implements a common interface (compute a deviation factor for the current submission). Add a custom signal by extending Charitable_Bot_Signal_Abstract and registering it through the charitable_bot_signals filter — your signal will be evaluated on every submission and rolled into the scorer alongside the built-ins.

Custom error messages

The Repeat-Attempter Block error message is filterable per donor — useful if you want different copy for different campaigns:

add_filter( 'charitable_bot_repeat_attempter_block_message', function( $message, $email, $campaign_id ) {
    if ( $campaign_id === 123 ) {
        return 'Your donation could not be processed. Please contact our support team.';
    }
    return $message;
}, 10, 3 );

Customization examples

Disable DonationGuard alerts entirely (keep detection, suppress emails):

add_filter( 'charitable_bot_attack_should_send_alert', '__return_false' );

Lower the open-record severity threshold (more sensitive — open records on lower-score events):

add_filter( 'charitable_bot_scorer_open_threshold', function( $threshold ) {
    return 0.5; // Default is around 0.6.
} );

Auto-dismiss attacks below a score:

add_action( 'charitable_bot_attack_opened', function( $post_id, $tier ) {
    $score = (float) get_post_meta( $post_id, '_charitable_bot_attack_severity', true );
    if ( $score < 0.65 ) {
        wp_update_post( array( 'ID' => $post_id, 'post_status' => 'cb_bot_dismissed' ) );
    }
}, 10, 2 );

Route critical alerts to a Slack webhook:

add_action( 'charitable_bot_attack_opened', function( $post_id, $tier ) {
    if ( 'critical' !== $tier ) {
        return;
    }
    $score = get_post_meta( $post_id, '_charitable_bot_attack_severity', true );
    wp_remote_post( SLACK_WEBHOOK_URL, array(
        'body' => json_encode( array(
            'text' => sprintf( 'DonationGuard: CRITICAL attack opened (#%d, score %.2f)', $post_id, $score ),
        ) ),
    ) );
}, 10, 2 );

Related


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!

New templates

🤩 New Beacon Campaign Templates w/ “Hero” Block!

With the new Beacon Campaign Templates for Charitable Pro, you can launch a stunning, full-width fundraising page that instantly captures visitor attention above the fold.

Fundraising page header for Save Maple Grove Park with a donation widget and a small square photo of a sunlit tree thumbnail on the left.

🔦 Above-the-Fold Impact: Lead with a full-width hero image, your logo, and your goal with a donation widget locked right on top of the banner so your ask and momentum register instantly without scrolling.

📐 Two Flexible Layouts: Choose between a structured two-column layout for side-by-side storytelling and supporting details, or a clean one-column view designed for uninterrupted long-form narratives.

⚡ All-in-One Hero Field: Powered by the new Campaign Hero field, bringing background media, live progress bars, custom donation amounts, and recurring giving tabs together into a single cohesive block that can be dropped into any layout.

🎨 Automatic Theme Matching: The hero banner and donation widget automatically inherit your campaign theme’s button and accent colors, ensuring your entire presentation stays beautifully on-brand without touching a line of CSS.

Learn more here.

donation form Feature New

📝 Donation Form Block: Embed a Working Donation Form Anywhere

With the new Donation Form Block for Charitable Pro, you can drop a fully working donation form directly onto any page or post in the WordPress block editor. No redirects, no page reloads, and zero friction between reading your story and making a contribution.

📝 Drop Forms Anywhere: Place a working form directly onto your homepage, inside a story-driven blog post, on a dedicated landing page, or within a campaign announcement.

🎯 Dynamic Campaign Binding: Easily choose a specific campaign from the block sidebar or set it to automatically bind to whichever campaign is currently being viewed.

📐 Full vs. Minimal Form Views: Switch between a full layout or a compact minimal view to perfectly fit sidebars, narrow columns, or wide landing pages.

🎨 Scoped No-Code Styling: Customize typography, container spacing, border radius, amount buttons, and accent colors independently for every form instance without touching a line of CSS.

Learn more here.

ambassadors New

👤 Creator Profiles: Put a Face to Every Peer-to-Peer Campaign

Ambassadors 3.3.0 now provies Creator Profiles — giving your supporters a permanent, shareable public home that turns one-time fundraisers into ongoing relationships.

👤 Public Creator Pages: Give every fundraiser an instant, clean landing page at /creator/their-name/ to showcase their custom avatar, bio, and a browsable grid of their campaigns.

📊 Proof of Impact: Boost donor trust by displaying site-wide milestones on the profile—like total funds raised and total donor counts.

💳 Interactive Hover Cards: When donors hover over a creator’s name on a campaign page, a compact card expands with their bio and social handles right at the moment of decision.

📍 Responsible Location Sharing: Allow creators to safely show local supporters where they are based using only city, state, and country details.

🛠️ Self-Serve Customization: Fundraisers can update their own profiles and link up to six social networks directly from the My Campaigns hub, saving you admin time.

Ready to empower your advocates? Update to Ambassadors 3.3.0 and turn on “Enable Public Creator Page” today!

Improvement Payments

📱 Turn Mobile Scrollers Into Donors: Meet Charitable’s Mollie Upgrade

Losing mobile supporters because they hate typing out long card numbers on their phones? Charitable’s updated Mollie integration features:

⚡ One-Tap Wallet Checkout: Enable donors to complete their gifts instantly using Apple Pay or Google Pay with a simple face scan, fingerprint, or tap.

💰 No Extra PCI Burden: Skip complex domain verification and security compliance since all wallet transactions run safely through Mollie’s hosted checkout.

🛠️ Custom Cancel Routing: Keep the experience predictable by automatically sending donors who back out to your cancellation page, or use developer filters to route them to a custom page.

Visit this page to learn more.

ambassadors improved New

Moderation and Directory Screens In Ambassadors 3.0

Ambassadors 3.0 has new features: moderation and directory screens… now easily see those who are earning donations on your peer to peer network – including campaign creators that might need to be verified – all in one place. Generate reports, email ambassadors and campaign creators directly and more.

🚀 See when campaign creators and ambassadors have updated their campaigns, what donors/donation they have brought in and more.

🎉 Manually add ambassadors and campaign creators, and approve them in one-click!

Visit this page to learn more.