Add-ons are anything you sell alongside the rental — helmets, locks, child seats, delivery, insurance. They appear in the walk-in wizard and on the public booking page, get charged with the reservation, and show up as line items on receipts.
Configure them at Shop Rentals → Add-ons.
Categories
Every add-on belongs to one of six categories. The category drives display tone (color in the catalog) and sometimes UX behavior:
| Category | Use for | Example |
|---|---|---|
safety | Helmets, knee pads, lights | Bicycle helmet |
accessory | Locks, baskets, child seats | U-Lock |
service | Tune-up, delivery setup | Pre-rental tune-up |
delivery | Delivery to address | Delivery (3 mi radius) |
insurance | Damage protection plans | $10 damage coverage |
other | Anything else | Tour map |
Categories are display-only — they don't affect pricing or inventory math.
Bookable vs. unlimited
The most important decision per add-on: is it bookable?
- Bookable — you have a finite inventory. The system tracks usage across overlapping reservations and refuses to oversell.
- Not bookable — unlimited supply (services, insurance, digital items).
For a 10-helmet shop, mark Helmet as bookable with quantity_total = 10.
If five overlapping reservations have each booked 2 helmets, the next
reservation that asks for a helmet gets available: 0.
For services like Damage Insurance, leave bookable unchecked — you can sell as many as customers want.
Pricing semantics
Add-on prices are per-unit, fixed. There's no per-day pricing on add-ons today.
If you want a "$10/day insurance" add-on, the customer pays $10 once per reservation, not $10 per rental day. You can work around this by either:
- (a) folding the daily charge into the base rental rate
- (b) creating multiple variants ("Insurance — 1 day," "Insurance — 7 days")
Most operators just charge a flat per-rental price; customers don't notice the difference.
Quantity per reservation
Customers can buy multiple of the same add-on (e.g., 2 helmets for a
couple). The walk-in wizard and public booking page expose +/- quantity
buttons. The total for that line is quantity × price_cents.
Snapshot behavior — important
When an add-on is added to a reservation, the system snapshots the
current name, category, and currency into the reservation_addons
row. This means:
- If you rename "Helmet" to "Bicycle Helmet" later, existing receipts still say "Helmet" — historical accuracy is preserved.
- If you raise the price from $5 to $7, existing reservations stay at $5; only new bookings see $7.
- If you delete (deactivate) an add-on, existing receipts still render.
This matches how pricing_snapshot works on the reservation itself.
Editing and deleting
- Edit any field at any time. Only new bookings see changes.
- Delete soft-deletes by setting
deleted_at. The add-on disappears from the catalog but historical receipts remain valid. - Deactivate (uncheck Active) hides the add-on from new bookings without deleting. Use this for seasonal items.
Sort order
Each add-on has a sort_order integer. Lower numbers appear first.
The walk-in wizard and public page render in this order. We recommend:
- Safety first (helmets) — usually required
- Common accessories (locks, lights)
- Optional accessories (child seats)
- Services (delivery, tune-up)
- Insurance (last — customers decide after seeing the total)
Image URLs
The image_url field is shown on the public booking page (rendered
above the price). It's optional but helps conversion — customers who
can see the helmet are more likely to add one. Use a public HTTPS URL,
not a local file.
Bulk add-on operations
There's no bulk-edit UI today. To run a price change across multiple add-ons (e.g., 10% increase across the board), use the database editor with a SQL update, or edit them one at a time.
Common configurations
- Bike shop minimum — Helmet (bookable), U-Lock (bookable), Damage Insurance (unlimited)
- Family shop — add Child Seat (bookable, low qty)
- Tour shop — add Tour Map ($2, accessory) and Pre-rental Tune-up ($15, service)
- Delivery shop — add Delivery (variable price, delivery category) with bookable unchecked
Add-ons in checkout
For how add-ons appear at checkout (walk-in and public booking), inventory cap enforcement, and per-rider quantity limits, see Selling add-ons at checkout.