A day-by-day flow that turns holiday first-time buyers into repeat customers: delivery timing, refills, cross-sell, gift buyers, offers and exit rules.

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.
Shopify analytics vendor Lifetimely published its 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 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, 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. 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.
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, 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.
A delivery-update address is not marketing permission. The UK ICO's guidance on the products and services soft opt-in 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.
The National Retail Federation's 2025 retail returns report, 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.
In December, "order date plus three days" can put the setup email ahead of the box. Shopify tracks delivery: a fulfillment's shipment_status 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.
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 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, 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 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, with most of the gain from the first five.
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 include a cohort analysis of repeat purchases by month of first order, and Klaviyo's repeat purchase timing chart shows days to next order by product or category. Use the median. Late outliers drag the mean past your early returners.
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.
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, 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.
Check before every email, not only at entry:
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 |

Two tracks from one delivery event, same exit rules before every email.
Quiet contacts later go to a win-back flow.
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 cover each node.
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, and Brew doesn't receive its replacement topic, customers/purchasing_summary, or Shopify refunds.
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.
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" }]
}
}'orderCount equals 1 after the trigger, so repeat customers never enter.isGift into the two tracks.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.contact.orderCount equals 1 before every Send Email.{% for item in trigger.items %}{{ item.name }}{% endfor %}, with a name fallback: Hi {{ firstName | there }},. See the merge tag docs.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 and the abandoned cart guide.
The day after delivery, with setup and care. In December, order-based timing often beats the product there.
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.
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.
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.
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.
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.
