SeRental
Camera hire with live availability and one discount grid
- Industry
- Camera and lighting rental
- Year
- 2026
- What we did
- Storefront design and development
- Live
- serental.com.ua
- Site languages
- UK

- Items in the catalog
- 153
- Equipment categories
- 13
- Business types the platform serves
- 7
Overview
SeRental rents out cameras, lenses, lighting, sound and stabilizers in Ivano-Frankivsk, from one day. The storefront is a Next.js site with no database of its own: every item, price, category and checkout option comes from the CMS over its API.
- 1–3 days×1.0
- 4–7 days×0.9
- 8–14 days×0.8
- 15+ days×0.7
Applies to the whole shop, a category or a single item.
- 01Pick datesbusy days greyed out
- 02Checkagainst real bookings
- 03Reservationphone and Instagram
- 04Manager confirms
01 — Challenge
Hire is not retail. The same lens is free next week and gone tomorrow, the daily rate drops the longer you keep it, and two people can try to book one unit at the same moment. The shop also wanted one discount ladder for 153 items, and a manager who knows who is renting before anything leaves the shelf.
02 — What we built
The basket books the whole kit for one period and checks it against real reservations as soon as dates are picked, greying out days an item is already taken. Discounts are one grid of multipliers — ×1.0, ×0.9, ×0.8, ×0.7 by length of hire — addressed to the whole shop, a category or a single item. In the database, overlapping bookings of one unit and overlapping price bands are both refused by Postgres exclusion constraints rather than by code that can race.
03 — Result
A storefront the owner runs from the admin: items, prices, the discount grid, delivery and payment options change on the site without a deploy, because the admin purges the site’s cache when content changes. Every request arrives as one pending reservation with the renter’s phone and Instagram, ready for the manager to confirm.
Catalog and filters
Filters come from the characteristics the operator records in the admin — mount, sensor format, lens type, focal length, aperture, stabilization — alongside brand, price and availability. Brand and spec options show how many items they hold, so it is clear what a click will leave.
- Brand, price band and “free now” beside the item specs
- Range sliders for focal length and aperture
- On a phone, filters and sorting sit in a dock at the bottom
Item page
The page answers three questions: what it is, what a day costs, and what goes out with it. Booking is deliberately not here — the item goes to the basket, where dates, handover and payment are chosen once for the whole kit.
- Daily rate plus the four-band ladder, in hryvnias
- Specs from the admin, not from a description
- “Goes out with it”: lenses, batteries and cards for this body
Discount grid
One grid of multipliers prices every item: ×1.0 for 1–3 days, ×0.9 for 4–7, ×0.8 for 8–14 and ×0.7 from 15. It is written once and applied to whatever base rate an item has, from 50 UAH grip gear to full-frame cameras.
- Addressed to the whole shop, a category or a single item
- Overlapping bands are refused by the database
- The basket states the discount in money, not just a percentage
Basket and booking
One period covers the whole kit. Availability is checked against real reservations once dates are chosen, the discount is spelled out in money, and the request becomes a single pending reservation the manager confirms or cancels as a unit.
- The calendar greys out days an item is already booked
- Quantity stops at the number of units the shop owns
- Phone and Instagram required, so the manager knows the renter

Key decisions
- Overlapping bookings of the same unit are refused by a Postgres exclusion constraint over time ranges; pooled stock is counted under a row lock.
- Price bands in a discount grid cannot overlap either — the same constraint technique, so a price never depends on row order.
- When dates clash, the site reports which items were wanted and already taken, feeding the owner’s “worth buying a second one” view.
- Card prepayment is wired end to end — hand-off to the acquirer, status check on return, refund when a paid booking is cancelled — and switches on from the admin.
