Skip to main content

Foundation recurring pledges

A recurring pledge is a donor's commitment to give a fixed amount on a fixed schedule — monthly, quarterly, or annually — until they (or you) cancel. Behind the scenes, every pledge is backed by a Stripe Subscription, which means Stripe handles the schedule, the retries, and the dunning. Your foundation gets a clean donor-friendly UI for the human side and an authoritative ledger of when each pledge billed.

One-time donation vs recurring pledge

Both flow through Stripe and both land in your donation ledger when they succeed, but the moving parts differ:

ConceptOne-time donationRecurring pledge
Stripe objectPaymentIntentSubscription
Tracked asDonation recordRecurringPledge record (+ a Donation record per successful charge)
ScheduleSingle chargeMonthly, quarterly, or annually
ReceiptOne PDF per donationOne PDF per successful charge
CancellationN/A — already settled or refundedPledge can be cancelled at any time
Failed retryManual donor actionStripe Smart Retries automatically

When a donor picks "Make this a recurring donation" on the public donation page and selects an interval, the platform creates the RecurringPledge record, calls Stripe to create the Subscription, and then leans on Stripe webhooks to record each successful charge as a Donation record attached to the pledge.

The four statuses

A pledge moves through four states driven almost entirely by Stripe events:

Active

The pledge is in good standing. Stripe charged the card successfully (or is about to). Each successful charge creates a Donation row attributed to the pledge, the pledge's last_charge_at advances, and the donor's lifetime totals tick up.

Past Due

Stripe attempted a charge and it failed (declined card, expired card, insufficient funds). Stripe is now in Smart Retry mode — it will retry the charge over the coming days on its own schedule. The pledge stays Past Due until Stripe either succeeds (back to Active) or gives up (Cancelled).

A pledge in Past Due is not generating donations. The donor should update their payment method through the Stripe customer portal or by contacting your foundation.

Paused

A pledge can be paused. While Paused, Stripe does not attempt new charges, but the subscription remains. This is rare in practice today — there is no Pause button in the admin UI; pausing happens via the Stripe dashboard. Document it here so you know what the badge means if you see it.

Cancelled

Terminal state. No further charges will be attempted. The pledge record stays in the database for historical reporting, but it no longer generates donations.

A cancellation can happen via three paths:

  1. Foundation Admin clicks Cancel on the pledge.
  2. Donor cancels through the Stripe customer portal (if your Stripe account exposes one).
  3. Stripe cancels the subscription after exhausting Smart Retries on a Past Due pledge.

In all three cases the platform writes the cancellation timestamp and an optional reason, and flips the pledge to Cancelled.

Recurring pledges page

Recurring pledges are listed under Foundation → Donors in the donor's detail dialog (Active Pledges section), and the full list is available through the underlying API. A dedicated admin page in the sidebar is planned but not yet exposed in the UI; for now, the donor detail dialog is the canonical surface.

What you see

For each pledge:

  • Amount and interval (e.g., $50/monthly)
  • Fund and campaign
  • Status badge
  • Donor name and email

Cancel a pledge

From a pledge row (in the donor detail dialog or via the API), click Cancel. The platform calls Stripe to cancel the subscription, then writes the local pledge record:

  • Status flips to Cancelled
  • cancelled_at is set to now
  • cancellation_reason is set to either what you typed or the default "Cancelled by admin"

The cancellation is immediate — the donor's card will not be charged again. Any donations already collected stay on the books.

If the Stripe API call fails (network error, revoked key, etc.), the local record is not updated and you see an error. Re-try after fixing the underlying issue; do not edit the database directly.

What the donor controls

Donors with a verified user account in your organization can see their own pledges through the donor portal — accessible via the platform's authenticated user routes. There they can view a list of their pledges and the donations attributed to each.

What the donor can do directly today:

  • See their pledges (read-only)
  • See receipts for each successful charge

What the donor cannot do from the donor portal today:

  • Cancel a pledge from the GreekManage UI (must contact your foundation or use the Stripe customer portal if you have one configured)
  • Change the amount or interval (cancel + re-pledge is the workaround)
  • Update payment method (Stripe customer portal or Stripe-hosted update link)

For donor-led payment management, the typical pattern is to point the donor at Stripe's customer portal. Your Foundation Admin can generate a one-time portal link from the Stripe dashboard for any subscription; eventually a portal link will be exposed directly on the donor portal page.

Failed payments and retries

Stripe's Smart Retries handle declined cards automatically. The default schedule retries roughly four times over the next three to four weeks, with the donor receiving Stripe-branded "your payment failed" emails along the way.

The platform tracks this state transition:

  • First decline → pledge flips to Past Due via the invoice.payment_failed webhook.
  • Successful retry → next invoice.payment_succeeded webhook flips the pledge back to Active, records a new Donation row, advances last_charge_at, and bumps donor and fund totals.
  • Exhausted retries → Stripe fires customer.subscription.deleted, the platform flips the pledge to Cancelled with reason "Subscription cancelled via Stripe."

You should not have to intervene during the retry window. If you want to help a donor reach a successful retry sooner, share Stripe's hosted invoice URL (visible in the Stripe dashboard for the failed invoice) so they can update their card and pay immediately.

What admins can and cannot change

Recurring pledges are intentionally low-touch from the admin side, because changing one mid-flight risks confusing the donor.

You can:

  • Cancel a pledge (immediately stops future charges).
  • See the full history of donations attached to a pledge by filtering Donations by that donor.
  • See the pledge's current status, last and next charge timestamps, and Stripe subscription ID.

You cannot, from the admin UI today:

  • Change the pledge amount, interval, fund, or campaign mid-flight. Workaround: cancel the existing pledge, ask the donor to create a new one with the corrected details.
  • Pause a pledge from the admin UI. Workaround: pause via the Stripe dashboard, or cancel and re-pledge.
  • Issue partial refunds against a single donation in the pledge (refunds via the platform UI are full only).
  • Reattribute past pledge donations to a different campaign retroactively.

Pledges and campaign close

A pledge has an optional campaign attribution. When you close a campaign, its pledges keep billing. They are independent objects — the campaign's status does not gate the Stripe Subscription's behavior. If you want to stop the recurring charges associated with a closed campaign, cancel those pledges explicitly.

This is by design: a donor who set up a monthly pledge during your Annual Fund 2025 campaign typically intends to keep giving when 2026 rolls around. If your team prefers the opposite (cancel pledges when the campaign closes), do it manually in the day or two after closure.

Tips

  • Set the campaign attribution at creation. Pledges with a campaign attribution roll into that campaign's totals; pledges with no campaign attribution only show up in fund and donor totals. There is no admin-side reattribution.
  • Don't intervene during Past Due. Stripe's Smart Retries are tuned for conversion. Let the system work for the full retry window before reaching out to the donor manually.
  • Cancel for the donor when they ask. It is faster than walking them through Stripe's customer portal. Just confirm in writing that the pledge was cancelled so there is a paper trail.
  • Reconcile via Stripe monthly. The platform records every successful pledge charge as a Donation row, but Stripe is the authoritative source for what actually settled. Pull a Stripe payout report against the platform Completed CSV at month end.

Last verified against v0.62.1 (2026-05-10).