Dev iconDevSep 14, 2026 ~1 min source read

MobileTopUP: Modeling Airtime, Data, and Bundles Without a Messy Product Schema

This article looks at a practical way to model operator-provided prepaid products without creating either an enormous table full of nullable columns or an unstructured JSON blob that becomes impossible to query. Product A Price: 10 EUR Recipient receives: 10 EUR airtime Product B Price: 10 EUR Recipient receives: 8 GB data for 14 days The purchase price is the same.

MobileTopUP: Modeling Airtime, Data, and Bundles Without a Messy Product Schema

Share this story

Send the public story page.

Useful takeaways from this story.

This article looks at a practical way to model operator-provided prepaid products without creating either an enormous table full of nullable columns or an unstructured JSON blob that becomes impossible to...

Product A Price: 10 EUR Recipient receives: 10 EUR airtime Product B Price: 10 EUR Recipient receives: 8 GB data for 14 days The purchase price is the same.

A schema should therefore avoid assuming that: purchase_amount == recipient_amount A useful base model might begin with: products -------- id provider_id external_product_id operator_id country_code...

Building the complete brief

The page is ready to read now. The fuller skim-friendly version will appear here automatically.

The useful part

This article looks at a practical way to model operator-provided prepaid products without creating either an enormous table full of nullable columns or an unstructured JSON blob that becomes impossible to query. Product A Price: 10 EUR Recipient receives: 10 EUR airtime Product B Price: 10 EUR Recipient receives: 8 GB data for 14 days The purchase price is the same. At that point, amount is no longer a product model.

What to take from it

At that point, amount is no longer a product model.

Details worth keeping

A schema should therefore avoid assuming that: purchase_amount == recipient_amount A useful base model might begin with: products -------- id provider_id external_product_id operator_id country_code product_type display_name purchase_amount purchase_currency recipient_value recipient_currency active For general airtime: <s...

Keep reading in the app

Open the app view to save this story, compare related coverage, and continue from the same source.

Open in app