Pricing structure
How G-Starlink prices its products, both retail and wholesale.
Two pricing models
Retail
One price per SPU, visible on Shopify / Amazon / eBay. Stored in products.retail_price_aud, retail_price_usd, retail_price_eur. Changing it requires updating the channel listing.
Wholesale (B2B)
Tier-based, with quantity breaks inside each tier, plus customer-specific overrides when needed.
Customer tiers
| Tier | Who qualifies | Typical discount vs retail | Approval |
|---|---|---|---|
| Retail | End consumers | N/A (this is the list price) | Automatic |
| Tier 3 | New or small resellers (< 500/month) | ~20% off retail | CS lead |
| Tier 2 | Regular resellers (500–2000/month) | ~35% off retail | CS lead |
| Tier 1 | Top resellers (> 2000/month, strategic) | ~45%+ off retail | Ray |
These are directional — actual percentages vary per SKU based on our cost. Real prices live in Supabase.
Quantity breaks
Within each tier, larger orders get lower unit prices. Typical structure:
| Tier | min_quantity | Notes |
|---|---|---|
| All | 1 | Base tier price |
| All | 100 | First volume discount |
| All | 500 | Mid-volume |
| All | 1000 | Bulk |
Not every SKU has breaks at every level — depends on our cost structure.
Customer-specific pricing
Some top resellers have negotiated prices that override the tier. Examples of legitimate reasons:
- Annual volume commitment. “We’ll buy 5,000 units of SKU X in 2026” in exchange for a locked price
- Strategic partnership. Reseller helps us enter a new market; we lock a favorable price for 6 months
- Competitive match. Reseller has another supplier at price Y; we match Y to keep them
Illegitimate reasons (don’t do these):
- “They’re a nice person”
- “They asked for a discount and I didn’t want to argue”
- Trying to save a relationship that’s already lost
Governance
- Every customer-specific price must have a
reasonfield filled in with the contract number or written rationale valid_tois mandatory — no indefinite overrides- Ray reviews all customer-specific prices quarterly; anything expired or no-longer-justified gets removed
- New Tier 1 customers require Ray’s explicit approval. Tier 2 and 3 can be approved by the CS lead.
Price changes
Changing a price goes through valid_from / valid_to:
- Existing row: set
valid_toto yesterday (don’t delete) - Insert new row with
valid_from= today and the new price
This preserves history. If we ever need to audit what a customer should have paid on a given date, we can reconstruct it.
Retail price changes additionally require syncing to Shopify, Amazon, eBay. Not automated yet — manual for now. See Tech backlog.
Related
- Data model spec — table structure and lookup logic
- Operations / B2B — how pricing flows through the reseller process