Six brands across DTC and B2B, run by a team of two. I did the analysis, built the loyalty program, and wrote the front-end code myself.
We'd been sitting on eighteen years of purchase history and nobody had ever run customer lifetime value on it. I'm not the analyst who could build that model from scratch — but I knew what to ask it, and I went and found the tools that could.
This is where the revenue actually lives, and where we were quietly losing people between their first order and their second. That gap was worth seven figures, and it's the reason the next thing I built exists. (Real figures are blurred for the public version.)
This is the most direct answer to what the model turned up — and the newest thing I've shipped. Tiers sit where our real spend curve breaks. The economics work backward from a margin we knew we could live with. And all of it pulls toward the second order specifically, because a points tier does nothing for a first-time buyer, and the second order is right where we were bleeding people.
Identity built from scratch — the pint glass reads as a fill gauge, which is what the whole tier system is.
Everyone starts here
$250 a year
$1,000 a year
Tier badges and the redemption ladder. The glass fills as you climb — Session, Double, Triple.
Members see a live balance and their current tier, which is the nudge to come spend it. Everyone else gets the invitation to join instead. Same email, same template, and the loyalty block earns its place either way. Every value has a fallback too, because a mistyped field name won't throw an error in email; it'll cheerfully render a zero and ship anyway. So I made sure an empty one never looks broken. Toggle between the two.
Your Digital Member Card The MoreBeer! Brewers Club
|
|
Left state renders from Smile Points Balance and Smile VIP Tier Name; right state falls through to the invitation branch.
The loyalty program is new, but the idea it runs on isn't. Before any of it, I took SMS from a plain broadcast list and made it an actual VIP channel — subscriber-only pricing, early access, drops that didn't run anywhere else. People stayed subscribed because leaving meant missing something. That's the whole reason the list grew.
Our old CMS couldn't do half of what I wanted, so I taught myself enough HTML and CSS to route around it. Moving to Shopify turned that workaround into a real edge — when the person scoping the work and the person building it are the same person, most of the waiting just disappears. Everything below is live on this page; poke at it.
It watches the live cart and rewrites its own headline and button every time you cross a spend threshold. The fussy part: once you unlock the gift, the button stops being a link and turns into an add-to-cart, because Shopify will happily apply the discount but won't put the actual item in the cart for you. Change the cart below and watch it move.
Pick your size and your recipe and it finds the exact Shopify variant, re-prices everything on the card, and drops it straight into the cart. Our landing pages used to dead-end at a link to some product page. This one ends at the cart. Change the size or the recipe and watch the price move.
Blichmann Modular Utility Cabinets — video-led, teased in email, linked off the homepage, and built to sell rather than browse.
Three DTC storefronts, three B2B catalogs, one shared calendar, and two of us feeding all of it. There's no way to hand-write every email at that volume and still get to everything else the job actually is. So I built a way to reproduce what already works, off our own campaigns instead of somebody's idea of best practice.
Open rate, click rate, revenue per recipient, campaign by campaign — then I built the winners into a playbook that drafts the next email off what actually drove revenue, not somebody's idea of best practice. Short and blunt beat long and clever almost every time, usually about three to one. That's the version the playbook writes now, and it's most of how two of us keep six brands fed.
We're not booking a photographer to shoot one sack of malt for one week's email. So I got the prompt tight enough — the counter, the light, the glass, what the beer should look like for that particular grain — that it comes back the same way every time. Which is harder than it sounds.
What I handed it
What came back
A flow is just an email that waits for you to do something before it fires, and not every something is worth the same. A browse is barely a signal. An add-to-cart is a real one. Someone asking us to text them the second a thing's back in stock has basically raised a hand and said "I'm buying." But there's a louder signal than any of those, and it's the one we answer least — someone who actually just bought. The minute after an order is the warmest a customer will ever be, and right now our program mostly goes quiet on them. It's the same idea the whole way up the ladder: the stronger the signal, the harder I lean on it. The rung we're missing is post-purchase, and it's the one I'm building now.
Browse, product view, category view
Added to cart, started checkout
Requested a back-in-stock alert
Back-in-stock alone earns nearly 40 times the revenue per send of a browse — nothing about the store changed to get there, the customer just asked first. The purchase sits a rung higher and we're barely on it. That's the whole reason post-purchase is what's next: the second order, the exact thing the CLV model flagged.
I rebuilt every flow, then went through them one node at a time: what's live, what's half-finished, what's still just an idea, and what each piece is actually bringing in. The imbalance is the whole point. Recovery is carrying the program, and the post-purchase side is mostly empty boxes. Those empty boxes are the plan.
The gaps above aren't a wish list. Post-purchase, replenishment, and the RFM segments wired to triggers are scheduled and dated on the build board. None of it is hypothetical.
What I inherited was batch-and-blast — the same email to everybody, hope for the best. I fixed the obvious things: segmented the list, wrote better, went after lapsed buyers, and stopped emailing people who were never going to open again. That turned our biggest owned channel back around. And we did all of it mid-replatform, new site and new ESP at the same time, which I would not wish on anyone.
Twelve months, same catalog, same customers. My channel went up while everything around it went down. The 17% on its own doesn't impress me that much. What I'd actually defend in a room is the distance between those two lines.
2025 was the rebuild — Shopify in December, Klaviyo in February. Since then email's been running about 18% ahead of where it was this time last year, and it's already booked roughly two-thirds of everything last year brought in, with months still to go. The difference this time is that the rest of the business is finally moving the same way: sitewide revenue is back in the black.
This goes to past customers who've gone quiet but are still opening — so there's a pulse, just no purchases. The $20 lands in their account on its own; there's no code to copy or lose. And the moment someone uses it, Klaviyo pulls them out of the sequence, so every send in the series reaches a tighter, likelier group than the one before. Click any of the three to read it.
I started it and ran it — product demos, how-tos, and long-form interviews with brewers walking through how their most famous beers actually get made. It started with local brewers who were already our customers, and it ended up in a room with the people who basically built the industry.
Ken Grossman, Sierra Nevada Brewing Co. Watch the video here
Vinnie Cilurzo, Russian River Brewing Co. Watch the video here
30.5K subscribers, 496 videos.
Ten years in marketing, across DTC Shopify storefronts and legacy B2B wholesale. Six brands, one direct report. B.A. Communication, UC San Diego. East Bay. Songwriter, runner, home cook off the clock.
Every project on this page is one I pitched, built, and shipped myself — the loyalty program, the CLV work, the YouTube channel, the front-end code under all of it.
I own the roadmap, set the OKRs each quarter, and report the number every month — including the months it's down.
Lifecycle, CRM, or retention roles where the customer data actually informs the program.
This is an exit-intent modal. I built it, same as everything else on this page — the flow logic, the loyalty math, the code you just scrolled through.
You're not a cart I'm trying to recover. But the instinct is the same: catch someone while the intent is still there. So — if you're hiring for lifecycle, CRM, or retention, email me. I answer fast.