The Problem (Before)
The Boat Brokers came to us with a website that looked fine. The owner described it like this:
"I have a website but I don't have a sales department. Inventory updates take four hours. I have no idea where my leads come from. My customers call me to ask about their order status because there's nowhere else to look. I'm losing deals because I can't follow up fast enough — and I can't even tell which deals I'm losing."
— TBB ownership, Day 1 of engagement
The technical reality matched:
- WordPress on PHP 7.4 — frequent timeouts under normal traffic
- 745-second listing page loads (yes, twelve minutes — the worst pages literally couldn't render before the connection dropped)
- One contact form on the contact page; no source attribution; no follow-up automation
- Inventory updated by hand across 4 marketplaces (boattrader, boatcrazy, boats.com, others) — typically 2-week lag from photo to listing
- Customer database in 3 places: a CRM nobody loved, a spreadsheet, and the owner's head
- Email deliverability ~22% — most messages going to spam
- No customer portal — every order-status question came in by phone
- No reporting — close rate by source, by rep, by product? Not knowable.
The Build (25 Development Phases)
The platform shipped over 25 discrete development phases from foundation to v13.5.0. Each phase had a tight scope, a milestone, and a deployment. Here's the architecture, system by system:
Homepage: theboatbroker.com — Apple glassmorphism design system, red/white/blue brand palette, Hobo display font for header, lead-capture above the fold, premium 55+ demographic targeting.
Foundation Layer
- Migrated PHP 7.4 → 8.2 (4x throughput improvement before any code changes)
- Cloudways managed hosting on DigitalOcean (138.197.208.98, app slug `nqnwsnagax`)
- Cloudflare Pro: CDN, WAF, DDoS, Argo, image optimization
- Custom WordPress theme — no off-the-shelf parent theme, no page builders, no plugin bloat
- Wordfence + manual security review on every release
- UptimeRobot monitoring with 1-minute checks, alerts to phone
Inventory Layer (the catalog operating system)
The plugin we wrote — boatbroker-inventory, currently v13.5.0 — runs the whole inventory side. Key architectural decisions:
- Custom post type (`bbi_listing`) with 38 custom fields backing every unit
- Bound Google Apps Script on a Master Inventory Sheet — the team updates listings in a Sheet they already know how to use, the site updates in real time. Custom TBB Tools menu with E1/E2 checkbox bulk operations, Status=Sold auto-archive, category-grouped insertion
- Image pipeline: bulk upload → auto-watermark via PHP GD library → multiple resizes → CDN. Garrett's Drive is the source of truth, daily cron syncs to WP media
- Sort priority logic using a SQL CASE expression so featured listings naturally rise without breaking pagination
- Listing render via custom theme template (`single-listing.php`) — inline critical CSS, lazy-loaded everything else. 745s → 0.4s on a 1,800x improvement
Inventory page: 8-section design (hero / trust / browse / grid / financing / consignment / FAQ / footer). Every unit has 38 data fields, AI-generated descriptions, watermarked photos, marketplace feed flags, and live sort-priority.
Lead Engine
The lead engine is where most boat-dealership sites fail invisibly — they look fine but they're not actually capturing or routing. Our build:
- Multi-touch capture: financing, test-drive, contact, callback, trade-in — five surfaces, each tuned to a different stage of intent
- Source attribution on every lead (UTM, referrer, page, ad-set). Stored as JSON in
wp_bbi_leads.source_data
- Throttle gates: 5/wk limit per email/IP combo with opt-out — prevents single visitor flooding the inbox
- Routing logic: all leads → sales@ with CC paths; rules engine routes by territory or product (currently configured as broadcast)
- Custom CRM schema:
wp_bbi_leads, wp_bbi_conversations, wp_bbi_owned_units — 3-table design with proper foreign keys, JSON activity timeline column, full audit trail
- 8 query helper functions (
bbi_get_leads_by_status, bbi_get_leads_by_source, bbi_get_lead_activity, etc.) — clean abstraction so admin views don't need raw SQL
- Credit application auto-fill from prior visits — visitor comes back, financing form pre-populates from their last lead record
Email Engine
- Brevo dedicated SMTP on a verified sender domain (DKIM + SPF + DMARC = 9.7/10 mail-tester score)
- Seven internal modules: graph-api, email-inbound, email-responder, email-approval, email-search, sales-intelligence, sales-insights-query
- Sequence module: multi-step nurture with conditional branching (if opened email 3, send X; if not, send Y)
- Inbound listener: replies route into the lead's record automatically — no human triage
- Approval workflow: outbound campaigns require admin sign-off before sending
- Search: full-text across every email ever sent or received in the system
- Result: deliverability went from ~22% to 95%+. Most replies hit inbox same-minute, not next-day.
Customer Portal
- /my-account/ route → custom PHP shortcode
[bbi_my_account] in buyer-portal.php
- OAuth: Google, Apple, Microsoft (post-cutover 2026-04-23 — production fix shipped same day)
- 8 tabs: saved listings, applications, documents, communications, orders, sellers, profile, settings
- Seller portal (for consignors): 3-binding architecture (lead row + owned_units row + tbb_lead_id user-meta) — the only safe way to give a seller access to their own unit without breaking buyer queries
- Document exchange: signed agreements, financing approvals, ID verification — all logged, all timestamped
Customer portal: /my-account/ — OAuth-backed login (Google/Apple/Microsoft), 8-tab buyer interface, seller dashboard for consignors, document exchange with audit trail.
Marketplace Syndication
- 6 automated feeds: boattrader, boatcrazy, boats.com, marinemax, marketplace boats, dealer-syndication
- Encrypted credentials: per-marketplace creds in
bbi_settings, AES encrypted at rest
- Scheduled push: nightly at 02:00 AZ time, with morning summary email
- Failed-push alerts route to admin (so the marketplace doesn't see a missing listing before we do)
- Two-way: marketplace inquiries flow back into the unified lead inbox
- Quality control: never publish a listing missing required fields — dry-run validation before push
AI Layer (with hard cost discipline)
- Anthropic Claude via
bbi_call_claude_api — 75+ call sites across the codebase, each with backward-compatible nullable params
- 144 AI-generated catalog descriptions in TBB's voice (specific style guide: warm, factual, no hype, mention years/make/condition/Lake-Havasu-relevance)
- Cost controls: Haiku for chat (cheap), prompt caching (90% reduction on repeat content), 200 calls/day cap, $0.50–$2/day target — actual spend has stayed in band
- 24 modules disabled at launch to optimize cost; can flip back on per-module as ROI proves out
- Sales-intelligence: natural-language queries across the lead base ("show every cold lead from California in the last 30 days that asked about pontoons")
Conversion Tools
- Priority Listing tiers ($500/$1K/$2K) — revenue layer for sellers, state-machine driven (free → priority → premium → expired), Skippy-Form for verification
- Financing calculator with "Cost Per Day Owned" framing — converts traffic to financing leads at ~3x the rate of a standard payment-only calculator
- Test-drive modal site-wide via
wp_footer injection, class .tbb-testdrive-trigger — one component, every page
- 8-section inventory pages: hero, trust, browse, grid, financing, consignment, FAQ, footer — each tested independently for conversion lift
- Watermark: GD-library admin backfill, drive-sync daily, brand consistency at scale
Financing calculator: "Cost Per Day Owned" framing turns abstract monthly payments into emotional ownership — converts browsers into qualified financing applications at meaningfully higher rates than a standard payment calculator.
SMS Engine
- Kenect integration — sole text surface (post-pivot 2026-04-25, sms: CTAs deprecated to consolidate inbox)
- Two-way texting from the same shared inbox as email
- Compliance: opt-in capture, opt-out honored, quiet hours respected
- Templated quick-replies for common scenarios
Mobile / PWA
- Progressive Web App for the team — installs on iOS / Android home screens
- Push notifications for new leads, hot signals
- Offline-capable for showroom use (no signal at the dock)
- Same admin features as desktop, touch-optimized
The Phases (How It Got Built)
Phase 0–4Foundation
Hosting, PHP 8.2 migration, custom theme, design system, security baseline.
Phase 5–9Inventory plugin
boatbroker-inventory v1, custom post type, 38 fields, image pipeline, watermark.
Phase 10–13Lead engine
3-table CRM schema, capture forms, source attribution, routing rules.
Phase 14–17Email infrastructure
Brevo SMTP, 7 modules, sequences, inbound listener, sales intelligence.
Phase 18–20Customer portal
/my-account/, OAuth, 8 tabs, seller portal, document exchange.
Phase 21–23Marketplaces & AI
6 feed integrations, AI catalog descriptions, sales-intel query layer.
Phase 24–25Polish & PWA
Conversion tools, mobile PWA, cost controls, production hardening.
Post-Launchv13.5.0 ongoing
SMS pivot, lead-throttle, leads-page rewrite, OAuth fix, post-cutover hardening.
The Stack (Every Component)
CMSWordPress 6.9.4
BackendPHP 8.2, custom plugin
HostingCloudways (DigitalOcean)
CDN / WAFCloudflare Pro
Email SMTPBrevo (dedicated)
SMSKenect
AIAnthropic Claude
Sheet integrationGoogle Apps Script (bound)
AuthOAuth: Google / Apple / Microsoft
MonitoringUptimeRobot + Wordfence
AnalyticsPlausible (privacy-first)
BackupsDaily + off-site, monthly verified
DatabaseMySQL 8 with custom schema
Design systemApple-glass, Hobo display, Inter body
MobilePWA (no app-store gatekeeping)
Marketplace feeds6 automated, encrypted
The Numbers (After)
Listing page load time
745 sec
0.4 sec
Email deliverability rate
~22%
95%+
Marketplaces syndicated
0 (manual)
6 (automated)
AI-generated descriptions
0
144
Customer database location
3 places
1 unified
Lead source attribution
None
Every lead, every field
Customer portal
None
8-tab self-service + OAuth
Inventory update cycle
~4 hours
~4 minutes
Daily AI compute spend
N/A
$0.50 – $2.00 (capped)
Hot-lead routing latency
Manual (hours)
<60 seconds
What This Means in Plain Language
Inventory updates that used to take 4 hours now take 4 minutes. The owner can see every active lead, every closed deal, every in-progress sale from one screen. Leads route to the right rep within 60 seconds of submission. Customers self-serve order status, document exchange, and saved searches — phone volume on routine questions dropped meaningfully. The AI describes new boats automatically and at a fraction of a cent per description.
None of this is theoretical. It's running every minute of every day at theboatbroker.com. You can audit it yourself.
We came to GAP Industries with a website pretending to be a sales tool. Eighteen months later we have a real digital sales department. Inventory updates went from hours to minutes. Leads route automatically. Our customers self-serve everything they used to call about. The build was on time, the price was what they said it would be, and Garrett actually picks up the phone when something breaks.
— The Boat Brokers ownership
Why This Matters For Your Industry
The Boat Brokers is a boat dealership, but the system isn't a boat-dealership system. It's a multi-touch sales operating system that happens to be configured for boats. The catalog can hold any kind of unit. The lead schema works for any sales cycle. The email engine, customer portal, marketplace layer, AI, mobile PWA — all category-agnostic.
That's the GAP Industries thesis. Each new vertical (insurance, real estate, RV, equipment rental, individual salespeople, your industry) inherits the proven core. We customize the 2–3 systems that are category-specific (catalog schema, marketplace integrations, regulatory compliance if any). The other 9–10 systems work out of the box.
That's why we can build in 30 days at $10,000. A from-scratch agency build of this scope is genuinely $200K–$500K and takes 12–18 months. We're not building from scratch — we're adapting. You get the result, we skip the reinvention, the price reflects both.
Vertical #2 — Lifeline Insurance (In Build)
The first GAP Industries vertical extension. A lead-generation and compliance platform for licensed insurance agents, currently in build for LifeShield Insurance (Melissa Salerno) covering Arizona and 7 expansion states (MI, NM, OH, SD, TX, UT, WA).
Specifics that differ from TBB:
- Catalog schema: insurance policies (term life, whole life, ACA health, supplemental) instead of boat units
- Lead routing: state-restricted (an MI lead won't route to an AZ-only agent) with quality-gate scoring
- Compliance: insurance-regulator-aware email automation (specific opt-in language, retention rules)
- Customer portal: policy documents, payment history, claim status
- Two-firewall doctrine: TBB ↔ Lifeline never share accounts, sheets, keys, infra, or IP egress
What stays the same: 85% of the platform. CRM, email engine, customer portal, AI layer, mobile PWA, infrastructure, design system primitives, document exchange — all reused. Case study publishes after launch.
Want results like these for your business?
20-minute walkthrough. We share screen on theboatbroker.com — admin side, customer side, every system above. You decide if there's a fit.
Book a 20-min walkthrough