# The second-purchase email flow for holiday buyers

Canonical: https://brew.new/blog/second-purchase-email-flow
Author: Philip Sørensen
Published: 2026-10-02
Updated: 2026-10-02

A second-purchase flow is an automated email sequence for customers who have bought from you exactly once. Its only job is the second order, and it stops when that order lands. Many stores send nothing between "your order has shipped" and the next newsletter. That gap hurts most after Q4, when first-time buyers peak and many bought a gift.

## Key takeaways

- Lifetimely's 2025 DTC report (77 million Shopify customers): 14.7% of new customers bought again within 90 days, against 33% of returning customers.
- Reward's UK card data: 19% of December-acquired customers return within three months, against 23% to 26% at other times of year.
- Time the flow from delivery, not the order date.
- Split gift buyers from self-purchasers. You can't market to the recipient.
- Check "still one order" before every send and hold discounts until late. A 20% code on a $60 order at 55% gross margin gives away over a third of the gross profit.

## Why the second order is the one to work on

Shopify analytics vendor Lifetimely published its [2025 DTC Mega Report](https://useamp.com/blog/2025-dtc-mega-report/) in August 2026 from 107 million orders and 77 million customers across Shopify DTC brands. New customers repurchased within 90 days at 14.7%. Customers who had come back once did so at 33%, and 51.4% within a year. Vendor numbers, but clear: one order to two is the hard step.

Holiday buyers are harder. Reward, a UK loyalty and card-data company, published [Golden Quarter 2026](https://rewardinsight.com/news/turn-seasonal-spending-into-lasting-value/) on 30 September 2026, using more than 1.4 billion card transactions from 10% of UK households (January 2023 to July 2026). Only 19% of December-acquired customers bought again within three months, against 23% to 26% otherwise, and 30% against 54% in grocery. First-time shoppers rise to about 18% of a retailer's buyers in December, from 14% to 16% normally. And the pool is big: Adobe reported US shoppers spent [$257.8 billion online between 1 November and 31 December 2025](https://news.adobe.com/news/downloads/pdfs/2026/01/010726-holiday-shopping-season-2025.pdf), up 6.8% year over year.

In *Loyalty Rules!* (2001), Bain's Frederick Reichheld reported that in [apparel e-tailing, repeat customers spent more than twice as much in months 24 to 30 of the relationship as in the first six months](https://www.bain.com/contentassets/29f74ec417fa4e36a1d7d7e7479badc5/loyalty_rules_chapter_one.pdf). The chapter's famous "5% more retention, 25% to 95% more profit" claim comes from 1990s cross-industry studies. Your own cohort report is the better forecast.

## What changes for holiday buyers

### Gift buyers and self-purchasers need different flows

Don't ask a gift buyer how they like their new serum, let alone remind them to refill it. A Shopify order has separate [shipping and billing addresses](https://shopify.dev/docs/api/admin-rest/latest/resources/order), so a shipping name that differs from the billing name is a strong gift signal. So are gift messages, gift wrap and a "this is a gift" checkbox. When signals disagree, use the gift track.

### The recipient is not on your list

A delivery-update address is not marketing permission. The UK ICO's guidance on the [products and services soft opt-in](https://ico.org.uk/for-organisations/direct-marketing-and-privacy-and-electronic-communications/guidance-on-direct-marketing-using-electronic-mail/how-do-we-comply-with-the-pecr-electronic-mail-marketing-rules/) says you must get the details directly from the person you want to email, in the course of a sale to them. The recipient fails both tests, so put a signup card in the box.

### January is also returns season

The National Retail Federation's [2025 retail returns report](https://nrf.com/media-center/press-releases/consumers-expected-to-return-nearly-850-billion-in-merchandise-in-2025), published in October 2025, found retailers expected 17% of holiday sales to come back. Refunds and returns should exit the flow, and the gift track should lead with exchange and gift receipt details. Delivery-based timing also spreads sends across January instead of one blast on 2 January.

## Designing the flow

### Start the clock at delivery

In December, "order date plus three days" can put the setup email ahead of the box. Shopify tracks delivery: a fulfillment's [`shipment_status`](https://shopify.dev/docs/api/admin-rest/latest/resources/fulfillment) moves through values such as `in_transit` and `out_for_delivery` to `delivered`, from carrier tracking. If your backend sees it, the delivered timestamp is day 0. Otherwise, Wait typical transit time plus a day after shipping, longer in December.

### Lead with education, not products

The first email helps them use what they bought: setup, care, fit, or when to expect results. Use a real reply-to and sell nothing. A reply asking for help lets you fix a problem before it becomes a return.

### Ask for a review once, and ask everyone

Ask a week after delivery for daily-use products, two weeks for durables and apparel. Ask gift buyers about the order.

The US FTC's [rule on consumer reviews](https://www.ecfr.gov/current/title-16/chapter-I/subchapter-D/part-465), in effect since 21 October 2024, applies twice. Section 465.4 bans incentives conditioned on a review expressing a particular sentiment, positive or negative, so "10% off for a review" is fine only if every review qualifies. The FTC's [explanation of the final rule](https://www.federalregister.gov/documents/2024/08/22/2024-18519/trade-regulation-rule-on-the-use-of-consumer-reviews-and-testimonials) also says a solicitation sent only to customers you believe are happy is not a "generalized solicitation". Ask everyone, not just the smiley-face clickers.

Northwestern's Spiegel Research Center found that [a product with five reviews was 270% more likely to be purchased than one with none](https://spiegel.medill.northwestern.edu/how-online-reviews-influence-sales/), with most of the gain from the first five.

### Set replenishment windows from usage, then from your data

For consumables, remind just before the first one runs out. Start with arithmetic:

| Product | How to set the window | Example |
| --- | --- | --- |
| Fixed-dose consumable | Units ÷ daily dose, minus shipping time and a buffer | 60 capsules at 2 a day lasts 30 days. Remind at day 21 to 23 after delivery. |
| Measured consumable | Size ÷ typical daily use | A 340 g coffee bag at 20 g a cup, 2 cups a day, lasts about 8 days. Offer a subscription instead. |
| Variable-use consumable (skincare, cleaning) | Median days from first to second order for that product | Use your own data. |
| Apparel, durables, gifts | No refill. Cross-sell instead | Care and fit first, then complementary items. |

After a season, use your own numbers. Shopify's [customer reports](https://help.shopify.com/en/manual/reports-and-analytics/shopify-reports/report-types/default-reports/customers-reports) include a cohort analysis of repeat purchases by month of first order, and Klaviyo's [repeat purchase timing chart](https://help.klaviyo.com/hc/en-us/articles/26685770823451) shows days to next order by product or category. Use the median. Late outliers drag the mean past your early returners.

### Cross-sell from what they bought

Name the first purchase and suggest one or two things that go with it. Skip the recommendation engine: map each of your top 20 first-purchase products to the item that most often comes next in your orders. You can check every row.

### Decide on the discount before you write the copy

No discount early. It hands margin to people who would have bought anyway. A $60 second order at 55% gross margin is $33 of gross profit before shipping. A 20% code costs $12, or 36% of it.

Klaviyo's [2025 BFCM recap](https://www.klaviyo.com/newsroom/bfcm-holiday-shopping), across a stable cohort of 10,000 brands, reported discounts fell 10% year over year while repeat-customer revenue grew 13.5%, and brands with the smallest discounts grew fastest, at 14%. Vendor data on one week, but it points the same way.

If you use one, send it once, late, to contacts still on one order, with a real end date ("ends 9 February"). Free shipping or a sample often costs less. Compare second-order rates against a holdout after 60 days.

### Exit and suppression rules

Check before every email, not only at entry:

- **They bought again.** Move them to your repeat-customer program.
- **The order was cancelled, refunded or returned.** Stop selling.
- **They unsubscribed, bounced or complained.** Remove them from the flow.
- **A support ticket is open.** If your email platform sees helpdesk data, pause until it closes.
- **They entered again.** A second order fires the same trigger, so check at entry too.

## The flow, step by step

Day 0 is delivery, or shipping plus transit time.

| Day | Trigger or condition | Content | Exit before sending if |
| --- | --- | --- | --- |
| 0 | Delivered, exactly 1 order | Enter. Split into self-purchase and gift tracks. | Order count above 1 |
| 1 | Self-purchase | Setup, care, what to expect. Real reply-to. No products. | Second order, refund, unsubscribed |
| 3 | Gift | To the buyer: "Did it arrive in time?", gift receipt, exchange link, return window. | Second order, refund, unsubscribed |
| 5 | Self-purchase | Usage tips plus one complementary item. | Second order, refund, unsubscribed |
| 7 to 14 | Both. Daily-use at 7, durables at 14 | Review request, same for all, no rating-tied incentive. Gift buyers rate the order. | Second order, refund |
| Window minus 7 | Self-purchase, consumables | Reorder reminder with one-click link, or subscription offer. | Second order |
| 21 | Self-purchase, non-consumables | Cross-sell two items that go with the first purchase. | Second order |
| 21 | Gift | Something for the buyer, from the category they gifted. | Second order |
| 35 | Both, still 1 order | Optional: one incentive with a fixed end date. Skip for the holdout. | Second order |
| 42 | End | Move to newsletters, or win-back after your inactivity window. | n/a |

![Flow diagram of a second-purchase email flow. Day 0 delivery splits into a self-purchase track (setup email on day 1, complementary item on day 5, review request on day 7 to 14, replenishment or cross-sell on day 21, optional incentive on day 35) and a gift track (arrival and exchange email on day 3, review of the order on day 14, an item for the buyer on day 21, optional incentive on day 35). A bar below lists the exit rules checked before every send.](/images/blog/second-purchase-email-flow-diagram.png)

*Two tracks from one delivery event, same exit rules before every email.*

Quiet contacts later go to a [win-back flow](/blog/win-back-emails).

## Building it in Brew

A Brew automation is a trigger followed by Send Email, Wait, Filter and Split nodes. Waits run minutes to weeks. Filters and Splits read the trigger payload and contact fields when the node runs, so a Filter before each email is a live order check. The [automations docs](https://docs.brew.new/create-emails/automations) cover each node.

### What the Shopify and Stripe triggers give you

Brew's Shopify integration takes 13 webhook topics, including `orders/paid`, `orders/fulfilled`, `orders/cancelled`, `fulfillments/create` and `fulfillments/update`. Order events carry `orderNumber`, `totalPrice`, `currency`, `financialStatus` and `fulfillmentStatus`. Fulfillment events add `trackingNumber` and `trackingUrl`. Every Shopify event updates contact fields such as `shopify_last_order_id`, `shopify_last_order_total` and `shopify_last_order_at`. For Stripe stores, `checkout.session.completed` carries `amount`, `currency`, `paymentStatus` and `sessionMode`, and `charge.refunded` and `refund.created` cover refunds.

A no-code version works: trigger on `orders/fulfilled`, Wait for transit, then send setup, review and cross-sell emails. For gift splits, per-product refills and order counts, use a custom trigger. Built-in payloads carry no line items, no carrier `delivered` status (`fulfillmentStatus` is the fulfillment's own, such as `success`) and no order count. Shopify [removed `orders_count` from customer webhook payloads in API version 2025-01](https://shopify.dev/changelog/new-customer-s-webhook-and-changes-to-existing-customer-s-webhooks-payload), and Brew doesn't receive its replacement topic, `customers/purchasing_summary`, or Shopify refunds.

### The custom trigger version

Fire a trigger such as `order_delivered` from your backend on delivery. Brew starts every live automation bound to it and writes top-level scalar payload fields onto the contact, so `orderCount` becomes filterable.

```bash
curl -X POST "https://brew.new/api/v1/automations/triggers/$TRIGGER_ID/fire" \
  -H "Authorization: Bearer $BREW_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: delivered-1042" \
  -d '{
    "payload": {
      "email": "alex@example.com",
      "firstName": "Alex",
      "orderNumber": "#1042",
      "orderCount": 1,
      "isGift": false,
      "category": "supplements",
      "refillDays": 23,
      "items": [{ "name": "Magnesium glycinate, 60 caps", "url": "https://example.com/p/mag-60" }]
    }
  }'
```

1. A Filter on `orderCount` equals 1 after the trigger, so repeat customers never enter.
2. A Split on `isGift` into the two tracks.
3. In the self-purchase track, a Split on `category` for consumables. Splits have two paths, so chain them for more groups. Waits are fixed, so give each refill group its own branch and Wait (14, 21 or 28 days) instead of reading `refillDays`.
4. A Filter on `contact.orderCount` equals 1 before every Send Email.
5. Name the product with Liquid, `{% for item in trigger.items %}{{ item.name }}{% endfor %}`, with a name fallback: `Hi {{ firstName | there }},`. See the [merge tag docs](https://docs.brew.new/create-emails/merge-tags).

Keep `orderCount` current by upserting the contact on every paid order through `POST /v1/contacts`, for example `{ "contacts": [{ "email": "alex@example.com", "customFields": { "orderCount": 2 } }] }`. The next Filter sees two orders and they exit. Same for a `refunded` field.

There's no random-split node, so have your backend set a random `holdout` boolean and Filter on it before the incentive. Send from a marketing-purpose domain, which respects unsubscribes. Transactional-purpose domains deliver to unsubscribed contacts. More in [triggered email automations](/blog/triggered-email-automations-guide) and the [abandoned cart guide](/blog/abandoned-cart-emails).

## Frequently asked questions

### When should I send the first post-purchase email after an order?

The day after delivery, with setup and care. In December, order-based timing often beats the product there.

### How long after delivery should I ask for a review?

A week for daily-use products, two for durables and apparel. Ask every buyer the same way, since the FTC's review rule bans rewards tied to positive reviews and asking only happy customers is not a generalized solicitation.

### Should I offer a discount to get a second purchase?

Not early. Send any incentive once around day 30 to 35 to contacts still on one order, with a fixed end date, and keep a holdout to see whether it produced extra orders.

### Can I email the person who received a gift?

Not for marketing, unless they sign up themselves. The UK ICO's soft opt-in requires details obtained directly from the person, during a sale to them. A signup card in the box solves it.

### How do I stop the flow when someone buys again?

Keep an order-count field on the contact, update it on every paid order, and check it before every email. Do the same for refunds.

### How do I find the right replenishment window?

Start with units divided by daily use, minus shipping and a buffer. After a season, use your median days from first to second order for that product.
