Rent A Screen
Billboard trucks booked and paid for without a phone call.
You pick a city and a 4 to 8 hour slot, pay by card, and upload your ad. Operators approve each campaign from one console.
- Client
- Rent A Screen
- Industry
- Out-of-home advertising / mobile LED billboards
- Region
- United States
- Engagement
- Web app · Customer booking portal · Admin operations console
Rent A Screen runs a fleet of truck-mounted LED screens. Businesses and event organizers rent them by the hour to show their ads in specific cities. Each booking used to run on phone calls and email: which truck was free, which day, who had paid, where the artwork was. Nobody had one clear view of it, so double-bookings and payment mix-ups were always a risk. Hashlogics built the platform that moved the whole booking online.
The problem we set out to solve.
Customers couldn't see which screens and time slots were free without contacting the team.
Nothing stopped two customers from booking the same truck for the same hours.
Payment happened offline, with no link between a payment and its booking.
Ad artwork often arrived in the wrong size or format and had to be chased.
Refunds for rejected or cancelled bookings were done by hand and were easy to get wrong.
Trucks, cities, operating hours, and days off weren't managed in one place.
What success needed to look like
- A customer books, pays, uploads, and gets approved without help from staff.
- One screen is never booked twice for the same hours.
- Every change in booking status sends an email.
- An admin can reject a booking and refund it in one click.
- Each code push passes lint, tests, a build, and a SonarQube scan.
How we delivered it.
- 01
Map the booking before the screens
We wrote down the booking journey, every booking status, the pricing rules, and what admins needed.
- 02
Design both sides as one product
The customer booking flow and the admin console were designed together, in light and dark themes.
- 03
Let the server decide
Before Stripe opens a checkout, the server checks the slot again and works out the price itself.
- 04
Tie each payment to its booking
Stripe webhooks confirm a payment or its expiry and update the booking. Each event is signature-verified and processed only once.
- 05
Test on every push
41 automated test files, SonarQube analysis, and Stripe test-mode payments ran next to manual QA rounds.
- 06
Watch it in production
Sentry tracks errors, and Uptime Kuma polls a health endpoint that checks 6 services.
What we built.
Rent A Screen is one web platform with two sides: a customer portal and an admin console. As a customer, you choose a city, a date, and a start time, and hours that are busy or blocked never show up as options. You pick a duration of 4 to 8 hours and a free screen unit. Then you say where the truck should park and choose your own power or the on-site generator. Bookings open up to 90 days ahead, and the price updates as you go.
Payment comes first. A booking isn't confirmed until you've paid by card, and an abandoned checkout gives the slot back after 30 minutes. Once you've paid, you upload your ad creative for review. An admin then approves it, asks for new photos, or rejects it, and a rejection refunds your card automatically. Card details stay with Stripe and never reach the platform.
- Availability checkBusy and blocked hours are hidden from the customer.
- Server pricingThe server re-checks the slot and sets the price.
- Stripe paymentA webhook confirms the payment or its expiry.
- Creative uploadFile type, size, and dimensions are checked.
- Admin reviewApproved and confirmed, or rejected and refunded.
From payment onward, each step updates the booking status and sends an email, so nobody has to follow up by hand.
Tech stack
- React 18
- TypeScript
- Vite
- Tailwind CSS
- React Router
- TanStack Query
- TanStack Table
- Supabase PostgreSQL
- Supabase Auth
- Supabase Storage
- Supabase Edge Functions
- Vercel
Integrations
- Stripe Checkout
- Stripe webhooks
- Stripe refunds
- Email via SMTP (Brevo), SendGrid, or Resend
- Sentry
- Uptime Kuma
Testing and delivery
- GitHub Actions
- Jest
- React Testing Library
- SonarQube
- ESLint
- Prettier
- Husky
The hard part of a booking platform is the gap between a slot that looks free and a card that has been charged. Two customers can want the same truck for the same hours. A checkout can be abandoned halfway, and a payment notice can arrive twice. So the server checks every slot again before it takes payment, and an unpaid hold lapses after 30 minutes. On Rent A Screen, payments and refunds are built so that a retry is safe.

