HAL Marketing Check Tool
Web platform that QA's marketing emails and brand materials against guidelines, with Claude doing the consistency review.
The problem
A casino marketing email has five or more tiers, each with its own offer: cabin category, freeplay dollars, beverage package, onboard credit, campaign code, end dates, tax disclaimers, and T&C blocks. Any one of these being wrong in any one tier is a guest-facing mistake worth tens of thousands of dollars to resolve. The QA process was people opening every email preview, reading every landing page, and cross-referencing both against a spec in Snowflake. It was slow, and people are bad at reading the same thing for the twentieth time.
What I built
A web platform with two modes:
Email QA. The reviewer picks a live campaign from a Snowflake dropdown, pastes email preview URLs per tier, and clicks run. A FastAPI backend fetches each email with Playwright, scrapes the matching landing page, runs deterministic checks (offer match, freeplay amount, beverage, OBC, campaign code, deal date, T&C blocks), and then hands the email and landing-page content to Claude for a consistency review. The report comes back tier by tier with pass/fail at a glance and structured explanations underneath.
Brand Review. Upload a PDF, image, HTML file, or URL and check it against a pluggable guideline set. The reviewer gets a page-by-page annotated report with finding pins showing where the tool thinks the creative deviates from the brand.
The backend is around 8,000 lines of Python. The frontend is around 9,500 lines of React with strict TypeScript. There is a pixel-art office visualization that runs across the page while the pipeline works, with characters that comment on progress. That last one is a small indulgence but the team uses it as a status indicator.
A few design choices:
- The Email QA checks are spec-driven. The Snowflake campaign spec is the source of truth. Nothing about what a tier should contain is hard-coded. If the spec says freeplay is zero, the tool runs a negative check that freeplay is not mentioned.
- Playwright operations are all single-threaded by design because Playwright’s sync API binds greenlets to the creating thread. Claude review runs in parallel because it is not a browser operation.
- Guideline sets are pluggable. Register a new
GuidelineSetsubclass and it shows up in the UI automatically.
Outcome
229 automated tests. Used in production by the HAL Sales and Partner Marketing team. The AI proofing predecessor to this tool has seen zero communication errors on high-value offers (free cabins, free play, drinks) since it went live.
What’s next
- Track regressions across sends by storing each run’s deltas in Snowflake, so you can see when a campaign’s pass rate dips over time.
- Teach the consistency reviewer about image content, not just copy.