Skip to content

Monetization · TVOD

Rentals, purchases and tickets to a live event

A viewer who will not take a subscription will often pay for one film or one match. The platform has a complete path for that — a price resolved server-side, a window that expires, and a settlement that cannot double-charge.

Three things can be bought once

A title can be rented, which grants access for a window measured in hours and then stops. A title can be bought outright, which grants access with no expiry. A live event can be ticketed, which grants access for the window the event itself defines. All three are the same code path with different answers from the service that owns the item.

Prices are columns on the item, not constants in the platform. A title carries a rental price and a purchase price in taka, an optional pair in dollars, and a rental window in hours, all editable through the admin write path. A title with no rental price set is refused rather than defaulted to zero — a zero-priced checkout would hand the film out for nothing, which is the kind of default that is discovered by an audience rather than by a test.

An event that has already finished cannot be ticketed. The check happens before the payment session rather than at the entitlement gate, because taking money for access that can never be used is the failure worth preventing rather than detecting.

Process

What happens at checkout

Five steps, and the reason each one is there.

01

The request names an item, never a price

A checkout says which title or event and what is being bought. It does not say what that costs, so a client that posts its own amount changes nothing.

02

Anything already owned is refused

The platform checks whether this account can already watch this item and returns a conflict if so. Without that step, a viewer who double-submits pays twice for one rental.

03

The price and the window are resolved server-side

Billing asks the service that owns the item — the catalogue for a title, the live service for an event — immediately before the payment session is created, over HTTP rather than by reaching into another service's database.

04

A pending record is written, then the gateway session opens

The pending row is kept even if the gateway call fails, because it is the record that a checkout was attempted and it is what lets a later callback still settle it.

05

Settlement happens once, under a row lock

The payment notification settles the purchase inside a locked read, so one validated payment settles at most one transaction. A verification playbook reads the deployed source and fails if that lock is missing.

The one thing outstanding, stated plainly

The table this path writes to, entitlement_purchases, is created by no migration in the repository — the four other billing tables are. The code is deployed and the settlement lock is verified, but on a fresh estate the purchase path is one piece of schema away from running. It is therefore commissioned during deployment rather than switched on, and this page will not say 'available today' until that migration exists.

Specification

What the path covers

CapabilityStatusDetail
Rent a title, with an expiry windowBuilt — commissioned at deploymentWindow from the title's own hours column; 48h fallback
Buy a title outrightBuilt — commissioned at deploymentNo expiry; refused if no purchase price is set
Ticket a live eventBuilt — commissioned at deploymentPriced and windowed by the event; finished events refused
Per-title prices, editableShippingReal columns on the catalogue with an admin write path
Double-purchase protectionBuiltExisting entitlement returns a conflict before checkout
Idempotent settlementBuilt and verifiedRow-locked; asserted by a verification playbook
Entitlement read-backBuiltPer item, and a purchase history per user
Refunds and chargebacksNot builtNo refund path exists in billing
Gifting, bundles, season passesNot builtNo code anywhere

Questions

Questions

Can a subscriber also buy a pay-per-view event?

Yes. A subscription entitlement and a purchase entitlement are independent grants and playback asks both, so a subscriber buying a match is a normal case rather than an edge one.

What happens when a rental expires?

Access stops because the expiry timestamp has passed. Entitlement is a comparison against that date rather than a flag a job has to clear, so there is no window in which an expired rental keeps working.

Can I refund a purchase?

Not through the platform today — there is no refund path in billing. A refund is issued at the gateway, and reconciling that back into the entitlement is a build.

What exactly is outstanding before I can sell a ticket?

One database migration creating the purchases table. The application code, the pricing resolver, the double-purchase guard and the locked settlement are deployed and verified; the schema for the table they write to is not in the repository, so it is created as part of commissioning.

Selling a match or a premiere?

Event ticketing is the one that usually has a date attached. Tell us the date and we will tell you what has to be commissioned before it.