Short answer
Compare the billing_cycle_anchor you send with the subscription’s trial_end. The simplest fix is to end the trial in the same update with trial_end set to now. Stripe’s docs describe resetting the anchor to a specific time only for subscriptions on flexible billing mode. This applies to subscriptions that use the trial_end parameter, which Stripe now labels legacy; trial offers handle the anchor differently.
Rather not fix it yourself? Stripe Billing Fix and Setup handles it at a fixed price, agreed before work starts.
Why the anchor is rejected, and the fix
01
The anchor falls inside the trial
“Update the billing cycle anchor to be after the trial’s end date or end the trial with trial_end="now".” Stripe, Error codes (subscription_update_trial_after_billing_cycle_anchor)
Stripe requires a new billing cycle anchor to be after the subscription’s trial end. Pick an anchor after trial_end where your billing mode supports it, or end the trial first.
02
The trial should end now
“To end a trial early, make an update subscription API call, setting the trial_end value to a new timestamp, or now to end immediately” Stripe, Free trials
If the customer is converting early, end the trial in the update. Setting trial_end to now ends it immediately.
await stripe.subscriptions.update(subscriptionId, { trial_end: 'now', });03
You want a trial and a fixed billing day
“You can combine trials with billing_cycle_anchor, resulting in a free period followed by a prorated period, leading into a fixed billing period.” Stripe, Free trials
Stripe’s example sends trial_end and billing_cycle_anchor together when the subscription is created, with trial_end earlier than the anchor. On an existing subscription, setting trial_end moves the anchor to that same date. In the docs’ example the customer gets the free period, then, depending on the trial length, a prorated invoice up to the anchor, then full invoices.
Checked against the vendor’s docs on : Stripe docs: Error codes; Stripe docs: Free trials; Stripe docs: Subscription billing cycle.
Rather hand it over?
Fixed scope, fixed price, paid upfront. The work happens in writing; no call needed.
- $950Stripe Billing Fix and SetupSubscriptions, webhooks, customer portal and failed payments set up or fixed, tested in Stripe test mode.See scope and start
- from $450App Fix TicketOne reproducible bug in an existing mobile or web app, diagnosed and fixed.See scope and start
- from $450AI-Built App RescueA Lovable, Bolt or Cursor app checked end to end in 3 days, then its worst problems fixed at a fixed price.No issues worth fixing, no charge. If the Launch Check finds nothing rated medium or higher, Simon refunds the full $450. You keep the report either way. This applies to the first 10 Launch Checks bought after October 30, 2026.See scope and start
“Working with Simon makes everything run so smoothly and better than I could ask for it. Amazingly communicative, extremely knowledgeable of coding and the backend processes. I strongly recommend.”
Related: Stripe subscription past_due · Stripe subscription incomplete · Stripe invoice_upcoming_none · Stripe stripe_tax_inactive