CYMaps
Billboard inventory, availability and campaign booking on a map, for Cyprus
My role: Full-stack developer: Laravel API and admin, React map dashboard, PDF campaign reports, hosting.

In production for an outdoor-media company in Cyprus. Client name shown only with their agreement. Screenshots were taken on a test account with the client's permission.
Overview
A platform for planning outdoor advertising campaigns. Every billboard in the country is a pin with photos, specs, supplier, price and an availability calendar. Media planners filter the inventory, drop signs into a project, check date conflicts, share a live proposal link with the client, and print a campaign report.
The problem
Outdoor media planning was done from photos in emails and availability in phone calls. Nobody could see, on one map, what was free for a date range, near which points of interest, at what price.
The solution
A Laravel 9 backend exposes the inventory, clients, projects, bookings and suppliers through a token-authenticated API and still serves the legacy admin. A React dashboard puts everything on Google Maps with filters, points of interest from Google Places, project management, date-range booking with conflict checks, shareable public proposal pages, and an in-browser PDF report generator with Greek typography.
Principal features
Map-first inventory
Filter by type, size, lighting, supplier, tags, price and availability; measure distances; find signs near POIs.
Projects and proposals
Build a campaign from selected signs, rename, merge and clone projects, and share a public read-only link.
Availability and bookings
Date-range availability per sign, blocked dates, shortlists and booking enquiries.
Campaign PDF report
A branded Outdoor Campaign Report generated client-side with maps, photos and tables.
Sign lifecycle
Approval workflow for new signs, image upload and ordering, supplier management, audit logs.
Exports
Excel exports and print views for planners who still work in spreadsheets.
Technical decisions
- Kept the existing Laravel domain model and added a Sanctum API beside the Blade admin, so the client could migrate screen by screen instead of in one risky cut-over.
- Server-side pagination and filter endpoints keep the map responsive as the inventory grows.
- PDF generation runs in the browser (jsPDF with an embedded Noto Sans face) to avoid a headless-Chrome service on a small host.
Screens


More Web Applications
Gym & Leisure Centre Platform
Members, bookings, payments, payroll and turnstiles for a live club in Cyprus
View projectAd Spend Intelligence Platform
Media-expenditure analytics across TV, radio, web, outdoor, press and magazines
View projectFine Service Management
An ERP for a services company: accounting, projects, inventory, people
View project

