Joe Smahl

There wasn't a lifecycle program. So I built one.

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.

+18%email revenue, ahead of last year
+100%SMS revenue, year over year
30Kcommunity, from 400
Joe Smahl
01 — What I found

We weren't losing people at year three. We were losing them at order two.

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.

Customer Lifetime Value·Repeat Purchase Rate·Cohort analysis·Revenue concentration
18 yrsof history, queried for the first time
97%of projected revenue sits in the top fifth
5 yrsof decline in first-to-second purchase
Click to enlarge
Preview unavailable here.Open the dashboard →

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.)

02 — What I built

So I built a loyalty program from scratch — one that goes after the second order, not the tenth.

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.

Loyalty economics·Retention·Second-order activation·SMS / VIP
The MoreBeer! Brewers Club

Identity built from scratch — the pint glass reads as a fill gauge, which is what the whole tier system is.

Session tier badge

Session

Everyone starts here

1 ptper $1 spent
Double tier badge

Double

$250 a year

2 ptsdouble the rate
Triple tier badge

Triple

$1,000 a year

3 ptsour best rate
500$5 off
1,000$10 off
2,500$25 off
5,000$50 off
10,000$100 off

Tier badges and the redemption ladder. The glass fills as you climb — Session, Double, Triple.

One send, two reasons to place another order

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

Points Balance

2,450

Current Tier

Double

See your rewards

Brewers Club  ·  Points 2,450  ·  Tier Double  ·  See your rewards

Left state renders from Smile Points Balance and Smile VIP Tier Name; right state falls through to the invitation branch.

Before the club, I made the channel itself the reward

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.

+80%SMS list growth
+100%SMS revenue, year over year
MoreBeer!Text Message · 11:02 AM
VIP early access 🍀 17% off starts tomorrow, but your code works right now. Use code GETLUCKY at checkout (exclusions apply): klv4.io/…
Text STOP to opt-out
Sent the day before the public sale even opened — your code works right now is the whole VIP promise in a sentence. It outsold the final-hours text on the same sale better than three to one.
03 — What sets me apart

I build the front end myself.

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.

Front-end build·Shopify Liquid·Conversion design·Cart / checkout logic

A sitewide banner that does math

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.

Ships from Concord, CA
Free Star San at $100 Spend $100 for the 8 oz, $150 for the 16 oz
Shop Now

A landing page that ends at the cart

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.

When I started, all our traffic dumped onto generic category pages. By 2025 the pages actually pulling their weight were ones I'd built for specific launches and sales.

See the full page →

A launch page instead of a category page

Blichmann Modular Utility Cabinets — video-led, teased in email, linked off the homepage, and built to sell rather than browse.

Click to enlarge
Preview unavailable here.
04 — How two people cover six brands

I turned what already worked into something that runs without me.

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.

Content at scale · Behavioral triggers · Flow architecture · Segmentation

Halfway through the year, I scored every email we'd sent.

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.

Then I put it to work on the photography

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

Catalog photograph of a one-pound bag of Briess Goldpils Vienna malt on a plain white background.
The catalog photo. White sweep, straight on, nothing around it.

What came back

The same bag of malt photographed on a marble counter beside a poured glass of amber beer, with loose grain scattered across the surface.
Marble, a poured glass, loose grain on the counter. Same bag, now in a kitchen.

What I'm really after is intent

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.

Someone looked

Browse, product view, category view

61% of send volume
Someone chose

Added to cart, started checkout

17% of send volume 3.8×
Someone asked

Requested a back-in-stock alert

0.4% of send volume 38×

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.

The map I actually plan from

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.

Recovery61% of flow rev
Cart · checkout · browse
Abandoned cart · ATC Checkout started Browse abandon Product viewed
Post-purchase3% of flow rev
Onboarding · education · repeat
Order confirmation Owner letter Replenishment 2nd-order nudge
● live● built, not shipped● manual○ doesn't exist

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.

05 — What happened

Email grew while the rest of the business shrank. This year it's still climbing.

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.

Reactivation · Win-back · Segmentation · List hygiene
34-point spread Prior year +17% Email revenue −17% Sitewide revenue

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.

And it kept climbing once the new stack was in

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.

+18%email, same stretch, year over year
2/3of last year's total, booked by July

Winning back the ones who drifted off

Click to enlarge
Preview unavailable here.

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.

06 — What I built before any of it

I grew our YouTube channel from 400 subscribers to 30,000.

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.

Content·Community·Education-led growth
30Ksubscribers, from roughly 400
1M+views a year
+50%YoY organic sales lift from education-led content
On location with Ken Grossman of Sierra Nevada Brewing Co.

Ken Grossman, Sierra Nevada Brewing Co. Watch the video here

On location with Vinnie Cilurzo of Russian River Brewing Co.

Vinnie Cilurzo, Russian River Brewing Co. Watch the video here

MoreBeer! YouTube channel — 30.5K subscribers, 496 videos

30.5K subscribers, 496 videos.

Give me an inch.

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.

KlaviyoShopify PlusSmile.io Looker StudioGA4Meta Ads Google AdsHTML / CSSAI-assisted analysis

Watch me take a mile.

Lifecycle, CRM, or retention roles where the customer data actually informs the program.