Start Building

Fundamentals of SaaS Starter Kits

How to Add New Payment Plans in SassyPack (Stripe + Paystack)

5 min read

SaaS revenue depends on flexibility — monthly, yearly, or lifetime plans.
SassyPack lets you integrate new plans easily through Stripe or Paystack.

Here’s the full setup.


1. Update Pricing Data (Frontend)

Open: client/src/pages/Pricing.jsx

Add a new plan object:

{
  category: "Payments and Billing Integrations",
  name: "Team Plan",
  price: "$149",
  description: "For small teams launching SaaS apps",
  features: ["5 team members", "Priority support", "Lifetime updates"],
  link: "/checkout/team"
}

This updates your pricing UI instantly.


2. Create the Product in Stripe

In your Stripe Dashboard:

  • Create a new Product → "Team Plan"
  • Add a recurring or one-time price
  • Copy the Price ID

Repeat the same in Paystack if you serve African markets.


3. Add Route for the New Plan

Open: server/routes/paymentRoutes.js

Add:

router.post("/checkout/team", async (req, res) => {
  const session = await stripe.checkout.sessions.create({
    line_items: [
      {
        price: process.env.STRIPE_TEAM_PLAN_ID,
        quantity: 1,
      },
    ],
    mode: "subscription",
    success_url: `${process.env.CLIENT_URL}/success`,
    cancel_url: `${process.env.CLIENT_URL}/cancel`,
  });
  res.json({ url: session.url });
});

4. Update Environment Variables

Add the new plan IDs:

STRIPE_TEAM_PLAN_ID=price_XXXXXXX
PAYSTACK_TEAM_PLAN_ID=plan_XXXXXXX

Redeploy your backend to apply.


5. Add Frontend Checkout Link

In Pricing.jsx:

<a href="/api/payment/checkout/team">
  <button className="btn btn-primary">Choose Plan</button>
</a>

6. Confirm Payments

Stripe handles subscription webhooks automatically.
SassyPack includes a sample webhook route at: server/routes/webhookRoutes.js

Edit it to trigger account upgrades or email notifications.


7. Optional: Add Lifetime License

Add a one-time charge route:

router.post("/checkout/lifetime", async (req, res) => {
  const session = await stripe.checkout.sessions.create({
    line_items: [
      { price: process.env.STRIPE_LIFETIME_PRICE_ID, quantity: 1 },
    ],
    mode: "payment",
    success_url: `${process.env.CLIENT_URL}/success`,
    cancel_url: `${process.env.CLIENT_URL}/cancel`,
  });
  res.json({ url: session.url });
});

Final Thoughts

Monetization shouldn’t slow down shipping.
SassyPack keeps payment logic modular — add, remove, or switch plans in minutes.

Get SassyPack →

Build features once. Get paid forever.

Keep Reading

Related Articles

View all posts

Free Tools

Ready to put the guide to work?

Use the free SaaS tools to plan pricing, validate ideas, and check your launch setup.

Open Free Tools