Website
A written brief became a coded HTML and CSS site, then was redesigned in place.
Open the site →Case study · fictional brand
ASHGROVE started as a one-page brief. It grew into a website, a design system, a shop that talks to Klaviyo, newsletters, social and four automated customer journeys. Every part was built by describing what it should feel like and letting Claude do the building.
ASHGROVE is a fictional brand. The shoppers, orders and prices are invented. Test emails went only to the author's own inboxes, and no flow was ever switched on. This page shows the method, not sales results.
One brief became a coded website, then a design system that every later piece reused. Because the rules lived in one place, a shop, an email and a reel all look like the same company.
A written brief became a coded HTML and CSS site, then was redesigned in place.
Open the site →Colours, type and components extracted once and reused everywhere.
Open the design system →
A full guidelines document, and the same logo, palette and fonts loaded into Canva's Brand Kit.
Open the PDF →A twelve-piece demo shop, so the marketing has something real to point at: three tees, three knits, three coats and three accessories, each with a flat-lay and a worn-on-model photograph.
The shop carries Klaviyo's onsite tracking. When a shopper views a product, adds to the cart or opens the cart to check out, Klaviyo records the event on their profile. Those events are what start the Abandoned cart journey in chapter 04.
A real store has strangers walking in, and a demo that collects strangers' email addresses is a risk. So the public shop has no sign-up form. Visitors browse normally and nothing is stored about them.
For the demo, a hidden "Browse as" picker lets the author play one of four shoppers: Rajiv the new subscriber, Sam the cart abandoner, Leo the repeat buyer and Hugo the lapsed customer. The picker identifies a shopper by an email that already exists, with nothing to type. Anything the author does next lands on that person's profile, so a journey can be watched from end to end.
Content made to go out: newsletters, social and motion. Same palette, same voice, nothing hand-drawn in a design tool.
Three newsletters, refined in place, sent through Klaviyo.



On-brand product imagery, generated and laid out for feed and ads. Nothing was posted to a real Instagram account and there are no ads running.



An animated Instagram Reel, art-directed entirely through chat and exported from Canva. It was not posted anywhere.
Social is the top of the funnel. Posts and ads would bring people to the shop, the shop's tracking tells Klaviyo what they did, and the lifecycle flows take over from there.
A newsletter goes to everyone at once. A lifecycle programme speaks to each shopper according to what they have done. This chapter shows how ASHGROVE's customers were sorted, which journeys they travel, and how each one was tested before anything could send.
The strategy in short: four objectives come first, each with its own journey. Welcome new subscribers, recover abandoned carts, bring first-time buyers back for a second order, and win back lapsed customers. Each wait has a reason: one hour for a cart, because the shopper is still thinking and a buyer in that hour must not get a reminder; three days between the two post-purchase emails, so the second lands after the parcel; five days between the two win-back emails, so the second tells a different story; and 90 days before the same person can re-enter post-purchase. A real programme would track first-order rate, recovered-cart rate, second-order rate within 90 days and win-back rate. None are claimed here, because nothing was sent.
87 invented shoppers. 82 have no email address at all, so they can never be messaged. Four have the author's own inboxes, each playing one stage of the customer lifecycle. 83 backdated orders (all invented, in USD) give each shopper a believable history.
Five live segments sort everyone by what they have bought and when. The numbers below are from the recount on QA day, with the original build-day number underneath.
Zero orders, ever.
One order, in the last 30 days.
Two or more orders, one in the last 60 days.
No order in 60 days, one in the last 120.
No order in 120 days, but bought once.

Two days after building the segments the total fell from 87 to 85. Nothing was deleted. The segments use time windows, so shoppers move along as days pass. First-time buyers, for example, are people who bought in the last 30 days, and two of them crossed that line.
That also revealed a gap. A shopper with one order from 30 to 60 days ago now fits no stage, because they are too old to be a first-time buyer and too recent to be fading. Two people sit in that gap today. It was left in place on purpose and written up as a finding: time-based segments drift, so they need a recount, and their edges need testing.
The five stages with the flow that speaks to each. The hatched columns are gaps: no flow today.
Welcome (on joining the list) and Abandoned cart (on starting checkout) are triggered by events, not by stage. Never ordered, the biggest stage, and Fading have no flow today. Two flows are proposed, not built: a browse nudge for Never ordered and a "we saved your favourites" email for Fading. Full map and details → · Back to the Instagram section ↑
Each journey starts from something a shopper does, then waits and sends. All four were built and tested, and every one stayed in Draft, the state in which nothing can send.
Starts when someone joins the newsletter list. Three emails over five days that introduce the brand's one idea: fewer things, better made.
Rule: each person goes through once. A safety filter lets only people marked as allowed to receive demo email in.
Starts when someone opens the checkout. An hour later, anyone who has not bought gets a reminder with their own cart in it.
Rule: the same person can enter again only after 7 days, so a browser who keeps returning is not nagged.
Starts when an order is placed. A care guide first, then a suggestion of what goes with what they bought.
Rule: a repeat customer can enter again after 90 days. A scarf bought after a jacket deserves the care guide again.
Starts when a customer drifts into the Lapsed stage. Two emails, spaced out, with a different story each time.
Rule: each person goes through once.


The second Welcome email reads the shopper's favourite category and changes the product, the price, the photograph and the button. If the shopper has no name or no favourite, it falls back to a sensible default instead of leaving a gap.

"Hi Hugo,"

"Hi Sam,"

"Hi there,"
Eight test sends in total: six to the author's Zoho inbox (the first three never arrived, until the sending domain was activated), then one each to Gmail and Outlook. Each journey was also previewed with the shoppers it is meant for.
| Check | What was tested | Result |
|---|---|---|
| Inbox placement | One email per inbox: Zoho, Gmail and Outlook | Zoho: Inbox. Gmail: Inbox, Promotions tab. Outlook: Junk. |
| Sender authentication | The Gmail "Show original" headers | SPF, DKIM and DMARC all pass. |
| Journey entry | Previewing the Welcome flow as a shopper off the list, then on it | Off the list: "Doesn't enter". On the list: "Enters". |
| Personalisation | Welcome 2 as three different shoppers | Correct product and price for each. |
| Missing data | A shopper with no name and no category | "Hi there" and the default product, no blanks. |
| Links | Every button's destination | One tagged button per email, all resolve. |
| Segment recount | Counts against build-day numbers | 85 against 87: window drift and one gap, explained above. |

The email passed every check and Outlook still put it in Junk. A new sending domain has no history. A real launch would start with small volumes and build a reputation first.
Counts shift as days pass, and the edges between stages can leave people in no stage at all. Test the boundaries, then check them again later.
Personalisation that works for a shopper with complete data can still break for one without. Both were previewed.
Every journey carries a filter that only lets demo-approved people in, and the audience is limited to four inboxes the author owns. A mistake could not reach a stranger.
Read the detailed lifecycle case study →