Company Website for a Design-Build Contractor
Nine routes live with an email-first lead pipeline, WhatsApp fallback, and CI-enforced media budgets

- Design-build contractor
- Company Website
- Semarang, Indonesia
- September 23, 2026
Screenshots

The image could not be loaded.

The image could not be loaded.

The image could not be loaded.
⚠ This case study is anonymised at the client’s request. The company name, domain, and project identities are not published. What is described below is the engineering scope of the work.
The problem
The client is a design-build contractor in Semarang whose portfolio of finished work had lived entirely in WhatsApp chats and word of mouth. They needed a site that does two things at once: present completed projects properly, and capture survey requests from prospective clients without any going missing.
What we built
A static Astro site on Cloudflare Workers, nine routes with Indonesian slugs throughout:
- Home with a scroll-scrubbed build-sequence hero, followed by a scope stage, an RAB document section, and an interior deck.
- Services as an interactive scope showcase, and About, which lays four acts over one continuous scrubbed clip.
- Projects: ten real projects, each with a detail page and real photography of the work. Generated footage is used purely as illustration and is never captioned as a client project.
- Contact shaped as a work order, the “Survey Request Sheet”, which lands on the
site’s only server code:
POST /api/contact.
The lead pipeline is email-first with a fallback: the lead reaches the client’s inbox
via Resend with reply_to set to the visitor’s address; Fonnte WhatsApp fires only
if email fails, so one lead produces one notification; if both fail, the site returns
an honest 502 and points the visitor at WhatsApp. The form is guarded by a honeypot,
validation, and cross-origin rejection.
Engineering decisions
Static first, the Worker only when needed. The Cloudflare edge serves matching static assets without invoking the Worker, so pages cost no invocations; only the form endpoint actually runs as server code.
Media budgets are held by CI, not taste. Every video and image carries per-file
and per-page ceilings enforced by media:budget; the next clip that exceeds the
remaining headroom fails the build. That is what keeps a cinematic hero fast.
Going live is one guarded edit. The real domain and the staging flag change in a single commit, and a guard test fails if they disagree, because both mistakes are invisible in a browser.
Handover
The site is live on the client’s domain, with automatic deploys from pushes to main
once the full gate (format, lint, type-check, tests, build) is green. We wrote the
domain-launch runbook, the SEO guide, and the ads-tracking guide into the repository,
including the open items that must be resolved before the form is fully trusted in
production.
Does your team face a similar problem?
Tell us about the workflow and its constraints. We start with a scope we can describe and verify.