Time-Limited Recurring Donations (NGP VAN Payments)

Recurring donations can be configured with an end date so they automatically stop charging after a chosen point in time. For example, you might ask a donor to contribute on a recurring basis until the election, or through the end of the year.

When an end date is configured, the donation page surfaces it to the donor and the value is stored on the recurring profile. After the end date passes, the daily collector cancels the profile at the payment processor and marks its status Payment term completed. Donors are not charged after the end date.

Enabling Time-Limited Recurring

The feature is opt-in. Set recurring_end to a date in ISO 8601 format (YYYY-MM-DD) via a custom field on the page or templateset, or via URL parameter.

Priority: URL param > page custom field > templateset custom field

Example URL param:

https://example.com/donate/my-page/?recurring_end=2026-11-03

Past dates and unparseable values are ignored at render time with a warning logged to the application log. This prevents a stale custom-field value from rendering a pre-expired form.

Note that the recurring_end custom field is not created by default — add it to your instance before referencing it.

Display Format

recurring_end_format

Page or templateset custom field

Django date filter format string controlling how the end date is rendered to the donor. Default: F j, Y (e.g. November 3, 2026).

This field is custom-field only — it cannot be overridden by URL parameter.

Donor-Facing Display

The end date appears in different places depending on how the page is configured.

Single “Make it monthly” Checkbox

On standard donate pages (no monthly_amounts/weekly_amounts/annual_amounts URL parameters), the checkbox label is rewritten to incorporate the end date so the donor sees the commitment in the action they’re agreeing to:

  • Without recurring_end: Make it monthly

  • With recurring_end=2026-11-03 and the default format: Donate monthly through November 3, 2026

The label is rendered inside a <span class="ak-monthly-checkbox-label">. If you want to further customize the wording you can target this class using JavaScript.

Frequency Picker

When the frequency picker is shown (any of monthly_amounts, weekly_amounts, or annual_amounts URL parameters are set), there is no single label to fold the date into. A standalone display block appears below the picker once the donor has selected a recurring period:

Your recurring donation will continue through November 3, 2026.

This block is rendered inside a <p class="ak-recurring-end-display"> and is hidden while the donor has One-time selected.

Recurring Upsell Modal

When the Recurring Upsell is enabled alongside recurring_end, the default upsell copy automatically gains a through {recurringEnd} clause so donors see the commitment window before accepting the upsell:

  • Pitch (default with end date): Your gift can go even further. Contribute {recurringPeriod} through {recurringEnd} and provide steady support.

  • Accept button (default with end date): Yes, donate ${recurringAmount} {recurringPeriod} through {recurringEnd}

The {recurringEnd} placeholder is also available for for use in recurring_upsell_content, recurring_upsell_heading, recurring_upsell_pitch, recurring_upsell_accept_text, and recurring_upsell_decline_text custom fields, alongside the existing {recurringAmount}, {oneTimeAmount}, and {recurringPeriod} placeholders.

Example

A typical configuration for a “weekly until the election” campaign might combine recurring_end with the weekly frequency picker and the recurring upsell:

Templateset custom fields:

  • recurring_end_format: M j, Y

Page custom fields:

  • recurring_end: 2026-11-03

  • recurring_upsell: 1

  • recurring_upsell_period: weeks

  • recurring_upsell_amount: 10:5,50:10,100:25

URL parameters on a donation link:

https://example.com/donate/election-2026/?weekly_amounts=5,10,25&monthly_amounts=10,25,50&recurring_end=2026-11-03

With this setup:

  • The frequency picker renders weekly and monthly tabs.

  • A donor selecting a weekly amount sees Your recurring donation will continue through Nov 3, 2026. under the picker.

  • A donor who submits a one-time donation is prompted to upgrade with copy like Yes, donate $5 weekly through Nov 3, 2026.

  • The recurring profile is created with end_date=2026-11-03 and is charged weekly until that date, then automatically cancelled.

Tracking and Reports

The end date is stored on the core_orderrecurring row as the end_date column.

Profiles that reach their end date transition to status='completed' (labeled Payment term completed) when the daily collector visits them. This status is distinct from cancellations caused by donor or admin action, payment failure, or processor-side termination, so completion-by-time-limit can be filtered separately in reports.

Backend Notes

  • recurring_end is interpreted in UTC, matching other date fields on core_orderrecurring. Clients in non-UTC time zones may see off-by-one collection or cancellation timing relative to local midnight.

  • The end date is inclusive. A profile with recurring_end=2026-11-03 may still be charged on November 3 if that lands on a scheduled payment date; the profile transitions to completed only after that date passes.