AEC Benefits
Ontario's only construction-focused group benefits broker — with the platform to back it up.
AEC Benefits isn't a brochure website. It's a fully automated lead capture, nurture, and outreach platform that runs 24/7 — built specifically for Ontario contractors, trades operators, and construction business owners.
The funnel, in plain terms
- A construction business owner searches Google for group benefits help.
- They land on an AEC Benefits article or city page written exactly for that search.
- They read, trust the content, and fill out a form or take the benefits quiz.
- The system captures their details, sends a welcome email, and starts a follow-up sequence.
- Timed emails go out automatically during business hours — bounces, opens, and replies are all tracked.
- The broker only steps in for the actual sales conversation. Everything before that is automated.
Tech stack
| Layer | Technology | |---|---| | Front end | React 18, TypeScript, Vite, Tailwind CSS | | Back end | Node.js, Fastify | | Database | PostgreSQL | | Containerization | Docker / Docker Compose | | Traffic & SSL | Traefik (reverse proxy) | | Email delivery | SMTP2Go | | Auth | Google OAuth | | Analytics | Google Analytics 4 | | AI — content & prompts | Claude Sonnet (via OpenRouter) | | AI — image generation | Flux 1.1 Pro (via OpenRouter) | | Hosting | VPS (self-hosted) |
Docker architecture
The entire system runs as isolated Docker containers on a single VPS. Each container is a separate concern. Adding a new feature means adding a new container — existing containers are not touched.
aec-web — the website and API server. React front end + Node.js/Fastify back end in one container. Handles all public-facing pages, form submissions, the benefits quiz, and API routes.
aec-db — PostgreSQL database. Stores leads, outreach contacts, email history, delivery events (bounces, opens), and the CASL unsubscribe list. This is the system's permanent memory.
traefik — reverse proxy and traffic director. Sits at the front door of the VPS, routes all incoming requests to the correct container, and manages SSL certificates automatically.
CRM & email outreach engine
- A scheduled job runs every 10 minutes, Monday–Friday, 9am–5pm Eastern.
- It queries the database for any lead due a follow-up email.
- SMTP2Go sends the email; a webhook pings back delivery status (delivered, bounced, opened).
- The database is updated on every event.
- The unsubscribe list is checked before every send — CASL compliance is automatic, not manual.
Blog & content infrastructure
- 50+ articles in production targeting Ontario construction business owner searches.
- 7 city-specific landing pages (Burlington, Hamilton, surrounding Halton region).
- A structured article template with first-person opener, numbered H2 sections, Key Takeaways box, FAQ accordion, full author bio, social sharing, and three related article cards with excerpts.
- AI-generated hero images: Claude Sonnet generates the prompt → Flux 1.1 Pro renders the image → output saved as WebP. Visual style: Ontario construction documentary photography — waffle slab ceilings, muted earth tones, high-vis orange accents, consistent foreman character.
Voice and SEO discipline
The blog voice is first-person and direct — written for a contractor reading on their phone between jobs, not a corporate HR team. URL slugs are locked and never change, because slug preservation protects sitemap health and SEO equity over the long run.
These aren't quirks. They're the principles that let the platform compound month over month.
Strategic principles we built in
- Ship value before platform bureaucracy. Build what users can use now; let API approvals run in parallel.
- URL slug preservation is non-negotiable. Existing slugs must never change.
- Validate before automating. Confirm every filename and reference matches the source of truth before writing scripts that depend on them.
- Modular by design. New features are new containers; nothing breaks what's already running.