diff --git a/crates/collab/src/api/billing.rs b/crates/collab/src/api/billing.rs index 70b9585736cbfc96fe4fb65e24ae53cc94f86392..cb6a31aad229efb6d4424291fb99612c2be2f4bd 100644 --- a/crates/collab/src/api/billing.rs +++ b/crates/collab/src/api/billing.rs @@ -1185,6 +1185,21 @@ async fn sync_subscription( .await?; } + if let Some(stripe_billing) = app.stripe_billing.as_ref() { + if subscription.status == SubscriptionStatus::Canceled + || subscription.status == SubscriptionStatus::Paused + { + let stripe_customer_id = billing_customer + .stripe_customer_id + .parse::() + .context("failed to parse Stripe customer ID from database")?; + + stripe_billing + .subscribe_to_zed_free(stripe_customer_id) + .await?; + } + } + Ok(billing_customer) } diff --git a/crates/collab/src/stripe_billing.rs b/crates/collab/src/stripe_billing.rs index 23cc9c02e2ebb9ba9beddecf832eb62196bb1099..78680faf57494596470c55f7adc42f85dcd04861 100644 --- a/crates/collab/src/stripe_billing.rs +++ b/crates/collab/src/stripe_billing.rs @@ -263,6 +263,24 @@ impl StripeBilling { Ok(session.url.context("no checkout session URL")?) } + pub async fn subscribe_to_zed_free( + &self, + customer_id: stripe::CustomerId, + ) -> Result { + let zed_free_price_id = self.zed_free_price_id().await?; + + let mut params = stripe::CreateSubscription::new(customer_id); + params.items = Some(vec![stripe::CreateSubscriptionItems { + price: Some(zed_free_price_id.to_string()), + quantity: Some(1), + ..Default::default() + }]); + + let subscription = stripe::Subscription::create(&self.client, params).await?; + + Ok(subscription) + } + pub async fn checkout_with_zed_free( &self, customer_id: stripe::CustomerId,