Create a Subscription Add a customer to a paid subscription plan

This lesson is available for PRO members or as a single course purchase. Sign-in and choose a plan below.
Get Unlimited PRO Access


*Enrollment provides full access to this course (and updates) for life.


NOTE. I also highly recommend listening to the customer.subscription.created to update Firestore when a new subscription is created and/or customer.subscription.deleted for cancellations. See the full source code for implementation examples.

Create a Subscription for Existing Customer

file_type_typescript billing.ts
import { stripe } from './';
import { db } from './firebase';
import Stripe from 'stripe';
import { getOrCreateCustomer } from './customers';
import { firestore } from 'firebase-admin';

 * Attaches a payment method to the Stripe customer,
 * subscribes to a Stripe plan, and saves the plan to Firestore
export async function createSubscription(
  userId: string,
  plan: string,
  payment_method: string
) {
  const customer = await getOrCreateCustomer(userId);

  // Attach the  payment method to the customer
  await stripe.paymentMethods.attach(payment_method, { customer: });

  // Set it as the default payment method
  await stripe.customers.update(, {
    invoice_settings: { default_payment_method: payment_method },

  const subscription = await stripe.subscriptions.create({
    items: [{ plan }],
    expand: ['latest_invoice.payment_intent'],

  const invoice = subscription.latest_invoice as Stripe.Invoice;
  const payment_intent = invoice.payment_intent as Stripe.PaymentIntent;

  // Update the user's status
  if (payment_intent.status === 'succeeded') {
    await db
          activePlans: firestore.FieldValue.arrayUnion(plan),
        { merge: true }

  return subscription;

API Endpoint

file_type_typescript api.ts
  runAsync(async (req: Request, res: Response) => {
    const user = validateUser(req);
    const { plan, payment_method } = req.body;
    const subscription = await createSubscription(user.uid, plan, payment_method);


Ask questions via GitHub below OR chat on Slack #questions