Replace WooCommerce Subscriptions with DashCommerce
WooCommerce Subscriptions is a decade of battle-tested PHP billing logic bolted to WordPress. DashCommerce replaces the feature set with a thin layer over Stripe Subscriptions — but only if you're willing to leave WordPress behind.
WooCommerce Subscriptions works. It has worked for many stores for many years. What it costs is the annual license, the WordPress cron reliability tax, and the admin sprawl of a commerce stack built from fifteen plugins. DashCommerce trades that for a single MIT-licensed plugin that uses Stripe Subscriptions directly. The catch: you can't just swap the subscription plugin — you're leaving WordPress to do this.
The WooCommerce Subscriptions problem
WooCommerce Subscriptions works. That is worth stating up front. It has billed recurring revenue for more stores for more years than almost any other subscription tool, and the core logic — trials, proration, sign-up fees, synchronized renewals, failed-payment retries — has been refined through a decade of merchant feedback. If you have never had a problem with it, you do not need this page.
The reasons teams start looking for an alternative are not about WooCommerce Subscriptions’ quality. They are about the costs it imposes by being what it is.
First, the license. $299 per year per site for updates and support. Miss a renewal and your copy keeps working, but new Stripe API changes, WordPress compatibility fixes, and security patches stop arriving. Stores running it on multiple environments (staging, production, per-brand sites) pay that multiple times. Over five years for a three-site setup, that is $4,485 in license fees alone — before you add WooCommerce Payments, WooCommerce Shipping, WooCommerce Tax, or any of the other paid extensions most stores need.
Second, the runtime. WooCommerce Subscriptions depends on WordPress cron (wp-cron.php) to process renewal events, expired trials, and failed-payment retries. WordPress cron fires on page load, not on a wall clock. On low-traffic stores, on shared hosts with caching layers that bypass PHP, or on sites behind aggressive CDN rules, the cron can miss windows. Renewals can run hours late. Trial expirations can skip. Most production stores solve this by replacing wp-cron with a real OS-level cron job — but the default deployment is fragile, and the failure mode (a subscription that should have billed but didn’t) is the exact failure mode you most want to avoid.
Third, the sprawl. WooCommerce Subscriptions alone is one plugin. A functional subscription store also runs WooCommerce core, WooCommerce Payments (or WooCommerce Stripe), WooCommerce Shipping, WooCommerce Tax or TaxJar, WooCommerce Product Add-Ons if you need variations, WooCommerce Memberships if you gate content, and whatever marketing plugins marketing asked for. Each plugin has its own update cadence, its own admin surface, and its own compatibility matrix against WordPress version and PHP version. The admin becomes a maze of unrelated menus.
What DashCommerce gives you instead
DashCommerce is a commerce plugin for EmDash CMS, installed via npm create @dashcommerce@latest. Subscriptions are in core — @dashcommerce/core ships them, not as a paid addon. There is no separate license. The package is MIT on npm, pinned currently at v0.1.3.
Instead of a PHP plugin that maintains its own subscription tables and uses WordPress cron to decide what to bill when, DashCommerce’s subscription implementation is a thin layer over Stripe Subscriptions. Stripe holds the state: the Subscription object, the Price with its recurring interval, the Customer’s default payment method, the schedule of upcoming invoices. DashCommerce holds references — a DashCommerce subscription record points to a Stripe subscription ID and caches display fields (customer name, product name, current period end) for the admin UI. When Stripe bills the subscription, the webhook arrives, and DashCommerce updates its local mirror.
What this means practically: renewals happen on Stripe’s infrastructure, not yours. Trial expirations happen on Stripe’s clock. Failed-payment retries happen on Stripe’s Smart Retries schedule. Your Astro app does not need to be running at 3 AM for a renewal to fire. Your edge deployment can be cold and the subscription still bills.
The admin surface is a single React app, one page for subscriptions, with filter-by-status, customer lookup, proration preview, and cancellation flow. Twelve pages total cover the entire commerce operation — you are not tabbing between fifteen plugin admins.
The Stripe Subscriptions primitive
The architectural bet DashCommerce makes is that Stripe Subscriptions already solves billing, and the correct layer for a commerce plugin to live at is orchestration rather than reimplementation.
Everything Stripe Subscriptions supports is available because Stripe is the source of truth:
- Proration: Stripe’s
proration_behavior: 'create_prorations'handles upgrade/downgrade math. DashCommerce’s admin surfaces the proration preview (credit amount, next invoice amount) before the merchant confirms. - Multiple prices on one subscription: A subscription can have a base monthly price plus a per-seat price plus a metered usage price. Stripe handles the billing; DashCommerce shows the breakdown.
- Billing cycle anchors: Synchronized renewals (all customers billed on the 1st) use
billing_cycle_anchor— the native Stripe feature. - Pause / resume:
pause_collectionon the subscription pauses invoicing without canceling. - Dunning: Stripe Smart Retries handles the retry schedule; Stripe Billing rules handle the eventual transition to past_due or canceled.
- Cancel at period end:
cancel_at_period_end: truekeeps service active through the paid period, then cancels.
WooCommerce Subscriptions had to build equivalents for all of this in PHP, against its own database tables, synchronized with Stripe only at the payment moment. DashCommerce does not reinvent any of it — and so the feature set tracks Stripe’s roadmap automatically. When Stripe adds a new subscription capability, DashCommerce’s webhook handlers usually just need to learn about a new event type.
The tradeoff is that DashCommerce cannot support subscription logic that Stripe does not support. If you need billing logic that only makes sense inside a PHP plugin with direct database access — say, a custom per-customer dunning sequence that branches on WooCommerce customer meta — you will have to either rebuild it against Stripe primitives or stay on WooCommerce.
The part you can’t just swap
This page is titled “alternative,” not “drop-in replacement,” for a reason.
WooCommerce Subscriptions is a WordPress plugin. DashCommerce is an Astro plugin. You cannot install DashCommerce into WordPress, and you cannot install WooCommerce into EmDash. Replacing WooCommerce Subscriptions with DashCommerce means leaving WordPress entirely — moving your content, your theme, your admin, your SEO surface, and your entire frontend runtime onto EmDash and Astro.
That is a large project. It is probably a larger project than the pain WooCommerce Subscriptions is currently causing you, unless WordPress itself is already on your list of things to replace for reasons beyond subscriptions.
If WordPress is staying, this migration does not make sense. The WordPress-native alternatives to WooCommerce Subscriptions are SureCart, FluentCart, Paid Memberships Pro, and MemberPress. Any of those will give you modern subscription billing without leaving the CMS. Use them.
DashCommerce only makes sense if you are rebuilding the whole stack. It is shaped for teams that have decided — for performance reasons, for TypeScript-end-to-end reasons, for edge-deployment reasons, for PHP-allergy reasons — that WordPress is leaving. DashCommerce is what commerce looks like on the other side of that decision.
Migration approach
If you are in fact moving the whole stack and need a realistic migration plan for active subscriptions:
- Audit your subscription catalog. Export from WooCommerce Subscriptions: product list, recurring price, trial length, sign-up fee, billing cycle anchor, active customer count per product. This is your target schema in DashCommerce.
- Verify Stripe ownership. The Stripe customers and subscriptions currently under WooCommerce must be in your own direct Stripe account, not a Stripe Connect account owned by a partner. If they are under someone else’s Connect account, re-tokenization is the only path and you will lose customers to friction.
- Mirror products into DashCommerce. Using
dashcommerce-merge-seedor the admin UI, create matching subscription products. Do not create new Stripe Prices yet — reference existing ones by ID if possible, since active subscriptions are tokenized against them. - Run parallel. The safest cutover: new signups go to DashCommerce, existing subscriptions finish their current billing cycle on WooCommerce. Over three to twelve months, WooCommerce’s subscription table drains and DashCommerce’s fills.
- For must-move-now subscriptions: create DashCommerce subscription records that reference the existing Stripe subscription IDs. The renewal on Stripe’s side doesn’t change — Stripe keeps billing. DashCommerce’s webhook handlers take over the order-creation and email side. WooCommerce stops receiving the webhook when you switch the Stripe webhook endpoint to DashCommerce.
- Expect a churn bump. Even the cleanest migration nudges a percentage of customers to reconsider. Plan comms (a transparent email to subscribers announcing the new billing experience), pre-warm the support queue, and monitor cancellation rates for the first two billing cycles post-cutover.
The honest recommendation
Do not migrate from WooCommerce Subscriptions to DashCommerce to escape the $299/yr license. The engineering cost of the full WordPress-to-EmDash migration is vastly larger than the license, and if that is your only reason, you are making a bad trade.
Migrate when the whole platform is moving. If your organization has decided for other reasons — frontend performance, engineering team preference for TypeScript and Astro, edge deployment requirements, wanting the CMS layer to not be WordPress — that WordPress is leaving, then DashCommerce is the subscription billing layer that comes with you. The feature set maps cleanly to Stripe Subscriptions, the renewal runtime is more robust than WordPress cron, the admin sprawl collapses to a single React app, and the MIT license removes the ongoing per-seat cost.
If WordPress is staying, this is the wrong tool. SureCart, FluentCart, or MemberPress exist for that case. WooCommerce Subscriptions itself, for all its rough edges, is a reasonable choice for a store that already runs WooCommerce and does not want to rebuild. The decision here is not WooCommerce Subscriptions vs DashCommerce — it is whether the underlying CMS is changing.
WooCommerce Subscriptions → DashCommerce, feature by feature.
| WooCommerce Subscriptions | DashCommerce equivalent | Notes |
|---|---|---|
| 01 Simple subscription product (fixed recurring price) | DashCommerce subscription product type → Stripe Price with recurring.interval | |
| 02 Trial period (X days free) | first_invoice.trial_period_days on Stripe Subscription | Stripe-native; no WooCommerce cron job deciding when the trial expires. |
| 03 Sign-up fee | One-time line item added to the first invoice | Implemented via invoice_items; renewal invoices do not include it. |
| 04 Synchronized renewals (all customers billed on the 1st) | billing_cycle_anchor on Stripe Subscription | |
| 05 Subscription switching (upgrade/downgrade) | Stripe proration_behavior: 'create_prorations' | Admin UI exposes proration preview before confirming the switch. |
| 06 Failed-payment retries (Smart Retries) | Stripe Smart Retries / Billing dunning rules | Configured in Stripe dashboard, not in DashCommerce admin. |
| 07 Customer pause / resume | pause_collection on Stripe Subscription | |
| 08 Cancellation flow with reason capture | DashCommerce cancellation form → cancel_at_period_end + metadata.reason | |
| 09 Payment method update link (on failed payment) | Stripe Customer Portal session, or signed magic-link to update page | |
| 10 Subscription lifecycle webhooks | invoice.paid / invoice.payment_failed / customer.subscription.updated handlers | Idempotent via Stripe event IDs; no WP cron dependency. |
| 11 WooCommerce Subscriptions admin reports (MRR, churn) | DashCommerce admin subscription page + Stripe Sigma for cohort analysis | Less mature than WooCommerce's native reports — Stripe Sigma is the power-user answer. |
| 12 Renewal order created as WooCommerce order row | Each Stripe invoice.paid creates a DashCommerce order record |
- WooCommerce Shipping, WooCommerce Tax, and ShipStation integrations do not transfer. DashCommerce has its own shipping zones and supports Stripe Tax, but the specific WP shipping plugins you've configured need to be remapped.
- WooCommerce Memberships (the paid $199/yr addon that gates content behind subscription status) has no direct DashCommerce equivalent. EmDash access control covers some cases; complex drip membership content does not map.
- WooCommerce Bookings, WooCommerce Product Add-Ons, and other Woo-ecosystem extensions are not replaced. If your subscription depends on these, you're rebuilding that logic.
- PHP hooks and actions your theme or custom code relies on (woocommerce_subscription_status_updated, etc.) will not exist. Any custom billing logic needs to be ported to DashCommerce's TypeScript event handlers or Stripe webhooks.
- Tax calculations done via TaxJar's WooCommerce plugin need to move to Stripe Tax or a direct TaxJar integration. DashCommerce supports Stripe Tax out of the box.
- WooCommerce's built-in subscription status history (with per-user notes) does not have a one-to-one DashCommerce equivalent; metadata on the Stripe subscription is the closest analog.
Replacing WooCommerce Subscriptions — FAQ
- Why replace WooCommerce Subscriptions at all? It's been stable for years.
- Stable is the right word — WooCommerce Subscriptions is battle-tested. The reasons to replace it are not about quality. They are: the $299/yr-per-site license that renews forever, the WordPress cron reliability issues that cause occasional missed renewals (especially on shared hosts), the admin sprawl when you combine Subscriptions with Payments, Shipping, Tax, and a dozen other plugins, and the inherent PHP runtime cost. If none of those pain you, don't migrate. WooCommerce Subscriptions is not broken — it's just expensive and tied to a substrate some teams are leaving.
- Does DashCommerce's subscription model match Stripe's?
- Yes — that's the design. DashCommerce does not implement its own billing engine. It writes to Stripe's subscription primitives (Subscription, Price, Invoice, CustomerBalanceTransaction, Coupon) and reads lifecycle state back via webhooks. Everything Stripe Subscriptions supports — proration, trials, metered billing, multiple prices on one subscription, pause/resume, cancellation at period end — is available to DashCommerce because Stripe is the source of truth. WooCommerce Subscriptions, by contrast, maintains its own subscription state in WordPress tables and uses Stripe only for the payment moment. That architectural difference is the core of the switch.
- How do I migrate active WooCommerce subscriptions over?
- This is the hard part, and there's no clean automated path. WooCommerce Subscriptions stores subscriptions as a combination of WP posts, WooCommerce order data, and Stripe customers tokenized against the WooCommerce Stripe plugin's configuration. To move them, you export the customer list with Stripe customer IDs and payment method IDs, verify each Stripe customer is under your own Stripe account (not a Stripe Connect account owned by anyone else), and then create matching DashCommerce subscription records referencing those Stripe subscriptions. In practice, most migrations either run parallel (new signups on DashCommerce, old ones finish on WooCommerce) or force a re-authorization on next renewal. Plan for a churn bump either way.
- What about WooCommerce Memberships or WooCommerce Bookings?
- Memberships and Bookings are separate Woo extensions, not part of Subscriptions. DashCommerce does not ship equivalents. For memberships — gated content tied to active subscription status — you can build a reasonable version with EmDash's access-control primitives plus DashCommerce's subscription status webhooks, but a polished drip-content membership site is not a weekend port. For bookings (appointment scheduling tied to products), there's no DashCommerce equivalent; you'd bring a separate tool like Cal.com or SavvyCal and bridge it.
- Does DashCommerce support sign-up fees?
- Yes. Sign-up fees are implemented as a one-time Stripe invoice item added to the first invoice of the subscription. The product editor has a sign-up fee field on subscription product types; at checkout, DashCommerce creates the Stripe Subscription with the recurring price and attaches a one-time invoice_item for the sign-up amount. Renewal invoices do not include the sign-up fee — this matches WooCommerce Subscriptions' behavior.
- Can I keep WordPress and just swap out the subscription plugin?
- No. DashCommerce is a plugin for EmDash CMS, not for WordPress. It will not install on WordPress and has no PHP build. If your goal is to keep WordPress and replace only the subscriptions plugin, you want SureCart, FluentCart, or Paid Memberships Pro — those are WordPress-native. DashCommerce is specifically for teams that have already decided WordPress is leaving, and want their commerce layer to come with them onto an Astro / edge-first stack. If WordPress is staying, this is the wrong product.
- How does DashCommerce handle failed payments and dunning?
- Dunning is handled by Stripe's Smart Retries and Billing dunning rules, configured in the Stripe dashboard. When invoice.payment_failed fires, DashCommerce updates the local subscription record, triggers a transactional email to the customer with a payment-method-update link (via Stripe Customer Portal or a signed magic-link), and logs the event. After Stripe exhausts its retry schedule, the subscription transitions to past_due or canceled based on your Stripe Billing config. This is simpler than WooCommerce Subscriptions' in-plugin retry system but depends entirely on Stripe being configured correctly.
- Is DashCommerce more reliable than WooCommerce Subscriptions?
- Honest answer: it's too new to claim that. WooCommerce Subscriptions has a decade of production hardening across hundreds of thousands of stores. DashCommerce is v0.1.3 on npm, pre-1.0, and has not been in production at that scale. What DashCommerce has going for it structurally is simpler: Stripe is the billing system of record, renewals happen on Stripe's infrastructure (not your WordPress cron), and webhooks are idempotent via Stripe event IDs. That architecture reduces the categories of failure — but does not prove stability on the scale that WooCommerce Subscriptions has. Pin versions carefully and run the cutover alongside your existing store for at least one billing cycle.
Replace WooCommerce Subscriptions in an afternoon.
Scaffold a new storefront with every feature category in core. No plugin sprawl, no platform fees.