Selected work

Major Verdict

Major Verdict, LLC

Major Verdict is a national membership platform for plaintiff personal-injury attorneys. Members publish verdicts to a searchable database, get featured profiles in state directories, and receive monthly state-specific brag-list emails. End-to-end build: brand, design, full Statamic + Laravel application, Stripe billing, marketing automation, and a Claude-powered case-value calculator on top.

Strategy

The first call was Eloquent over flat-file. A member directory backed by Stripe-tracked subscription state, with verdict authorship joining users to entries, would have been miserable to query as YAML on disk. Statamic 5 with the Eloquent driver gets the CMS-friendly editing surface while putting users and entries in MySQL where they belong.

Brand

Brand identity built from scratch (name, logo mark, color system, typographic voice). The work needed to read as authoritative without the gilded-courthouse cliches that plaintiff-firm marketing usually leans on, and to scale across plaque artwork, member badges, drip-email signatures, and the Stripe-hosted billing portal.

Design

Public site, member portal, and AI calculator all live under one design system. Featured-member profiles get a deeper visual treatment than basic-tier ones (a built-in upsell), the verdict-news pages carry a state map and a tag cloud sidebar, and the calculator uses a chat-style interface rather than a multi-step form so the experience reads as a conversation, not an intake gauntlet.

Development

Custom controllers and services back the public-facing pieces. State-filtered member directories at /members/{state}, case-type and state tag pages under /personal-injury-verdict-news, and a hand-rolled Mailcoach API wrapper that drives membership tier syncing on Stripe webhook events. New users land on the Potential Members list, get auto-moved to Current Members on registration, and segment-shifted to Featured on upgrade, all without admin touch.

Verdict ownership is enforced via custom FormRequests, HTML Purifier sanitizes every rich-text user submission, and a custom override patches the Memberbox addon for Eloquent compatibility. None of the third-party addons ship with the Eloquent driver in mind out of the box.

14 case types in the AI estimator

Auto, motorcycle, truck, rideshare, bicycle, pedestrian, slip-and-fall, medical malpractice, product liability, wrongful death, dog bite, premises, nursing-home, construction. Each runs against its own JSON schema for adaptive questioning.

E-commerce

Laravel Spark on Stripe, single yearly tier, no monthly billing complexity. Webhook listeners handle five Stripe events end-to-end: created, payment-succeeded, updated, expired, payment-failed. Each one syncs Statamic user groups, the member_status field, the pro_member_since timestamp, and the corresponding Mailcoach segment in a single pass.

$199 annual featured membership

Stripe Spark drives a single featured-tier subscription. Cancellations downgrade automatically, restoring the basic tier and clearing the pro_member_since timestamp without admin intervention.

51 auto-generated state launch coupons

A one-shot console command provisions 51 Stripe coupons + promo codes (50 states + DC), 50% off forever, capped at 21 redemptions each. The member portal queries Stripe live and surfaces the right code based on the user's licensed state.

Marketing

A 5-email plain-text drip sequence handles cold outreach to plaintiff injury attorneys. Sent from a separate domain so the main brand's sender reputation stays clean, with a domain-warming ramp baked into the import command (10/day week 1, 25/day week 2, 50/day week 3, 150/day after). Once a prospect signs up, a listener pulls them off the cold list and onto the registered-member list with the right segment. The drip stops on its own.

State-by-state brag-list emails are generated from frontend templates that pull verdicts by date + state + published status, then handed to the Mailcoach API to schedule monthly campaigns. Almost the entire flow runs without manual touch once a verdict is approved.

7 SEO landing pages, hub-and-spoke

A landing-page hub plus 6 case-type spokes target ~9,000 monthly searches across the "settlement calculator" keyword cluster. Each carries unique copy, FAQs, and FAQPage JSON-LD; case-type spokes pre-seed the conversation so the AI's first phase skips the "what type?" question.

“A conversational AI personal-injury settlement calculator. Users have a short, natural conversation with a private server-side AI, answer questions about their case, and receive a rough settlement range. No multi-step forms, no lead-gen gate, no attorney pitch.”

— Case Value Settlement Calculator brief

AI integration

The case-value estimator runs a three-phase Anthropic Claude pipeline. Haiku 4.5 handles scripted intake (case type, incident date, state). Sonnet 4.6 runs adaptive case-type-specific questioning against a structured schema. A final Sonnet pass synthesizes the estimate range, confidence rating, plain-English summary, and key factors. Every LLM call dispatches to a dedicated Redis queue so PHP-FPM workers never block on inference; the frontend POSTs a message, gets a token, polls for the result.

Layered safety rails keep the system honest and the bill predictable: kill switch via env flag, reCAPTCHA gate at session start, per-IP daily rate limit, daily USD spend cap with circuit breaker, off-topic regex pre-filter (rejects trolls for $0), Phase 1 infinite-loop guard, application-layer encryption at rest on sensitive columns, and a 30-day auto-purge cron.

30 days estimator data retention

Conversation rows carry a purge_after timestamp at session start. A nightly artisan command at 02:00 UTC hard-deletes anything past its expiry. App-level Laravel encryption protects structured_data, message_summaries, and final_summary on the way in.

Security and deploy

Security is end-to-end. CSP headers with per-request nonces (custom preset to keep TinyMCE working), HSTS via dedicated middleware, HTML Purifier on every rich-text user-submitted field, Glide secure tokens on assets, ownership verification on verdict edits via custom FormRequests, and application-layer encryption on the calculator's sensitive columns.

Production runs on Laravel Forge. A daily mysqldump cron rolls 14 days of compressed database backups, with an scp helper to pull them locally. The deploy script reloads PHP-FPM twice (once after composer install, once after optimize) so OPcache picks up new route caches the first time.

Next project

Anderson Hemmat

2025
Thanks for booking. Calendar invite is on its way.