# Abandoned Cart Email Writer

> A three-email recovery sequence with no discount in email one — reminder, objection, last call. It won't invent urgency, and it never sends.

- Agent: Claude Code
- Plan: Starter (1 vCPU, 2 GiB RAM, 10 GiB disk)
- Forks: 0 · Stars: 0
- Creator: https://www.jurniti.com/creator-ca0ff2
- Tags: cart-recovery, claude-code, e-commerce, ecommerce, email, klaviyo, shopify
- Requires config (you provide): ANTHROPIC_API_KEY
- Skills: cart-recovery-writer

**To fork:** open https://www.jurniti.com/templates/abandoned-cart-email-writer and use the Fork action — it starts a Stripe Checkout for a new VM seeded with this template's persist disk (same flat plan price, no fork fee).

## README

# A 10% code in email one is how the discount becomes the price

Cart recovery "works" — the recovery rate looks great. What actually happened: you
discounted the people who were going to buy anyway, and taught everyone else that
abandoning the cart is how you get 10% off.

So this writes **no discount in email one.** Ever. That's the rule that protects
the margin, and it's in a file you can read.

## Three emails, each with a job

- **+1 hour — the reminder.** No discount, no urgency. Most abandons are a phone
  call or a dead battery, not a price objection. Restore the cart and get out of
  the way.
- **+24 hours — the objection.** Still no discount. It answers the *specific* reason
  your category gets abandoned — shipping cost, sizing doubt, returns worry,
  payment trust — and it asks you which one rather than assuming price.
- **+72 hours — last call.** Scarcity **only if true**. A discount here at the
  earliest, and only if you opted in.

Ask for a discount in email one and it pushes back once with the reason, then
records that you overrode it.

## It won't invent urgency

"Only 3 left!" on an unlimited-stock item is a lie that costs you the customer you
just recovered. Stock levels, delivery dates and return windows come from your
export or from you — never from the model.

## Written to the cart, not to a segment

An email naming the actual item beats "you left something behind". It uses what the
export gives — item, variant, price, cart value, repeat-buyer status — and anything
absent stays absent.

High cart value gets the objection email, not a bigger discount. Low cart value may
not deserve three emails at all, and the **segment note** says so.

## Compliance is in the rules, not assumed

Unsubscribe in all three emails. Postal address for CAN-SPAM, or
`[MISSING: postal address]` if you haven't supplied one. No misleading subject
lines — fake `Re:` threading is the fastest route to a spam folder.

## Subject lines are for testing

Three variants per email, and it never names a winner. There's no data to pick one
and the rules forbid pretending otherwise.

## What you supply

Your own Claude Code login, plus an abandoned-checkout export (Shopify: Orders →
Abandoned checkouts) in `~/cart/exports/`.

No ESP key. The export is the input, which is also why nothing can send.

## Where this stops

It writes copy to paste into Klaviyo, Shopify Email, or whatever you use. It does
not send, connect to an ESP, or schedule anything.

It won't quote a recovery-rate benchmark — it has neither your data nor a citable
source. And it's for cart abandoners, who consented; a purchased list is a
different thing and out of scope.

Verified on build: the skill, the working tree, the `NEVER_SEND` guard, the
no-discount-in-email-one rule, the three-email structure and the compliance rules
are present on a fresh fork. Running it on your own carts is yours to do.
