Subscriptions
Coin Moebius can sell recurring subscriptions on every fiat provider in your menu. The merchant configures the price and interval once on a product; the buy button on the site stays exactly the same. The payment provider runs the recurring billing, holds the card, retries failed renewals, and hosts the cancellation page. Coin Moebius relays the lifecycle events to your code.
Setting up a recurring product
In the dashboard's Products tab, set the Billing field to Monthly or Annual instead of One-time. An optional Free trial field appears for any trial days you want to grant before the first charge. Save the product.
The buy button HTML doesn't change. The same product-id="pro-plan" attribute works for one-time or recurring; the worker checks the product's billing setting at checkout time and routes through the provider's subscription API when applicable.
<coin-moebius-buy
project-id="proj_YOUR_ID"
product-id="pro-plan"
label="Subscribe to Pro">
</coin-moebius-buy>What you don't have to build
The provider runs the schedule. We don't store cards. We don't run cron jobs. We don't retry failed charges. We don't send dunning emails. We don't host a cancellation page. That entire side of the system lives inside Stripe (or whichever fiat provider you've connected). You're outsourcing the hard parts of recurring billing to the company that's already running them for millions of merchants.
Subscription events
Renewals and cancellations show up as webhook events your server can react to. Five normalized types cover the lifecycle:
| Event | When it fires |
|---|---|
subscription.created | New signup. Carries the first cycle's amount. |
subscription.renewed | A non-initial cycle succeeded. Extend access through the new period end. |
subscription.payment_failed | A cycle's card was declined. The provider's dunning retries on its schedule; you usually just log this for visibility. |
subscription.canceled | Terminal cancellation. The buyer canceled, dunning was exhausted, or the merchant canceled. |
subscription.updated | Status change, card update, plan change. Inspect the new status. |
Identifying buyers without storing them
Coin Moebius is a payment router, not a customer database. We never store buyer emails, names, addresses, or the provider's internal customer ids. If your application has user accounts (most subscription apps do), pass your own opaque user id as customer-ref on the buy button. The button forwards it to the worker as metadata.customerRef, we thread it through to the provider, surface it back on every event, and store only that opaque string. To us it's meaningless; to you it's the foreign key into your own user system.
<coin-moebius-buy
project-id="proj_YOUR_ID"
product-id="pro-plan"
customer-ref="user_bob_42">
</coin-moebius-buy>When you need deeper buyer detail (email, card last-four, dispute notes), the dashboard links each card transaction out to the provider that handled it (Stripe, PayPal, Square, or Authorize.Net), where the buyer record actually lives. You click through; we never duplicate it.
Cancellation: link out, don't build
Buyers cancel in the provider's hosted portal: the Stripe Customer Portal, the buyer's PayPal account page, and so on. The portal handles cancellation, card updates, receipt downloads, and plan changes, all UI you don't have to build. You can drop the buyer into the portal with one API call:
const res = await fetch(
`https://api.coinmoebius.com/api/subscriptions/${projectId}/${subId}/portal-url`,
{ method: 'POST', body: JSON.stringify({ returnUrl: 'https://you.example/account' }) },
);
const { url } = await res.json();
window.location.assign(url);Which providers support subscriptions today
Stripe and PayPal work end-to-end through the hosted buy button. Set a product to Monthly or Annual in your dashboard, paste the button on your page, and the click starts a real subscription. The provider runs the renewals.
Square and Authorize.Net subscriptions don't run through the hosted buy button. You create the subscription through your own integration with the provider (for Authorize.Net, that means collecting the card on your own page with Accept.js; Square has its own hosted subscription checkout you can use), then point the provider's webhook at us. From there the rest of the system (webhook routing, dashboard, status endpoint, customer linking) works exactly the same way it does for Stripe and PayPal subscriptions. See the next section.
Crypto providers (NOWPayments) do not support recurring billing in this product. Recurring crypto is friction-heavy on every gateway we've evaluated; we'd rather ship nothing than ship a half-broken story for it.