diff --git a/crates/collab/src/stripe_billing.rs b/crates/collab/src/stripe_billing.rs index a538adf40175997fee56852910fd13a5ca2a6745..20803fa446f76366222617f25d9c957ba2abca81 100644 --- a/crates/collab/src/stripe_billing.rs +++ b/crates/collab/src/stripe_billing.rs @@ -310,6 +310,32 @@ impl StripeBilling { ) -> Result { let zed_free_price_id = self.zed_free_price_id().await?; + let existing_subscriptions = stripe::Subscription::list( + &self.client, + &stripe::ListSubscriptions { + customer: Some(customer_id.clone()), + status: None, + ..Default::default() + }, + ) + .await?; + + let existing_zed_free_subscription = + existing_subscriptions + .data + .into_iter() + .find(|subscription| { + subscription.status == SubscriptionStatus::Active + && subscription.items.data.iter().any(|item| { + item.price + .as_ref() + .map_or(false, |price| price.id == zed_free_price_id) + }) + }); + if let Some(subscription) = existing_zed_free_subscription { + return Ok(subscription); + } + let mut params = stripe::CreateSubscription::new(customer_id); params.items = Some(vec![stripe::CreateSubscriptionItems { price: Some(zed_free_price_id.to_string()),