Morning , ran into a problem with stripe subscriptions that I cannot identify a solution to. We have a site that offers 14 free trial the first time a customer subscribes to one of our two plans - monthly(14.99) / yearly (149.99) , the issue I keep running into is managing the subscription change using either subscription update or subscription schedule if the subscription is still in those 14 days of trial , for whatever reason there is always an invoice when switching during trial that covers the period the user chose (ex. if the user chose monthly plan they get charged 14.99 immediately when switching then at the next billing 141.77 , but the new billing cycle is correct and does include the trial period as expected ) what i tried so far is : 1 - make a subscription schedule at the end of the trial to switch to the new plan $phases = array( [ 'items' => [ [ 'price' => $current_price_id, 'quantity' => 1, ], ], 'start_date' => $subscription->current_period_start, 'end_date' => $free_trial, // End of the current period 'trial_end' => $free_trial, 'proration_behavior' => 'none' ], [ 'items' => [ [ 'price' => $new_price_id, 'quantity' => 1, ], ], 'start_date' => $free_trial, // Start after the current period ends 'trial_end' => $free_trial, 'billing_cycle_anchor' => 'period_start', 'proration_behavior' => 'none', ], ); 2 - update subscription directly if still in the trial phase: $stripe->subscriptions->update( $current_subscription_id, [ 'items' => [ [ 'id' => $subscription->items->data[0]->id, 'price' => $new_price_id, // New price ID ], ], 'proration_behavior' => 'none', 'trial_end' => $free_trial,//THIS IS A TIMESTAMP I HAVE IN THE DB 'billing_cycle_anchor' => 'unchanged', ], ); 3 - both of the above adding invoice deletion after the change // If there's an invoice generated during the trial, it needs to be voided $invoices = \Stripe\Invoice::all(['subscription' => $subscription->id]); foreach ($invoices->data as $invoice) { if ($invoice->status === 'open') { // Update invoice status to void \Stripe\Invoice::update($invoice->id, ['status' => 'void']); } } The documentation does not seem to hold an example for doing this , we tried doing this with the portal previously and that behaved even more unpredictably (even with disabled proration etc). So far the only thing that I managed to figure out is that stripe triggers this event( can be caught in the web-hooks endpoint we setup) - Trial ended for price_xxxxx every time you change a subscription that is in trial and this in turn triggers the first invoice. I wonder if anyone here has some experience and maybe could help point the error in these approaches.