BALAR. Playbook
Standard Operating Playbook · Balar Media Group

Client Website
Ops & SEO Playbook

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
00 — How to use this

One copy per client Project

  1. Pin this to each client's Project knowledge (one Project per client). Every chat inside that Project then shares this context.
  2. Fill in the Client Snapshot below — that's the only client-specific part. Everything after it is the same standard process for every client.
  3. Anywhere you see a {{placeholder}}, replace it with that client's detail.
Tip: keep the full playbook as a file in Project knowledge, and paste just the filled-in Client Snapshot as text so it's the first thing any new chat reads.
01 — Client snapshot

Fill this in per client

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}}
StatusSearch Console {{✓/✗}} · GBP {{✓/✗}} · Analytics {{✓/✗}} · Form live {{✓/✗}} · Schema complete {{✓/✗}}
02 — The stack

How a Balar site fits together

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).

Git reposource of truth & full change history
Cloudflarebuilds on push, serves on the edge, instant rollbacks
Live site{{domain}}
Formposts to a Cloudflare Worker
Resendemails the lead + autoresponder
Inbox / CRMlead lands, client follows up
Golden rule: never edit the live site directly. Every change goes through the repo → commit → Cloudflare deploys. The repo always matches what's live.
03 — Tracking & managing changes

Git is the change log

No separate "changes" spreadsheet needed — commit history is the audit trail, and Cloudflare keeps every deploy for one-click rollback.

  1. Small copy tweaks: edit → commit (clear message) → push. Live in ~90 seconds.
  2. Bigger changes (new page, design): work on a branch → Cloudflare builds a preview URL → review / send client the preview → merge to go live.
  3. Broke something? Roll back to any previous deploy in Cloudflare — no code.

Commit messages a human can scan: Add {{suburb}} location page, Update {{service}} copy, Fix footer phone link.

Data-driven pages

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.

04 — Forms & email

House standard: Resend, hardened

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.

OptionBest forUse when
Resend (default)Modern stacks, lead/transactional email on CloudflareAlmost always — our standard.
PostmarkMission-critical email (bookings, payments)Only if a missed email would break the business.
SendGridTransactional + marketing in one platformClient already invested in it.
Web3Forms / FormspreeNo-backend form handlingTiny brochure site with no Worker.
Amazon SES200k+ emails/mo, in-house opsHigh-volume senders only.

Hardening checklist (every form)

// 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);
}
05 — Go-live setup

Do these once per launch

On the site

  • Real business name, address, geo & socials in the schema (LocalBusiness).
  • Real reviews in place of samples, then add AggregateRating.
  • Form wired & tested; /thank-you/ page exists.
  • Dedicated 1200×630 social share image.

Tracking & visibility

  • Google Search Console — verify + submit /sitemap-index.xml.
  • Google Business Profile — claim/optimise (biggest local lever).
  • Analytics — GA4 or Cloudflare; track phone-taps & form submits as conversions.
  • Bing Webmaster Tools — submit sitemap (feeds Bing + ChatGPT search).
06 — Ongoing SEO cadence

The routine that keeps clients ranking

Weekly · ~30 min

  • Search Console: queries, clicks, indexing errors.
  • Google Business Profile: a post + chase reviews.
  • Watch leads (calls + form submits) — the real scoreboard.

Monthly

  • Publish 2–4 articles from the content plan → balar-content-strategy
  • Optimise/expand a service or location page; tidy internal links → balar-on-page-seo
  • Send the client a monthly report → balar-report

Quarterly

  • Full technical audit — CWV, broken links, schema, crawl/index health → balar-seo-audit
  • AI-visibility check (ChatGPT / Gemini / Perplexity) → balar-ai-visibility
  • Competitor review — new areas to target, gaps to fill.

House SEO toolkit entry point: balar-seo-toolkit. On-page audits & reports also via balar-on-page-seo / balar-report.

07 — What to measure

KPIs for every client

Lead metrics (what pays)

  • Phone-call clicks (tel: taps)
  • Form submissions
  • Form start → completion rate
  • GBP calls & direction requests

SEO health

  • Local-pack & map rankings for core "{{service}} {{suburb}}" terms
  • Organic clicks to money pages
  • Blog → money-page click-through
  • Core Web Vitals (LCP<2.5s · INP<200ms · CLS<0.1)
Always tie it to revenue: leads → booked jobs → $. "X calls + Y form leads from organic this month" is what proves value.
08 — Working in Projects

How we run clients with Claude

Pin to each client Project:
  • This playbook (standard) + the client's filled-in Snapshot
  • The client's website blueprint (sitemap, keywords, content plan)
  • Repo + Cloudflare project + brand assets
  • Live "go-live setup" list, ticked as completed
09 — Cheat sheet

Quick reference (Astro / Cloudflare default)

Deploy / change

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.

Where things live (typical)

  • Add area → src/data/locations.ts
  • Add service → src/data/site.ts
  • Business details/schema → src/data/site.ts
  • Design tokens → src/styles/global.css
  • SEO head/schema → src/layouts/Base.astro
  • Form/email key → Cloudflare env vars
Client previews: present mockups on mockups.balarmediagroup.com.au/clients/{{slug}}/ — branded, not a claude.site link. Use publish-artifact only for throwaway internal checks.