Gallardo Propiedades
A real-estate platform for an agency in Córdoba: public property site and custom admin panel, two Next.js apps on one Supabase backend. Plus the story of a production incident I diagnosed and fixed.
Problem
The agency managed its listings by hand and had no web presence that reflected the business. It needed a public site clients could browse, and a panel its own staff (non-technical people) could use to manage properties, photos and inquiries without calling anyone.
Approach
Two Next.js applications share a single Supabase backend: the public site reads the catalog; the admin panel gives the staff full control over listings, photos and inquiries with zero code. Property photos are served from Cloudflare R2.
The incident
Months into production, the Supabase project was moving 6.46 GB of egress a month, wildly out of proportion for a small agency site. I traced the root cause: a public endpoint was fetching all four database tables, including years of accumulated inquiries, on every request, with caching explicitly disabled (cache: 'no-store').
The fix: a dedicated endpoint that returns only the fields the public site actually renders, plus Next.js revalidate caching so the catalog is served from cache and refreshed on an interval instead of hitting the database per visit.
Spec sheet
- Applications
- Two Next.js 14 apps, public site and admin panel, on one Supabase (Postgres) backend.
- Data model
- Four tables: properties, agency users, inquiries, and internal notes per inquiry.
- Read path
- The public site consumes an internal API exposed by the panel. Only the panel talks to Supabase directly.
- Catalog
- Filters by operation, category, city and price, plus a map view and per-property galleries.
- Media
- Property photos on Cloudflare R2, with no per-image egress cost.
- SEO
- Technical, in full: JSON-LD, dynamic sitemap, per-property Open Graph.
Outcome