Listeo Subscriptions is built for recurring billing, but not every package should renew. Some listing packages are a one-off: a single featured slot, a one-month boost, a pay-once listing. The one-time payment option lets you sell those through the exact same provider checkout you already use for subscriptions — no WooCommerce Subscriptions, no second plugin, no separate checkout.

If the name feels contradictory (“why is there a one-time option inside a *Subscriptions* plugin?”), here is the short version: the plugin is really a bridge between your Listeo packages and a payment provider’s hosted checkout.  Keeping both in one place means one provider connection, one settings screen, and one customer dashboard for every paid package you sell.

How it differs from a recurring package

A recurring package charges the buyer automatically through the provider on a weekly, monthly, or yearly cycle, and the customer can manage or cancel it from their account. A one-time package charges the buyer once. There is no renewal date, nothing to cancel, and no subscription for the customer to manage. The buyer pays, the package is granted, and that’s the end of the billing story. Just like regular packages with WooCommerce, but using the Payment Providers from Listeo Subscriptions and skipping outdated WooCommerce checkout.

Recurring and one-time are mutually exclusive on a single package. A package is either a subscription or a single purchase – never both. If you switch a package to one-time, recurring is automatically turned off for it.

Before you start

One-time payments use the same payment provider you have already connected (Stripe, Paddle, Polar, or Dodo Payments). The provider is chosen globally on the plugin’s settings page, and every package inherits it – there is nothing per-package to choose here. If you have not connected a provider yet, set that up first using the relevant provider setup guide.

You will also need a non-recurring price for the package in your provider’s dashboard (for example, a standard one-time Stripe Price rather than a recurring one). More on that below.

Enabling one-time payment on a package

  1. Open the Listeo Subscriptions product settings. You will see two toggles:
  2. Enable recurring payments for this package – charges renew automatically.
  3. Enable one-time payment for this package – a single charge, no automatic renewal.
  4. Turn on Enable one-time payment for this package. If recurring was on, it switches off automatically – the two cannot both be active.
  5.  Notice that the Billing interval display field will be inactive. That is expected: a one-time purchase never renews, so there is no interval to show.
  6. Enter the provider price/product ID for this package, exactly as you would for a recurring package — but point it at your one-time (non-recurring) price. Both your test and live IDs use the same fields.
  7. Save the product.

On save, the plugin checks the price against the provider and confirms the amount and currency match your WooCommerce product price, just as it does for recurring packages.

Important: the price must be non-recurring

This is the one place where a mistake is easy to make. A one-time package needs a one-time price at the provider. If you accidentally map a recurring price to a one-time package, the plugin rejects it on save with a message like:

> The configured Stripe Price must be a one-time price (it currently recurs).

The fix is to create (or select) a non-recurring price in your provider dashboard and paste that ID instead. The currency and amount still have to match the WooCommerce product price – if they don’t, you’ll get a clear mismatch warning telling you both figures.

Webhooks

One-time payments rely on the same webhook endpoint you already registered for the provider, but they use payment events rather than subscription events. A couple of provider-specific notes:

Stripe – one-time packages paid with delayed/asynchronous payment methods also need the `checkout.session.async_payment_succeeded` and `checkout.session.async_payment_failed` events. If you set Stripe up with the full recommended event list, you already have these.

Dodo Payments — in addition to the subscription events, send `payment.succeeded` so one-time purchases are confirmed.

For Stripe specifically, a one-time purchase activates immediately when the buyer returns from checkout – the plugin reads the completed Checkout Session rather than waiting for the webhook. For the other providers, the purchase activates via the webhook a moment later. Either way, the buyer does not have to refresh and wait.

What the customer sees

The buyer goes through the same hosted checkout as any other package. After paying, the package is granted once and the listing follows your normal Listeo package rules (duration, listing limits, and so on) – it simply will not auto-renew.

The purchase won’t appear on My Subscription page, user will see it in Dashboard in Your Plans & Packages options.

From the admin side, the purchase shows in the Subscriptions list marked as One-time, so you can tell single purchases apart from renewing subscriptions at a glance.

Quick recap

Use one-time payment when a package should be paid for once and not renew. Turn on the Enable one-time payment for this package toggle (recurring switches off automatically), map a non-recurring provider price, and save. Your customers buy it through the same checkout, see it labelled as a one-time payment with nothing to cancel, and you manage everything from the same place as your subscriptions.