Analytics and cookies

We measure visitor behavior through Google Analytics 4. See details in our privacy policy

vosetu.

Subscription & Billing Systems

Managing subscription revenue is more than issuing invoices: upgrades, trials, usage limits and gating decisions come together in one engine. We run this engine live across our SaaS products.
Talk to an expert
Subscription & Billing Systems

Managing subscription revenue is more than issuing invoices

Recurring revenue looks simple but hides countless edge cases behind it: when a trial ends, how a mid-cycle plan upgrade is calculated, what happens when a card is declined, which user should see which feature. All of this has to live in one engine — plan, trial, usage limit and the gating decision defined in the same place, so that when a rule changes you edit one spot, not code scattered across screens. We aren't inventing this engine from scratch; it's the one already turning inside every one of our sector SaaS products.

The gating decision is an architectural principle for us: whether a feature is on or off for a given customer lives in one service, with the mapping held in a single constant. The gate's source might be a plan, a license or a trial period — when the source changes, only that source's adapter changes; an 'if' block never gets buried in a screen. We build your subscription system with this discipline; as you grow, adding a new plan or a new payment provider never means touching the core.

  • Plan, trial and usage limit in one engine
  • The gating decision lives in one service
  • A discipline running live in every one of our SaaS products
  • A new plan/provider means just a new adapter
A circular rail laid on the ground; a figure steps onto the ring through a small arch, another passes a crank a worker turns, a third steps off through a side gate, and a short path leads from outside that gate back onto the ring
A subscription is a loop, not a moment: trial, renewal, cancellation and return all ride the same rail.

The sub-services beneath the subscription engine

The invisible half of a subscription isn't the charge — it's the rule behind it.

Plan, package & trial management

Trial periods, plan upgrades/downgrades and prorated billing; subscription state is defined in one place.

Usage limits & feature gating

Which feature is on for which plan; the gate decision lives in one service, with no conditions scattered across screens.

Payment provider & virtual POS

We connect to the provider's secure flow and never hold card data ourselves — only a secure reference/token.

Failed charges & retry (dunning)

A declined card is retried automatically and the subscriber is notified in time; revenue doesn't quietly leak away.

Invoicing, e-invoice & tax

Invoice and receipt generation is designed to connect to e-invoice/e-archive systems; tax lines are calculated separately.

Reconciliation, revenue & payout reports

The provider's statement matches your own records line by line; revenue, refunds and pending collections show on one panel.

The lifecycle of a subscription

01

Trial

The user starts a trial; the gate opens according to the trial plan, and a reminder goes out before it ends.

02

Subscription

A plan is chosen, the first charge runs, and the gate is re-evaluated for the chosen plan — feature access updates instantly.

03

Renewal

Automatic billing fires at period end; if it fails, the retry flow kicks in and the subscriber is notified.

04

Cancellation

On cancellation, proration or a refund rule applies; the gate closes but past data is retained — coming back is always possible.

05

Win-back

A targeted reminder or offer goes to the churned user; the subscription cycle isn't closed — it's a gate that can reopen.

A huge vault with no handle, no door and no wheel on our side; a plain cream sealed packet is going in through its one narrow slot, and in the other hand of the worker posting it a teal token on a ring is held up — the only thing left on this side of the wall
Card data never enters our side of the wall — all we keep is the provider's token.

The engine's three parts

01

The gating engine

The decision of who has a feature turned on doesn't live in 'if' blocks scattered across screens — it lives in one service, with the plan-feature mapping held in a single constant. If the gate's source changes — a license instead of a plan, a quota instead of a trial — only that source's adapter changes; the interface layer stays untouched.

  • The gate decision in one service
  • Plan-feature mapping in one constant
  • Only the adapter changes when the source changes
A giant notched drum; a figure sets one key into a notch and the row of gates down the corridor re-latches itself to match
02

Payment provider integration

We build a secure flow with the virtual POS and provider API; card data stays in the provider's own vault, not on our side. Webhook notifications from the provider are verified with HMAC — a forged or duplicate notification never triggers a charge twice.

  • No card data stored, only a token
  • HMAC webhook verification
  • Protection against duplicate notifications
A plain wall panel with a single shaped port in its face; a rack beside it holds several differently shaped adapters, and as a figure lifts one out and slots another in, the machine seen in cutaway behind the wall keeps turning without pause, while a small seal press clamps the cable where it enters the wall
03

Invoicing & tax

Every charge becomes an invoice or a receipt; document generation is designed to connect to e-invoice/e-archive systems, and tax lines are calculated separately by plan and region. Revenue shows on the dashboard broken down by plan — you don't wait for a separate report to see how much each package brings in.

  • E-invoice/e-archive-ready document generation
  • Tax calculated by plan and region
  • Revenue-by-plan breakdown on the dashboard
A short counter with a small bank of drawers behind it; a figure takes the printed sheet emerging from the counter's slot while an identical copy has slid into the open drawer behind, which a second figure is pushing shut, and every drawer's label plate is blank

This engine is already running in our sector products

Subscription isn't only a SaaS panel's job; recurring revenue flows, in different shapes, beneath many of our products.

Finance & insurance

We built the subscription and billing engine, the payment flow and reconciliation in our finance/insurance product; on the pension/life-insurance side, premium and renewal tracking is another face of the same logic.

Enterprise work management

In our enterprise product family, modules turn on independently: you start with project tracking today and add HR and document management tomorrow — that module switch is the same gating logic.

Our mobile product family

Setting up in-app purchase and subscription flows in line with each platform's own rules is a standard part of our mobile-development service.

Our maintenance & SLA family

A monthly maintenance contract, SLA response time and a monthly hour pool for small development — itself a recurring service model.

A tall stamping press set over a long paper roll; one figure feeds the roll through, a rack of different dies hangs beside the press and another figure lifts one die out and slides a different one into the head, while stamped sheets stack neatly in a tray and the press never stops
When a tax rule changes you swap the die, not the press.

What ships as standard in every subscription setup

Recurring subscriptions and automatic billing
Trial periods, plan upgrades/downgrades and proration
Usage limits and a feature-gating engine
Virtual POS/payment provider integration with HMAC webhook verification
Automatic retry for failed charges (dunning)
E-invoice/e-archive-ready document generation
A revenue, refund and pending-collection dashboard
Post-launch maintenance and support with SLA

The technology we build on

Payments
  • Virtual POS
  • provider API
Engine
  • Plan + limit + gating
Backend
  • .NET 9
  • PostgreSQL
Security
  • HMAC
  • webhook verification
  • JWT
3 hafta – 4 ay
Setup timeline (scope-dependent)
One
One shared, layered core
Layered
service / bll / dal architecture
.NET 9
Modern core stack

Frequently asked

Do you store the card details?

No. Card data stays in the payment provider's vault; only a secure token/reference is kept on our side. Data you don't store is data you can't leak.

Can you work with more than one payment provider?

Yes. The payment provider is set up as an independent adapter; adding a new provider or switching between two doesn't touch the core gate/plan logic.

Does billing start automatically when the trial ends?

It depends on the rule — card details can be captured at trial start and billing can auto-trigger at the end, or the user can be asked to pick a plan when the trial ends. That's your product decision, not ours; the engine supports both.

How is a current subscriber's invoice calculated when a plan changes?

When an upgrade or downgrade happens mid-cycle, a prorated calculation runs based on the remaining days; the difference is applied to the next invoice or charged immediately — this behavior is configurable by rule.

Does it connect to a tax/e-invoice system?

Invoice and receipt generation is designed to connect to e-invoice/e-archive systems; tax lines are calculated separately by plan and region. We clarify together which official system you need to connect to.

Let's build your subscription engine together

We'll listen to your plan structure, payment provider and billing needs and map out where to start, together. The first conversation is non-binding.