Update Billing Schedules
Manage existing billing schedules, modify frequencies, update items, and control schedule lifecycle
Update billing schedules to adapt to changing subscription needs, customer requirements, and business conditions. Change billing frequencies, add or remove billing items, configure autopay settings, pause or cancel schedules, and query schedules by various criteria. All schedule modifications preserve the complete invoice generation history while applying changes to future billing cycles.
Updates to billing schedules affect future invoice generation only. Previously generated invoices remain unchanged. When you modify billing items or frequencies, the changes apply starting with the next scheduled invoice. To modify existing invoices, update them directly through the Invoice API.
Prerequisites
Before updating billing schedules, ensure you have:
Understand schedules
Learn about billing schedule concepts, frequencies, and how they work.
Create schedules
Set up new recurring billing schedules with flexible frequencies.
Managing Billing Schedules
Retrieve, modify, and control the lifecycle of existing billing schedules.
Retrieve Schedule
Get complete schedule details including current configuration, financial totals, and billing items.
Change Billing Frequency
Update the billing frequency to match changing subscription needs.
# Change from monthly to quarterly
schedule = pl.BillingSchedule.get("bscd_abc123")
schedule.update(
recurring_schedule={
"type": "quarterly",
"quarterly": {
"q1": {"billing_month": 3, "billing_day": 31},
"q2": {"billing_month": 6, "billing_day": 30},
"q3": {"billing_month": 9, "billing_day": 30},
"q4": {"billing_month": 12, "billing_day": 31}
}
}
)Effect of frequency change:
- Next invoice generated on new schedule
- Previous invoices unaffected
- Billing items continue as configured
- Schedule totals maintain complete history
Frequency Change Timing: When you change the billing frequency, the next invoice is generated based on the new schedule starting from the date of the update. For example, if you change from monthly (billing day 1st) to quarterly on February 15th, the next invoice generates on March 31st (first quarter end after the change).
Update Autopay Settings
Enable or disable automatic payment collection.
Enable autopay:
schedule = pl.BillingSchedule.get("bscd_abc123")
schedule.update(
autopay_settings={
"allowed": True
},
payer={
"account_id": "acct_customer123",
"method_id": "pm_card_456" # Optional: specify payment method
}
)Disable autopay:
schedule = pl.BillingSchedule.get("bscd_abc123")
schedule.update(
autopay_settings={
"allowed": False
}
)Cancel Schedule
Stop future invoice generation by setting an end date.
# Cancel immediately (no future invoices)
from datetime import date
today = date.today().isoformat()
schedule = pl.BillingSchedule.get("bscd_abc123")
schedule.update(
end_date=today,
attrs={
"cancellation_reason": "Customer requested cancellation",
"cancelled_by": "[email protected]",
"cancelled_date": today
}
)Cancellation effects:
- No new invoices generated after end_date
- Existing unpaid invoices remain due
- Schedule remains accessible for history
- Financial totals reflect all historical activity
Scheduled cancellation:
# Cancel at end of current billing period
schedule = pl.BillingSchedule.get("bscd_abc123")
schedule.update(
end_date="2024-12-31", # Last day of service
attrs={
"cancellation_reason": "Contract end",
"cancellation_type": "scheduled"
}
)Outstanding Invoices: Cancelling a schedule does not void or cancel existing invoices.
Customers remain responsible for all unpaid invoices. If you need to void invoices, update
them separately to closed status or apply credits/refunds as appropriate.
Pause Schedule
Temporarily stop invoice generation without cancelling the schedule.
Pause by setting near-future end date:
from datetime import date
schedule = pl.BillingSchedule.get("bscd_abc123")
schedule.update(
end_date="2024-03-31", # Pause until this date
attrs={
"pause_reason": "Customer requested service pause",
"paused_date": date.today().isoformat()
}
)Resume by clearing end date:
from datetime import date
schedule = pl.BillingSchedule.get("bscd_abc123")
schedule.update(
end_date=None, # Resume indefinite billing
attrs={
"resumed_date": date.today().isoformat(),
"resumed_by": "[email protected]"
}
)Resume by extending end date:
schedule = pl.BillingSchedule.get("bscd_abc123")
schedule.update(
end_date="2025-12-31", # Extend for another year
attrs={
"extension_reason": "Contract renewal"
}
)Pause use cases:
- Seasonal businesses (pause during off-season)
- Customer requests temporary service hold
- Payment dispute resolution
- Service interruption or maintenance
- Trial extensions
Managing Billing Items
Add, update, or remove items that appear on generated invoices.
Add Item to Schedule
Add new charges that will appear on future invoices.
Item appears on the next invoice generated from the schedule.
Item only appears on invoices generated on or after the start_date.
What happens when adding items:
- Item appears on all invoices generated after start_date
- If start_date not specified, appears on next invoice
- Item stops appearing after end_date (if specified)
- Schedule totals update to include new recurring charges
Update Item Pricing
Modify pricing for existing billing items.
Update the unit price for an existing billing item.
Update the quantity (e.g., user count, seat licenses).
Price change effects:
- New price applies to next invoice
- Previously generated invoices unchanged
- Schedule recurring_amount updates automatically
- No proration for current billing period
Remove Item from Schedule
Stop charging for specific items on future invoices.
Recommended approach - maintains item in schedule history.
Removes item completely - use for immediate removal.
When to use end_date vs delete:
- Use
end_datefor scheduled removal (end of contract, promotion expiry) - Use
end_dateto maintain item in schedule history - Use
deletefor immediate removal (customer downgrade, error correction) - Use
deletefor items never yet invoiced
Time-Limited Items
Add temporary charges for promotions, trials, or seasonal features.
Limited-time discount that automatically expires.
Trial period pricing with automatic end date.
Promotional Pricing: Use time-limited items with negative values to implement promotional discounts, trial pricing, or temporary price reductions. The item automatically stops appearing after the end_date without requiring manual removal.
Schema Reference
Fields relevant to billing schedule updates:
BillingSchedule Update Fields
descriptionend_daterecurring_scheduleannuallybilling_day1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31billing_month1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12bimonthlyfirst_billing_day1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31second_billing_day1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31monthlybilling_day1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31billing_weekfirst, lastbilling_weekday0, 1, 2, 3, 4, 5, 6quarterlyq1billing_day1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31billing_month1, 2, 3q2billing_day1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31billing_month4, 5, 6q3billing_day1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31billing_month7, 8, 9q4billing_day1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31billing_month10, 11, 12typedaily, weekly, biweekly, bimonthly, monthly, quarterly, annuallyautopay_settingsalloweddefault_tax_rateattrsBillingItem Update Fields
descriptionstart_dateend_dateline_itemtype=line_itemqtytotalvaluevalue_unitspercentage, numberNext Steps
Continue building your recurring billing workflow with invoice and payment management
Manage Invoices
Track invoice lifecycle with Invoice Statuses to understand generated invoice progression from unpaid to paid, attach supporting documents with Invoice Attachments for receipts and documentation, and create one-time charges with Creating Invoices for non-recurring billing needs.
Process Payments
Configure automatic payment collection with Automatic Payments to charge customers on invoice due dates, process manual payments with Payment API for programmatic invoice payment processing, and send payment requests with Payment Requests to share payment links via email or SMS.
Analyze Performance
Monitor billing events with Webhook Events to receive real-time schedule and invoice generation notifications, track subscription metrics with Reporting Overview for MRR, ARR, and churn analysis, and analyze revenue data with Transaction Reports for detailed financial reporting.
Related articles
- Billing Schedules Overview - Understand billing schedule concepts
- Create Billing Schedules - Set up new recurring billing
- Automatic Payments - Configure autopay settings
- Invoice Statuses - Track invoice lifecycle
- Creating Invoices - Understand invoice structure
- Billing Schedules API Reference - Complete API documentation