Dr COOKER
B2B cateringBelgrade, Serbia
From a site with no form at all to a validated quote request with a reference number.
Status
Services
- Website · Automations
Year
2026
Results
Not measured yet.

The problem
The old site had no contact form anywhere, and on mobile the phone number and email weren't even tappable. The only button said Details. Menus were scanned images: unreadable on a phone, invisible to search and to screen readers. Kindergartens and companies shared one navigation.
What we built
- A 17-page site with navigation split by audience: kindergartens and schools, companies, menu, supply.
- Scanned menus turned into real HTML tables: 2 weekly menus, nutrition values and portion sizes.
- A quote request form that asks for the number of users only when meals are chosen.
- A reference number on every request, written to a Google Sheet.
- A team email built for five-second triage: institution first, one-tap Call and Reply.
- A confirmation email to the lead with a summary and the reference.
- A ticker of real dish names from the menu instead of stock photos, with a pause button.
- A 301 map for every old WordPress URL, including a homepage that lived at /sample-page.
How it works
The flow end to end, as the system is built to run. Sheet and status names are the client's own.
09 steps · 1 sheet
- Director or HR
- Audience page
- Quote request form
- Server validation
- Sheet row · UP-ID
- Triage email to the team
- Confirmation to the lead
- Call and meeting
- Tailored quote
Under the hood
The details a developer checks first. Most of them exist so an inquiry is never lost or sent twice.
- Success shows only when the backend confirms. Not sent shows only when the request provably never left.
- A 15-second timeout and one retry, only on errors that are safe to retry.
- A content fingerprint and an in-flight lock: a double click sends one request.
- The server re-validates every field and maps errors back onto the form.
- Bots get a quiet ok and no row, so they don't learn what gave them away.
- A six-hour duplicate cache and a write lock on the sheet.
- Emails built for Outlook, with a plain-text version generated from the HTML.
- The map loads only on click. A faster page, and nothing goes to Google until the visitor asks.
Stack
What it runs on.
- HTML · CSS · Vanilla JS · Google Apps Script · Google Sheets · MailApp · JSON-LD
Build QA
From our own test runs before launch. These are build numbers, not business results.
- Static audit: 0 errors, 0 warnings. 1,030 internal references across 16 pages, all resolving.
- 16 pages at 6 widths: 0 overflow, 0 contrast failures, 0 console errors, 0 failed resources.
- Final pass, 17 pages at 9 widths: 0 critical and 0 serious findings.
- 9 failure scenarios against a mock backend, including errors, timeouts and double clicks: not a single false confirmation.
- An independent copy review flagged 16 unsupported claims and verified 132 nutrition numbers as exact.
What we didn't build, on purpose
Scope is a decision. Every line here was decided, not forgotten.
- No public price list. Every quote is built for one institution.
- No stock food photos. Real dish names now, and 19 photo slots waiting for real photos.
- No promised response time until the client confirms one.
- No certified claims. The site says HACCP principles are followed, because that's what is documented.
- No framework. The Astro build was refactored to plain files: 278 packages down to 0.
The build
Captured from our local pre-launch build. Phone numbers, email addresses, prices and photos of people from the client's site are blurred wherever they appear.



