Karmameju is a Danish skincare brand with its own webshop in several markets. Email automation is the brand’s strongest channel measured per send, because every email is triggered by a specific action from one specific customer.
Opportunity
Automation flows perform better than campaigns, because the context is already known. Even so, the anatomy of a typical flow email looks the same almost everywhere: the subject line is static, the preheader is static, the hero image was chosen six months ago, the body copy is static. Only the product module adapts to the recipient. Five elements, of which one moves.
That is not a quality problem. It is a limitation in the traditional flow builder: it can only do what someone has written a rule for, and no one has time to write rules for every combination of product, season, purchase history and customer type.
The question was therefore not whether to send more emails. It was how much of an existing send could be decided per recipient instead of per flow — and what that would move on the far side of the open.
Solution
The first step was a prioritisation, not a build. The flows were ranked by number of triggers per month and the amount of data per recipient. Abandoned cart, browse abandonment and back in stock came out on top, and the three were built on the same foundation.
The setup sits as a layer between the trigger and the send:
The event is pulled the second the flow triggers, with the customer’s profile and the product she has viewed or added to the cart.
Order data is checked for whether the product has already been bought within the past 25 days. If so, the flow stops. The cheapest personalisation is the email that is never sent.
Product data is pulled in from the webshop: full description, variants, current price, sale status and tags. That is the only factual basis the model has.
Review data is pulled in, so the rating and the number of reviews are correct at the moment of sending.
The image library is read, so the model picks a hero image from the files that actually exist — not from the files it could imagine.
The brand’s tone is written into the model as a fixed instruction: form of address, sentence length, approved and unapproved terminology, persona. The most important lines are the negative ones — no price, no discount, no artificial urgency, no exclamation marks, and never a claim about the product that is not in the product description.
The model returns subject line, preheader, hero copy and image choice as structured data, written back to the email platform as properties on the event. The send itself is unchanged in the email system.
Three things are deliberately deterministic. Prices, stock status and links are pulled from the system and inserted as variables — they are never generated as text. The image choice is validated against the actual file list, and if nothing matches, a defined fallback is used. And if a call fails, or data is missing for an individual recipient, the flow sends the static standard version rather than nothing. A personalisation setup that can block a send is a risk, not an asset.
Results
The setup was measured on browse abandonment — deliberately the weakest intent signal in the whole portfolio. Product, price, offer and timing logic are unchanged. The only thing that has changed is who the content decision is made for.
Click rate rose 87 per cent, purchase rate 26 — open rate barely moved
Relative change on a browse abandonment flow, the weakest intent signal in the whole portfolio.
Stripped of the open effect, the click increase corresponds to roughly 78 per cent more clicks per open. The gain therefore lies after the open — exactly the part most setups leave static.
The foundation was built once and reused across flows, so the cost of adding the next flow is marginal.
