Desinfecciones Mendoza Control - Site and inquiry back office for a pest-control company
A site I designed and built for a pest-control and disinfection company in Guaymallén, Mendoza. A pest guide, zone pages, direct contact on WhatsApp and an admin panel, built with Next.js, Clerk and Drizzle.
Desinfecciones Mendoza Control is a licensed pest-control and disinfection operator based in Rodeo de la Cruz, Guaymallén, Mendoza. It has two kinds of customers: residents searching on their phone, often at night, and commercial buyers such as restaurants, hotels and wineries. The goal was more work from local organic search. The old site carried claims nobody could back: invented testimonials, logos of big brands that were not clients, a made-up rating and review count, and a wrong phone number. I removed all of them. This is client work: I did the design and the development end to end.
What I built
A public site with a guide to 12 pests, each on a numbered "Ficha de la plaga" (specimen card) from I to XII, plus 2 service pages (disinfection certificate and school disinfection): 14 service pages in total. On top of that, 10 zone pages across Gran Mendoza, promotions pages and an FAQ. Each card tells the pest's size, where it lives, when it is active and which treatment fits. WhatsApp links carry a prefilled message naming the page the visitor came from. On mobile there is a fixed bottom action rail with WhatsApp and Call, and an "open now" badge computed on Mendoza time (open every day from 06:00 to 23:30).Behind it, a back office at protected with Clerk and an admin session claim. An inquiries list and detail view, promotions with a start/end window, an active flag, priority and a banner option, and a dashboard with charts, a funnel and a promotions calendar. The copy is in Spanish.
Design decisions
"The entomological plate": a 19th-century specimen plate. The rule is one ink, one paper, one signal. Bodoni Moda for large display only, IBM Plex Sans for body and IBM Plex Mono for uppercase annotations. A single vermilion signal color, reserved for actions and live status. 1px hairlines instead of shadows, 2px radius. Specimens are shown at actual size in millimetres with a ruler, next to a 12-month season band. Pest photos sit on white and are multiplied into the paper; stock field photos are printed in greyscale ink and never captioned as the company's staff. Light theme only.
Engineering decisions
Claims you cannot back fail the tests. With Vitest, copy guards fail the suite if banned terms, unsupported claims or wrong contact facts appear in the text. That is how the old site's problem stays out: an invented testimonial or a mistyped phone number never reaches production. There are also tests for the inquiry workflow transitions, the promotion rules and the dashboard stats, including the Mendoza UTC-3 week boundary.Domain kept apart from the framework. Domain and use-case code lives separately from Next.js, Clerk and Drizzle. Postgres with Drizzle stores the inquiries (with status and UTM), the promotions, an audit log of inquiry events and the consents.Publishing. Pages are ISR with a 15-minute window, and a secret-protected endpoint revalidates promotions immediately as soon as one is published. If the database is unreachable, the public site falls back to two seeded campaigns instead of breaking.SEO. JSON-LD (hours, geo, areas served, offer catalog), , , and for promotions. Deliberately no markup. An image sitemap, generated Open Graph cards for home, services, zones and promotions, and AVIF/WebP images.Measurement and delivery. GA4 events for WhatsApp, call, form and review taps. The Docker image is built on node:20-alpine and runs as a non-root user, deployed on Dokploy.