How pricing works in Gaia: every product has a list price and a floor price. On any sale (OEM SO or Retail), the line auto-fills the last price this customer paid; the band ever sold is shown next to it. Staff cannot go below floor — it locks the line and requests owner approval.
Floor & list prices— owner-editable only
Product
Current cost
Floor price
List price
Margin @ floor
Updated
MYR
MYR
MYR
Customer price memory— what each customer actually paid; auto-fills their next order
Customer
Product
Last paid
Band (min–max)
Orders
Last order
Flag
MYR
Project Gaia — static mockup in Filament v3 idiom. No backend. Prices illustrative except the Double Root RM 5–8 band, which is the founder's real example. The BELOW FLOOR row shows the flag staff can't clear without owner approval.
Product price
Aiternanthere Sessillis Tea Bag
Not saved
Owner-editable only — staff see prices everywhere but cannot change floors (Filament policy; TextInputColumn hidden for non-owner).
variant_prices has one row per variant (UNIQUE).
Current cost
1.10MYR — live rolled-up BOM + operations · view item
Read-only — not stored here; the snapshot happens at quote / SO time.
MYR
Hard lock: any OEM SO or Retail line below this locks and pings the owner — the Double Root floor 5.00 / list 8.00 row above is the founder's canonical example.
MYR
SO NVMSB-0309 line 4 sells at 2.80 = list ✓
Margin @ floor = (2.00 − 1.10) / 2.00 = 45%
Recomputes live from cost + floor. Rendered amber when < 25% (cf. Kopi Cik Abang's 20% in the table above).
derived: latest so_line / retail_sale_line for (customer, variant)
so_lines
Band
TextColumn
money range
derived: min/max over sale history
—
Flag
Badge
derived
BELOW FLOOR when any historical price < floor; at-floor warning
—
Engine notes
Sale lines auto-fill last-paid for the customer+product; placeholder shows the band and floor.
Price < floor locks the line and creates an approval request (Filament action + notification to owner). Staff literally cannot confirm it.
The + Product price slide-over inserts one variant_prices row (variant_id UNIQUE) — options are variants without a price row yet; floor drives the below-floor line locks + approval_requests.
Customer price memory stays derived from sale history — this form never edits it.
No separate price-list documents v1 — the memory IS the price list. Formal per-customer contracted lists can layer on later using the same table.