Paywall / Products & pricing
Products & pricing
A product is the thing a buyer pays for — a lifetime licence, a subscription plan, an add-on. The Products tab is a three-pane editor: your product list on the left, the editor in the middle, and a live checkout preview on the right that updates as you type.
Create your first product
Click + Add
Pick the mode
Set the price
Flip it to Active and publish
Publish button in the top bar makes your changes live.Click + Add in the left list, fill the form, click Create product. The product opens in the middle editor with the live checkout preview on the right.
The free product — your free tier
Set a product's price to 0 and Onelo treats it as your free tier. It behaves differently from a paid product in three ways:
| Behaviour | What it means |
|---|---|
| No card needed | Buyers claim it with one click — the button reads “Get started free” and there's no payment step. |
| It\'s the landing spot | With the “Enroll in free tier” outcome on (Customer portal), anyone whose subscription ends or who refunds their last purchase is moved here automatically — instead of being locked out. |
| Without one, there\'s no soft landing | No free product = a buyer who cancels or refunds ends up lapsed (paid features locked) until they buy again. |
Turning the paywall on — “Plan required”
The master switch — the Access Gate — sits on the Store tab: “Plan required”. It is more than a sign-up gate: it is what enables the store at all, and it applies on sign-IN too — a returning customer whose plan lapsed meets the same gate. With it on, a second choice appears underneath: whether people may buy inside the app or only on your website.
| State | What happens |
|---|---|
| ON | The store is live and the app is gated. On sign-in OR sign-up, any user with no active plan is routed to the store to buy first (they can pick a paid plan or claim a price-0 free product); users who already have an active plan go straight in. onelo.paywall.openStore() also works from your own buttons. |
| OFF | No gate — everyone who creates an account (or signs in) goes straight into the app. It's a free app with login: there's no store and nothing to buy. onelo.paywall.openStore() returns paywall_not_enabled and the hosted /buy page 404s until you turn this ON. |
Pricing options that sell
| Option | What it does | Where it shows |
|---|---|---|
| Annual price | Second price for yearly billing (subscriptions) | Monthly/annual toggle + “Save X%” pill on the store |
| Trial period | Days before the first charge (subscriptions). One trial per buyer per product — ever: a user (or email) who already redeemed a trial won't get another, even after cancelling. | Checkout shows “then X/month after trial” |
| Access duration | “Lifetime” or N days of access (one-time only) | Access expires automatically; subscriptions follow their billing cycle |
| Scheduled sale | Discounted price with a start/end date (timezone-aware) | Old price struck through on the store card; optional countdown timer shows at checkout |
Turn the toggle on, enter the sale price and the active date range (timezone-aware), and optionally enable the countdown timer. The preview shows the struck-through old price right away.
The editor’s other sections
Each product expands into focused sections. You'll touch the first two often; the rest are set-and-forget:
| Section | What you configure |
|---|---|
| Overview | Store-card content: badge text (“Popular”), button text, feature list (+ included / − excluded), footer note, accent color. |
| Pricing & Discounts | Price, currency, billing interval, trials, scheduled discounts and promo codes. |
| Tax & Checkout | Per-product price mode — Gross (inclusive) vs Net (+ VAT) — the VAT rate (standard/reduced per your country), billing address / VAT-number collection, marketing consent. Tax fields are hidden entirely if you're VAT-exempt. The engine itself is chosen in Tax & Invoicing. |
| Refunds & Legal | Refund window in days (or inherit the app default) and self-serve refund opt-in. |
Gross vs Net — and what each buyer actually sees
In the Tax section of each product you choose how the price you typed should be understood:
| Mode | Meaning | Typical for |
|---|---|---|
| Gross (inclusive) | The price you typed is the final price. VAT is carved out inside it — every buyer pays the same number. | Consumer apps (B2C) — clean, predictable prices like €9.99 |
| Net (+ VAT) | The price you typed is before tax. VAT gets added on top, based on where the buyer is. | Business tools (B2B) — companies think in net prices |
| Inherit from app | Follows your app-wide default (Gross unless you changed it). | Most products — set it once, forget it |
| Situation | What the store shows |
|---|---|
| Gross product, any visitor | Your price, unchanged — same for everyone. |
| Net product, visitor in the EU/UK | Your price + that country's VAT, already included. |
| Buyer outside the EU/UK (any product) | Checkout is blocked — Onelo sells only within your configured sales region, at widest the EU + UK (“Sorry — this product is only available in the European Union and the United Kingdom.”). UK buyers additionally require YOUR UK VAT registration — without it they're blocked even on EU + UK reach. The store preview for such a visitor shows the price with your own country's VAT. |
| Your app sells to businesses only | Net prices shown as-is — companies expect net. |
The store uses the visitor's location for the preview; the final amount is confirmed at checkout from the billing country they enter. A business buyer who adds a valid VAT number sees the tax drop to 0% (reverse charge) right on the payment form.
Discount codes
Each product can have its own discount codes. Buyers redeem them at checkout via a “Have a discount code?” link.
Click + Create code. Type a code or hit Random to generate one, pick Percent off or Fixed amount off, set the value — and optionally Max uses, an Expires at date, and One use per user (on by default).
| Setting | What it does |
|---|---|
| Percent / Fixed | 20% off, or a flat amount like €5.00 off. |
| Max uses | Total redemptions across all buyers. Empty = unlimited. |
| Expires at | The code stops working after this date. Empty = never. |
| One use per user | Each signed-in buyer can redeem the code once (enforcement is keyed to the buyer's account). |
| Deactivate / Delete | Pause a code without losing its stats, or remove it entirely. |
The codes table shows each code's usage (“12 / 100”), expiry and an Active/Inactive badge — so you always know what's still running.
Test it before you charge anyone
Use the live preview
Make a test purchase
4242 4242 4242 4242 (any future date, any CVC). Then confirm access was granted and the receipt/invoice looks right.Limits
| Limit | Value |
|---|---|
| Products per app (Free plan) | 3 — higher plans raise the cap |
| Currencies | USD · EUR · GBP · PLN · CAD · AUD |
| Refund window | 0–365 days per product, or inherit the app default |