Golf Cart Dealership

Icon Golf Carts of Tampa Bay

A custom dealership website backed by a full custom admin and inventory system for a golf cart and LSV dealer with showrooms in Largo, Pinellas Park, and Sarasota. Staff manage every cart, photo, window sticker, and customer from a private backend we built from scratch.

Next.jsSupabaseCustom Admin BackendInventory SystemClient-owned backend
Icon Golf Carts of Tampa Bay website screenshot
Overview

The project

Icon Golf Carts of Tampa Bay is a golf cart and street-legal LSV dealer with showrooms in Largo, Pinellas Park, and Sarasota, carrying ICON, EPIC, Conquest, Honor, and Verdi. With inventory moving daily across three locations, they needed far more than a brochure website. We designed and built a full custom backend from the ground up: a private admin system where their team runs inventory, photos, pricing, window stickers, customers, appointments, and service tickets. Every change made in the admin shows up on the public website the moment it is saved, so the site always matches what is actually on the lot. No off-the-shelf dealer software in the middle - the entire system was built around how their team works. The dealer owns the code and the backend outright.

What we built

  • A client-owned backend built around how the dealer's team works
  • Full custom admin backend built from scratch on Next.js and Supabase, behind a private, invite-only login with role-based team accounts
  • Custom inventory management system for adding, editing, and retiring carts with year, make, model, color, pricing, stock numbers, and per-location quantities across all three showrooms
  • Live public inventory that updates the instant staff save a change, with search and filters by location, year, make, model, color, and availability (available, pending hold, sold)
  • Listing photo manager with one-click ZIP downloads of a cart's full photo set
  • Printable window stickers generated straight from inventory data, each with a QR code linking to the live listing, plus batch printing for the whole lot
  • Reusable spec templates and vehicle type management so new listings go up fast and stay consistent
  • Built-in CRM with customer contacts, activity history, appointment booking, service tickets, and CSV export
  • Showroom pages for Largo, Pinellas Park, and Sarasota, plus service, financing, and Google reviews sections on the public site

How we approached it

A dealership with inventory changing daily across three showrooms cannot rely on a site that has to be updated manually, page by page. We started from the team's workflow instead: how a cart is added, photographed, priced, held for a customer, and sold. The admin system mirrors those steps, so staff do the work once and the public listing, the window sticker, and the customer record all stay in step.

The backend runs on Supabase behind a private, invite-only login with role-based team accounts. The public site reads from the same data, which is why a change saved in the admin shows up on the website right away. Because the dealer owns the code and the backend outright, there is no off-the-shelf dealer software sitting in the middle.

The public website

The public site is built to get a shopper to the inventory quickly. The home page opens with a clear statement of who the dealer is, a golf cart and LSV dealer in Largo, Pinellas Park, and Sarasota, and a Browse Inventory button, while a phone button in the header invites shoppers to talk carts. The main navigation keeps the rest simple: Inventory, Service, Finance, About, and Contact.

Each of the three showrooms gets its own section on the home page and its own showroom page with hours, so a customer in Sarasota is not sent to a Largo address. Real Google reviews from customers appear on the home page with a link to read more, which puts social proof in front of shoppers before they ever visit a showroom.

Inventory that stays accurate

The inventory system is the heart of the project. Each cart is recorded with its year, make, model, color, pricing, and stock number, along with the quantity at each of the three showrooms. Staff can mark a cart available, on a pending hold, or sold, and the public listing reflects that status the moment it is saved.

Shoppers can search and filter by location, year, make, model, color, and availability, so they can narrow a large lot down to the few carts that fit. Reusable spec templates and vehicle type management keep new listings consistent, so a new arrival can go from the truck to the website without starting from a blank form.

Photos, stickers, and paperwork

Photos are managed in the same admin, with a one-click ZIP download of a cart's full photo set when a team member needs it. Window stickers are generated straight from inventory data, so the price and specs on the sticker always match the listing.

Each sticker carries a QR code that links to the live listing, and stickers can be printed in batches for the whole lot. That closes the loop between the showroom floor and the website: a customer standing next to a cart can scan the code and see the same information online.

Customers, appointments, and service

The built-in CRM keeps customer contacts and their activity history in one place, along with appointment booking and service tickets. The team can export records to CSV when they need them somewhere else.

Access is controlled with a private, invite-only login and role-based team accounts, so people see the tools that fit their job. The whole system runs on Next.js and Supabase, and because the dealer owns the code and the backend outright, it can grow with the business instead of being limited by a vendor's product.

Built to the same standards as every project

Every Ctrl Shift Run website is custom built from the ground up in Next.js and TypeScript, with no templates or page builders. Each build targets green PageSpeed Insights scores on mobile and desktop, plus 3/3 on the agentic browsing check, and is structured so search engines and AI assistants can read it. The code lives in the client's GitHub repository and the domain stays in their name.