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 monthlyWith
recurring_end=2026-11-03and 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-03recurring_upsell:1recurring_upsell_period:weeksrecurring_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-03and 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_endis interpreted in UTC, matching other date fields oncore_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-03may still be charged on November 3 if that lands on a scheduled payment date; the profile transitions tocompletedonly after that date passes.