The Balar house standard for running any client website after launch — change management, forms & email, go-live checklist, the ongoing SEO routine, and how we work inside Projects. Pin one copy to every client and fill in the snapshot.
REUSABLE TEMPLATE — pin to each client Project| Client | {{client name}} | Industry | {{industry}} |
|---|---|---|---|
| Live domain | {{domain}} | Launch date | {{date}} |
| Repo | {{git repo url}} | Cloudflare project | {{project name}} |
| Stack | {{e.g. Astro static}} | Form/email | {{e.g. Resend via Worker}} |
| Phone / NAP | {{phone, address}} | Key contact | {{name, email}} |
| Target areas | {{suburbs / regions}} | Core services | {{services}} |
| Brand | {{colours, fonts, logo location}} | ||
| Status | Search Console {{✓/✗}} · GBP {{✓/✗}} · Analytics {{✓/✗}} · Form live {{✓/✗}} · Schema complete {{✓/✗}} | ||
Our default build stack is Astro (static) → Cloudflare → Resend — fast, cheap to host, excellent for SEO, with a clean Git-driven deploy. The process below applies to any client on this stack (and mostly transfers even if a client is on something else).
No separate "changes" spreadsheet needed — commit history is the audit trail, and Cloudflare keeps every deploy for one-click rollback.
Commit messages a human can scan: Add {{suburb}} location page, Update {{service}} copy, Fix footer phone link.
On our Astro builds, location/service pages are generated from data files — add one entry and the page, schema, sitemap, hub and footer links all update. Keep each page's copy unique (own intro + FAQ); near-duplicate local pages get ignored by Google.
For lead/contact forms our default is Resend via a Cloudflare Worker — best developer experience, native Cloudflare fit, and a free tier (3,000/mo, 100/day) that covers a typical lead form with room to spare. The job is hardening, not switching.
| Option | Best for | Use when |
|---|---|---|
| Resend (default) | Modern stacks, lead/transactional email on Cloudflare | Almost always — our standard. |
| Postmark | Mission-critical email (bookings, payments) | Only if a missed email would break the business. |
| SendGrid | Transactional + marketing in one platform | Client already invested in it. |
| Web3Forms / Formspree | No-backend form handling | Tiny brochure site with no Worker. |
| Amazon SES | 200k+ emails/mo, in-house ops | High-volume senders only. |
// POST /api/quote — Cloudflare Worker / Astro endpoint (pattern) export async function POST({ request, env }) { const data = await request.formData(); // honeypot + Turnstile check, then: await fetch("https://api.resend.com/emails", { method: "POST", headers: { Authorization: `Bearer ${env.RESEND_API_KEY}`, "Content-Type": "application/json" }, body: JSON.stringify({ from: "Leads <leads@{{domain}}>", to: ["{{client inbox}}"], reply_to: data.get("email"), subject: `New enquiry — ${data.get("service")}`, text: `${data.get("name")} · ${data.get("phone")}` }) }); return Response.redirect("/thank-you/", 303); }
House SEO toolkit entry point: balar-seo-toolkit. On-page audits & reports also via balar-on-page-seo / balar-report.
npm install npm run build # build to ./dist npm run dev # local preview npx wrangler deploy # push to Cloudflare
Or just git push — Cloudflare auto-builds & deploys.