Skip to main content

Why migrate to Polar?

Polar offers several advantages over traditional payment platforms:

Developer-First

Built by developers, for developers. Clean REST API, type-safe SDKs, and comprehensive documentation.

Open Source

Fully open source with Apache 2.0 license. Transparent pricing, no vendor lock-in, and community-driven development.

All-in-One

Payments, subscriptions, benefits, usage billing, and customer portal in one platform.

Lower Fees

Simple 4% + 40¢ per transaction. No monthly fees, no setup costs, no surprises.

Migration overview

Migrating to Polar involves four main phases:
1

Data mapping

Understand how your existing data maps to Polar’s data model
2

Setup & configuration

Create your Polar account, connect Stripe, and configure products
3

Customer & subscription migration

Import existing customers and transition active subscriptions
4

Integration & cutover

Update your application code and switch to Polar
Timeline: Most migrations complete in 1-2 weeks depending on complexity. For large customer bases (10,000+ subscribers), plan for 2-4 weeks.

Platform-specific guides

Migrating from Stripe Billing

Polar uses Stripe for payment processing, making migration smoother. You can keep your existing Stripe account.

Data mapping

Stripe BillingPolar Equivalent
ProductProduct
PriceProduct Price
CustomerCustomer
SubscriptionSubscription
InvoiceOrder (for subscription)
ChargeOrder (one-time)
CouponDiscount

Migration steps

1

Export Stripe data

Use Stripe’s API to export your data:
import Stripe from "stripe";

const stripe = new Stripe(process.env.STRIPE_SECRET_KEY);

// Export products
const products = await stripe.products.list({ limit: 100 });

// Export customers
const customers = await stripe.customers.list({ limit: 100 });

// Export subscriptions
const subscriptions = await stripe.subscriptions.list({ limit: 100 });
For large datasets, use pagination and save exports to CSV for easier review.
2

Create products in Polar

Recreate your Stripe products in Polar:
import { Polar } from "@polar-sh/sdk";

const polar = new Polar({
  accessToken: process.env.POLAR_ACCESS_TOKEN,
});

for (const stripeProduct of products.data) {
  // Get prices for this product
  const prices = await stripe.prices.list({ 
    product: stripeProduct.id 
  });
  
  await polar.products.create({
    name: stripeProduct.name,
    description: stripeProduct.description,
    prices: prices.data.map(price => ({
      amountType: "fixed",
      priceAmount: price.unit_amount,
      priceCurrency: price.currency.toUpperCase(),
      recurringInterval: price.recurring?.interval,
    })),
  });
}
3

Connect same Stripe account

In Polar:
  1. Go to SettingsFinanceAccounts
  2. Click Connect Stripe
  3. Use the same Stripe account you’re currently using
This allows Polar to access existing customer payment methods.
Using the same Stripe account is crucial for seamless subscription migration.
4

Import customers

Polar can automatically sync customers from your Stripe account:
// Customers with existing Stripe IDs are automatically linked
const checkout = await polar.checkouts.create({
  productPriceId: "prp_...",
  customerEmail: "[email protected]",
  // Polar will match by email or create new customer
});
For bulk imports, use the API:
for (const stripeCustomer of customers.data) {
  // Polar will link to existing Stripe customer
  await polar.customers.create({
    email: stripeCustomer.email,
    name: stripeCustomer.name,
    // Additional metadata
  });
}
5

Transition subscriptions

Option 1: Natural renewal (recommended)Wait for subscriptions to renew naturally:
  • Keep Stripe Billing running
  • New purchases go through Polar
  • Existing subscriptions renew through Polar at next billing date
  • Cancel Stripe Billing once all migrated
Option 2: Immediate migrationCancel and recreate subscriptions (may cause customer disruption):
for (const stripeSub of subscriptions.data) {
  // Cancel in Stripe (optionally at period end)
  await stripe.subscriptions.cancel(stripeSub.id);
  
  // Create in Polar with same billing date
  await polar.subscriptions.create({
    customerId: polarCustomer.id,
    productPriceId: polarPrice.id,
    // Prorate or start immediately
  });
  
  // Notify customer of the change
}
Immediate migration may confuse customers. We recommend natural renewal whenever possible.

Keep using Stripe webhooks

You can continue using Stripe webhooks during transition:
// Handle both Stripe and Polar webhooks
if (webhookSource === "stripe") {
  // Legacy Stripe subscription
  handleStripeEvent(event);
} else if (webhookSource === "polar") {
  // New Polar subscription
  handlePolarEvent(event);
}

Migration checklist

Use this checklist to track your migration progress:
1

Planning

  • Export all data from current platform
  • Document current products and pricing
  • List all active subscriptions
  • Review integration points in your app
  • Create migration timeline
  • Draft customer communication plan
2

Setup

  • Create Polar account
  • Connect Stripe account
  • Complete merchant onboarding
  • Set up organization profile
  • Create API access tokens
  • Configure webhook endpoints
3

Product migration

  • Create all products in Polar
  • Configure pricing models
  • Add product descriptions and media
  • Set up benefits (if applicable)
  • Create discount codes
  • Test checkout flows
4

Customer migration

  • Import customer data
  • Send migration announcement
  • Provide payment method update instructions
  • Handle customer support questions
  • Transition active subscriptions
  • Verify benefit grants
5

Integration

  • Update checkout creation code
  • Implement Polar webhook handlers
  • Update subscription management UI
  • Add customer portal links
  • Test complete purchase flow
  • Test subscription renewal
  • Test webhook events
6

Go live

  • Switch to production mode
  • Update payment links across marketing
  • Monitor first transactions
  • Verify webhook delivery
  • Check customer communications
  • Decommission old platform (gradual)

Common challenges

Challenge: Customers need to re-enter payment detailsSolutions:
  • Use same Stripe account (if migrating from Stripe)
  • Send clear instructions with customer portal links
  • Offer incentives (discount) for early migration
  • Provide grace period for payment method updates
  • Support team ready for questions
// Example: Offer migration discount
await polar.discounts.create({
  code: "MIGRATE2024",
  type: "percentage",
  amount: 20, // 20% off
  duration: "once",
  redemptionLimit: 1, // One per customer
});
Challenge: Avoiding double charges during migrationSolutions:
  • Start Polar subscriptions at next billing date
  • Prorate partial periods
  • Cancel old subscription after new one activates
  • Monitor for duplicate charges
// Align with existing billing date
await polar.subscriptions.create({
  customerId: customer.id,
  productPriceId: price.id,
  startedAt: oldSubscription.currentPeriodEnd,
});
Challenge: Preserving transaction history and analyticsSolutions:
  • Export complete history before migration
  • Store in your database or data warehouse
  • Keep old platform in read-only mode
  • Document retention period for old system
Polar provides transaction data via API:
// Future transactions available via API
const orders = await polar.orders.list({
  customerId: customer.id,
});
Challenge: Ensuring uninterrupted access to purchased benefitsSolutions:
  • Grant benefits to migrated customers immediately
  • Map old entitlements to new benefits
  • Verify benefit access before canceling old subscriptions
  • Provide fallback access during transition
// Manually grant benefits during migration
await polar.benefits.grants.create({
  customerId: customer.id,
  benefitId: benefit.id,
});
Challenge: Keeping customers informed and reducing confusionSolutions:
  • Announce migration 30 days in advance
  • Send weekly reminders
  • Create FAQ page
  • Offer live support during migration
  • Send confirmation after successful migration
Email sequence example:
  1. Day 0: Initial announcement
  2. Day 7: First reminder with action steps
  3. Day 14: Second reminder with deadline
  4. Day 21: Final reminder with support offer
  5. Day 30: Migration complete confirmation

Post-migration tasks

After completing the migration:

Verify everything works

  • Test complete purchase flows
  • Verify webhook delivery
  • Check benefit grants
  • Confirm subscription renewals
  • Review customer portal access

Monitor closely

  • Watch for failed payments
  • Track customer support inquiries
  • Monitor webhook errors
  • Check benefit grant status
  • Review transaction success rates

Update documentation

  • Update developer docs
  • Revise customer help articles
  • Update marketing materials
  • Refresh API documentation links
  • Archive old platform references

Gather feedback

  • Survey customer experience
  • Review support tickets
  • Analyze checkout completion rates
  • Document lessons learned
  • Identify optimization opportunities

Need migration help?

We’re here to help make your migration smooth:

Join Discord

Get real-time help from our community

GitHub Discussions

Ask questions and share experiences

Email Support

Contact our team for personalized assistance

Book a Call

Schedule time with our migration specialists
Large-scale migrations: For organizations with 10,000+ active subscriptions, we offer dedicated migration support. Contact us to discuss your specific needs.

Success stories

Company: Mid-sized SaaS with 5,000 subscribersChallenge: Complex product catalog, multiple subscription tiers, and usage-based billingApproach:
  • Used same Stripe account for seamless transition
  • Migrated at natural renewal dates over 2 months
  • Implemented webhooks for both platforms during transition
  • Leveraged Polar’s usage-based billing features
Results:
  • Zero customer complaints
  • Reduced billing code by 60%
  • Saved $2,000/month in platform fees
  • Improved checkout conversion by 12%
Timeline: 6 weeks from start to 100% migration

Additional resources

API Reference

Complete API documentation

Webhook Events

All available webhook events

SDK Documentation

TypeScript, Python, PHP, and Go SDKs

Build docs developers (and LLMs) love