zsty.us

Before / After · Case Study

OgLife.app — one identity layer across a 17-domain portfolio

  • Hemp / CBD
  • Painting & Trades
  • Aviation

Each brand in the portfolio had its own opt-in, its own chat widget, its own customer record. A customer who liked two brands ended up as two strangers in two databases. OgLife.app is the cross-business identity + preferences + live-chat layer that sits between the brands and the customer — one opt-in, one preferences page, one inbox. Built on Cloudflare Workers + Durable Objects + Neon, with an embeddable 7KB chat widget that any brand storefront drops in.

Don't make a returning customer opt in four times. Make every brand smarter on the first inbound.
🔒oglife.app
jackiej.events — modern site

The story

Problem · Insight · Build · Outcome.

  1. 01 · Problem

    A multi-brand operator's customer is one person but every brand sees a stranger.

    BMH, LGP, Buck Mountain, Fuel1st, palisades, the foundation — each brand owned its own opt-in form, its own chat widget, its own customer record. A returning customer who liked two brands ended up as two strangers in two databases.

  2. 02 · Insight

    Identity is a layer, not a vertical.

    One opt-in surface. One preferences page. One chat widget that knows who's on the other end across every brand. Brand storefronts stay independent; identity lives between them.

  3. 03 · Build

    Cloudflare Workers + Durable Objects + Neon + a 7KB widget.

    QR redirect handler on the Worker. Opt-in + preferences editor on Next.js 15. Inbox app on Next.js 15 with magic-link sign-in. Durable-Object-per-conversation chat at the edge. Embeddable widget any brand drops in as a script tag.

  4. 04 · Outcome

    One inbox, one identity, one preferences page — across every brand.

    Phase 1A + 1B shipped in ~two weeks. BMH storefront's old ChatWidget became a 70-line wrapper around the OgLife script. Every other brand follows the same pattern.

Stack

What it ran on. What it runs on now.

After

  • Next.js 15 + React 19
  • Cloudflare Workers
  • Durable Objects
  • Drizzle + Neon Postgres
  • Web Push (VAPID)
  • Anthropic Claude Sonnet (autoreply)
  • SMTP (own infra, no Resend dep)

What changed

Grouped by what kind of system shipped.

Each claim ships with concrete evidence — env vars, table names, cadence chips. No marketing fluff.

Design

QR → opt-in → preferences, in one flow

`oglife.app/r/{slug}` resolves an agent slug, logs scan + UTM + geo to Neon, drops a 30-day cookie, and 302s to a 15-category opt-in grouped into 5 buckets. Magic-link preferences editor lets the customer pause or unsubscribe per category.

Agent backbone

Durable-Object-per-conversation chat at the edge

`wss /ws` upgrades to a `ChatConversation` Durable Object — SQLite-backed, one DO per conversation_id, persists every message to Neon. Slack + Web Push fires on first visitor message when no agent is online. Claude Sonnet drafts an autoreply at 45s if still unanswered.

Real-time push

Cross-brand agent inbox with referral leaderboards

Allowlist agent admin, magic-link sign-in, conversations filtered by brand × status, AI-suggest button drafts replies in the operator's voice. Per-agent referral leaderboard + CSV export.

Retention

Removed Resend — saved a SaaS bill, used existing SMTP

Replacing Resend with SMTP via existing infra (AWS SES SMTP or Hetzner Stalwart) ships the same magic-link emails without a paid-plan upgrade.

While the owner sleeps.

Autonomous surfaces

The agent backbone keeps the brand earning after hours. The owner approves; the system runs.

  • Routes scans into the right brand pipeline

    real-time

    Worker resolves the agent slug, logs the scan, routes the opt-in to the brand that issued the QR.

  • Fires AI autoreply when no agent is online

    real-time

    Claude Sonnet drafts a contextual reply 45s after first visitor message if no agent has joined.

  • Pushes inbound visitors to the on-call operator

    real-time

    Web Push (VAPID) wakes the on-call operator's phone the moment a visitor sends the first message and no one's in the inbox.

← All rebuilds

OgLife.app — one identity layer across a 17-domain portfolio — zsty.us