How to Build Post-Quiz Email Flows in Klaviyo¶
Most merchants stop at the results email. The quiz finishes, Klaviyo sends the recommendation, and that is the end of it. That email is worth building, but it reaches the customer once. This article covers the emails you can send in the weeks that follow.
The customer tells you their skin type, their main concern, their goal and their budget. No tracking pixel or purchase history gives you that. It is called zero-party data, because the customer gave it to you directly. Every answer is saved to a Klaviyo profile as soon as the quiz ends. You can filter a segment on any of those answers, then send a different email to each segment.
Across the RevenueHunt platform, 1 in 5 quiz-attributed orders is placed more than 30 days after the quiz. A segmented Klaviyo send earns roughly 3x the revenue per recipient of a generic one. The flows below are how you reach those customers.
You need two connections to Klaviyo, not one
These flows combine two data sources inside Klaviyo:
- RevenueHunt → Klaviyo sends the quiz data: answers, customer tags, recommended products. This is what you segment and personalize on.
- Your store → Klaviyo sends what the customer does in your store:
Started Checkout,Placed Order,Viewed Product. These events start the cart, browse, reorder and cross-sell flows.
You need both. The results email and the win-back flow need only connection 1. The other four flows need connection 2 as well. Set up connection 2 in Klaviyo, with your platform's own integration. See the prerequisites for your platform below.
Prerequisites¶
- Your quiz has an email question and you connected RevenueHunt to Klaviyo via OAuth with
Send Quiz Leads to Klaviyo Profilesenabled. - You have tagged your quiz answers so answers arrive on the profile as customer tags.
- Your Shopify store is connected to Klaviyo through Klaviyo's native Shopify integration, so events like
Started Checkout,Placed OrderandViewed Productreach Klaviyo. Without it, the other four flows have nothing to start them.
- Your quiz has an email question, and you connected RevenueHunt to Klaviyo with your Public API Key. A Private API Key is also needed to add contacts to a list.
- You have tagged your quiz answers.
- Your Shopify store is connected to Klaviyo through Klaviyo's native Shopify integration, so
Started Checkout,Placed OrderandViewed Productevents reach Klaviyo.
Legacy quizzes send different property names
A legacy Shopify quiz sends the older Klaviyo property format (PERMALINK, Q-, SLOT-, T-), which changes the segment, trigger filters and personalization tokens below. Consider migrating to Built for Shopify for the modern property set and one-click OAuth.
- Your quiz has an email question and you connected RevenueHunt to Klaviyo with your Public API Key (and a Private API Key for lists).
- You have tagged your quiz answers.
- Your WooCommerce store is connected to Klaviyo through Klaviyo's WooCommerce integration (the Klaviyo plugin), so
Started Checkout,Placed OrderandViewed Productevents reach Klaviyo.
- Your quiz has an email question and you connected RevenueHunt to Klaviyo with your Public API Key (and a Private API Key for lists).
- You have tagged your quiz answers.
- Your Magento (Adobe Commerce) store is connected to Klaviyo through Klaviyo's Magento extension, so
Started Checkout,Placed OrderandViewed Productevents reach Klaviyo.
- Your quiz has an email question and you connected RevenueHunt to Klaviyo with your Public API Key (and a Private API Key for lists).
- You have tagged your quiz answers.
- Your BigCommerce store is connected to Klaviyo through Klaviyo's BigCommerce integration, so
Started Checkout,Placed OrderandViewed Productevents reach Klaviyo.
- Your quiz has an email question and you connected RevenueHunt to Klaviyo with your Public API Key (and a Private API Key for lists).
- You have tagged your quiz answers.
No native store events on Standalone
A standalone quiz has no ecommerce platform feeding purchase and cart events into Klaviyo. Unless you send those events yourself through Klaviyo's Track API, four of the flows have nothing to start them: cart, browse, reorder and cross-sell. On Standalone, build the results email and the win-back flow, which need only the RevenueHunt sync.
New to Klaviyo automations? Read Klaviyo's Getting started with flows first.
How the six emails fit together¶
Every quiz needs the results email, sent the moment the quiz finishes. Five more emails follow, and each one is sent when the customer does something specific. You do not need all six on day one. Build the results email first, then add the flows that matter most for your category. See Which flows to build first, by industry.
| Flow | Klaviyo trigger | When it fires | Needs store→Klaviyo? |
|---|---|---|---|
| Results delivery | Added to segment (or list) | Immediately | No |
| Cart abandonment | Metric: Started Checkout |
1-4h, 24h, 72h | Yes |
| Browse abandonment | Metric: Viewed Product |
4h, optional +3 days | Yes |
| Replenishment | Metric: Placed Order |
N days before run-out | Yes |
| Cross-sell | Metric: Placed Order |
7-14 days after | Yes |
| Win-back | Added to segment | 60-120 days inactive | No |
Every flow reads the same quiz answers. Only two things change from one flow to the next: what starts it, and when it is sent.
Set up once¶
These steps are the same for every flow.
Know what the quiz sends¶
Every completion writes a set of custom properties to the Klaviyo profile. You reference these in segment definitions, conditional splits and email templates. The exact names include your quiz ID, so they are unique to your quiz.
Your quiz sends these custom properties:
ANSWER_BY_BLOCK-<blockRef>-<QuizID>: the answer to one question. Overwritten on each retake.ANSWERS_BY_BLOCK-<QuizID>: present on every customer who finished the quiz. Use it to detect them.TAGS-<QuizID>: the customer tags from your quiz logic. Your main segmentation lever.RECOMMENDATIONS_BY_SLOT-<QuizID>: recommended products (title, price, image, URL). JSON object, appended on each retake.RESPONSE_ID-<QuizID>: the unique response ID. Use it to link back to the results page.QUIZ_NAME-<QuizID>: the quiz name. Handy in subject lines.
Your quiz sends these custom properties:
PERMALINK-<QuizID>: present on every customer who finished the quiz. Use it to detect them.Q-<QuizID> <blockId>: <question text>: the answer to one question.SLOT-<QuizID>: <slot name> - product_<n>_<field>: a recommended product's field (name,price,sku,url,image_url), where<n>starts at 0.T-<QuizID>: <tag>: a customer tag. Present on the profile when that tag was applied.
Your quiz sends these custom properties:
PERMALINK-<QuizID>: present on every customer who finished the quiz. Use it to detect them.Q-<QuizID> <blockId>: <question text>: the answer to one question.SLOT-<QuizID>: <slot name> - product_<n>_<field>: a recommended product's field (name,price,sku,url,image_url),<n>starts at 0.T-<QuizID>: <tag>: a customer tag, present when applied.
Your quiz sends these custom properties:
PERMALINK-<QuizID>: present on every customer who finished the quiz. Use it to detect them.Q-<QuizID> <blockId>: <question text>: the answer to one question.SLOT-<QuizID>: <slot name> - product_<n>_<field>: a recommended product's field (name,price,sku,url,image_url),<n>starts at 0.T-<QuizID>: <tag>: a customer tag, present when applied.
Your quiz sends these custom properties:
PERMALINK-<QuizID>: present on every customer who finished the quiz. Use it to detect them.Q-<QuizID> <blockId>: <question text>: the answer to one question.SLOT-<QuizID>: <slot name> - product_<n>_<field>: a recommended product's field (name,price,sku,url,image_url),<n>starts at 0.T-<QuizID>: <tag>: a customer tag, present when applied.
Your quiz sends these custom properties:
PERMALINK-<QuizID>: present on every customer who finished the quiz. Use it to detect them.Q-<QuizID> <blockId>: <question text>: the answer to one question.SLOT-<QuizID>: <slot name> - product_<n>_<field>: a recommended product's field (name,price,sku,url,image_url),<n>starts at 0.T-<QuizID>: <tag>: a customer tag, present when applied.
Find your exact property names on a test profile
Take a test quiz with a sample email, then open Klaviyo > Audience > Profiles and search for it. The profile shows every property your quiz sends, with the exact block references, slot names and quiz ID. Copy the names from there. See Use Quiz Data in Klaviyo Email Templates for the full reference and the {{ person|lookup:'...' }} syntax.
Create your Quiz customers segment¶
Every flow below uses this segment. It holds everyone who finished the quiz. Two flows use it as a trigger, results delivery and win-back, and the rest use it as a filter.
- In Klaviyo go to
Audience > Lists & Segmentsand clickCreate New > Segment. - Set the definition to
Properties about someone, chooseANSWERS_BY_BLOCK-<QuizID>, and set the condition tois set. - Save. A new customer joins automatically.
Segment on a specific answer or tag
To target some of those customers rather than all of them, filter on a specific value instead, for example TAGS-<QuizID> contains Color-Treated, or ANSWER_BY_BLOCK-<blockRef>-<QuizID> equals Oily. That is how you build a version of any flow below for one group of customers.
- In Klaviyo go to
Audience > Lists & Segmentsand clickCreate New > Segment. - Set the definition to
Properties about someone, choosePERMALINK-<QuizID>, and set the condition tois set. - Save. A new customer joins automatically.
Segment on a specific answer or tag
To target some of those customers rather than all of them, filter on a specific value instead, for example T-<QuizID>: Color-Treated is set. That is how you build a version of any flow below for one group of customers.
- In Klaviyo go to
Audience > Lists & Segmentsand clickCreate New > Segment. - Set the definition to
Properties about someone, choosePERMALINK-<QuizID>, and set the condition tois set. - Save. A new customer joins automatically.
Segment on a specific answer or tag
To target some of those customers rather than all of them, filter on a specific value instead, for example T-<QuizID>: Color-Treated is set. That is how you build a version of any flow below for one group of customers.
- In Klaviyo go to
Audience > Lists & Segmentsand clickCreate New > Segment. - Set the definition to
Properties about someone, choosePERMALINK-<QuizID>, and set the condition tois set. - Save. A new customer joins automatically.
Segment on a specific answer or tag
To target some of those customers rather than all of them, filter on a specific value instead, for example T-<QuizID>: Color-Treated is set. That is how you build a version of any flow below for one group of customers.
- In Klaviyo go to
Audience > Lists & Segmentsand clickCreate New > Segment. - Set the definition to
Properties about someone, choosePERMALINK-<QuizID>, and set the condition tois set. - Save. A new customer joins automatically.
Segment on a specific answer or tag
To target some of those customers rather than all of them, filter on a specific value instead, for example T-<QuizID>: Color-Treated is set. That is how you build a version of any flow below for one group of customers.
- In Klaviyo go to
Audience > Lists & Segmentsand clickCreate New > Segment. - Set the definition to
Properties about someone, choosePERMALINK-<QuizID>, and set the condition tois set. - Save. A new customer joins automatically.
Segment on a specific answer or tag
To target some of those customers rather than all of them, filter on a specific value instead, for example T-<QuizID>: Color-Treated is set. That is how you build a version of any flow below for one group of customers.
The three Klaviyo controls¶
Every flow below uses three Klaviyo controls. Each one reads different data, so pick the right one or the flow sends to the wrong people.
- Trigger filter is checked once, when someone enters the flow. It reads only the event that started the flow, so it exists only on flows started by an event. Use it to narrow the event itself, for example to enter the reorder flow only when the customer ordered one specific product.
- Flow filter is checked again before every step. It reads the profile and what the person has done before. Use it to keep the flow to customers who finished the quiz: require your quiz-completion property to be
set. See Know what the quiz sends. It also removes people who no longer qualify, such as anyone who has since placed an order. - Conditional split sends people down two different paths. It reads a profile property, a past action, or list membership. Use it to send one group a personalized email and everyone else a standard one, from the same starting point.
Time delays behave differently with a set send-time
Two steps with nothing between them are sent at the same time, so put a Time delay step between every email. A plain delay counts in 24-hour blocks. A delay set to a time of day counts in calendar days. Remember this when you schedule the 1 hour, 24 hour and 72 hour emails.
The flows¶
Flows 2 to 5 need your store connected to Klaviyo
The cart, browse, replenishment and cross-sell flows trigger on Started Checkout, Viewed Product and Placed Order, which come from your store's native Klaviyo integration, not from RevenueHunt. Confirm connection 2 from the prerequisites is in place. On Standalone these events are not available by default.
1. Results email¶
Recommended for: every quiz, in every industry. No store should skip this one.
This email confirms the quiz result within seconds. It carries the recommendation and a link back to the results page, where the customer adds a product to the cart in one click.
- Trigger:
Added to segment→ yourQuiz customerssegment. (If you route contacts to a Klaviyo list from the email question's list selector, you can trigger on the list instead.) - Reentry: let a returning customer get a fresh result email on every completion. The exact reentry setup differs by platform, so follow the method in Send Email with Each Quiz Retake.
- Personalize: pull the recommendation and link to the results page using the tokens in Personalizing every flow. Use an information recall style subject line: "Your [skin type] routine is ready."
Sending Follow-up Emails via Klaviyo covers this flow from start to finish, and includes an HTML template you can download. The five flows below are built on top of it.
Turn off the app's built-in result email
Once this flow is live, deactivate the app's result email notifications so a customer does not get two.
2. Abandoned cart¶
Recommended for: Fashion, Cosmetics, and any store where customers think before they buy. It is worth building in every industry.
A customer added a recommended product to cart but did not complete the checkout. A plain "your cart is waiting" email works. An email that repeats their quiz answers works better, because it reminds them why the product suits them.
- Trigger: metric
Started Checkout(from your store's Klaviyo integration, where some integrations label itCheckout Started). - Add the quiz data, in one of two ways:
- Dedicated flow: add a flow filter requiring your quiz-completion property
is set, so only customers who finished the quiz stay in. - Branch an existing flow: if you already run a store-wide cart flow, add a
Conditional spliton your quiz-completion propertyis set. A customer who finished the quiz takes the personalized (YES) path. Everyone else keeps the standard copy. This avoids maintaining two flows.
- Dedicated flow: add a flow filter requiring your quiz-completion property
- Flow filter: has not
Placed Ordersince starting the flow (zero times), so buyers stop receiving it. - Timing: three emails at roughly 1-4 hours, 24 hours, 72 hours.
- Personalize: start with the quiz answers rather than the cart. Add a discount to the 72-hour email, to win back a customer who is watching the price. For example: "Your skin is oily and breaks out, so [Product X] is still your best match."
3. Viewed but did not add to cart¶
Recommended for: Fashion, and any store with a large catalog, where customers browse for a while before they buy.
A customer viewed a recommended product but never added it to the cart. This is a gentler reminder than the abandoned cart email.
- Trigger: metric
Viewed Product(orActive on Site). - Flow filter: your quiz-completion property
is set(only customers who finished the quiz), and has notPlaced OrderorAdded to Cartsince starting the flow. - Timing: one email at ~4 hours, an optional second at ~3 days.
- Personalize: add a
Conditional spliton a customer tag from the quiz so a customer never gets a recommendation that contradicts a different quiz answer. Reference both the viewed product and the stated need, for example "You said you wanted lightweight coverage. Here is a closer look at the matte finish."
4. Time to reorder¶
Recommended for: Skincare, Haircare, Supplements, Food & drink, Pets, and any product a customer uses up on a predictable schedule.
If you sell a product that runs out, this flow returns the most revenue. It brings the customer back just before they need more.
- Trigger: metric
Placed Order. - Trigger filter: the ordered item is the consumable product (or in a product tag/collection). This reads the order event, so it belongs in the trigger filter.
- Flow filter: your quiz-completion property
is set(only customers who finished the quiz), and has notPlaced Orderfor that product again since starting the flow. - Timing: set a
Time delayto about 80% of the time the product lasts, so the email arrives before the customer runs out. A 30-day product sends around day 22 to 24. A 60-day supply sends around day 48 to 50. - Personalize: reference the product they bought and their quiz concern. If your quiz asked about usage frequency, split on that answer to set a different delay per profile. For example: "Ready to restock your [concern] routine before it runs out?"
Use the quiz answer to time the delay
If the quiz captured "wash frequency", or "how often do you use this", split the flow on that answer property. Give each branch its own delay. Someone who uses the product every day runs out sooner than someone who uses it once a week. The quiz already told you which they are.
5. Complete the routine¶
Recommended for: Skincare and Haircare, where products are sold as a routine or a bundle. Skip it for Fashion, where a first purchase rarely points to a matching second one.
After the first purchase, offer the rest of the routine. A customer who bought the cleanser for oily skin gets the serum and the moisturizer that match the same answers. This works better than a general bundle offer, because the recommendation comes from what the customer told you.
- Trigger: metric
Placed Order. - Flow filter: your quiz-completion property
is set(only customers who finished the quiz). Optionally exclude anyone who has alreadyOrdered Productthe item you are about to recommend. - Timing: a
Time delayof 7-14 days. - Branch by tag: add a
Conditional spliton a customer tag to recommend the complementary product that matches their profile.
6. Win back a quiet customer¶
Recommended for: every industry. Only the timing changes: about 60 days where customers buy on impulse, about 120 days where they take longer to decide.
Re-engage customers who have stopped buying. The quiz tag lets you name what they wanted, rather than only asking them to come back.
- Build the segment: combine two conditions:
Properties about someone→ your quiz-completion propertyis set(they took the quiz), andWhat someone has done→Placed Orderzero timesin the last 60 to 120 days, so they have gone quiet.
- Trigger:
Added to segment→ this segment of quiet customers. - Branch by tag: a
Conditional spliton a customer tag so aCurly + Dryprofile and aVolume + Anti-Frizzprofile get different copy. - Timing: one email when they join the segment, a second about 14 days later with a discount.
Which flows to build first, by industry¶
The set of flows is the same for every store. What changes is the order you build them in, and how often you send. Start with the results email, then add the two flows that matter most for your category. Add the rest as your traffic grows.
| Industry | Build first (after results email) | Why |
|---|---|---|
| Skincare | Cross-sell + replenishment | Customers reorder routines and refills |
| Haircare | Replenishment (6-8 week cycle) + cross-sell | Products run out on a predictable cycle |
| Supplements & wellness | Replenishment (30-day cycle) + win-back | Offer a subscription in the reorder email |
| Cosmetics & makeup | Cart abandonment + seasonal cross-sell | Customers decide fast, and abandon more carts |
| Fashion & apparel | Cart abandonment + browse abandonment | Customers buy on impulse, so skip cross-sell |
| Food & drink | Replenishment + subscription offer | Customers finish the product on a predictable schedule |
| Pets | Replenishment (food cycle) + cross-sell (accessories) | Food is reordered, and accessories sell alongside it |
If you sell consumables, build replenishment and cross-sell first. If customers buy on impulse, build cart and browse abandonment first. Every store benefits from win-back.
Personalizing every flow with quiz data¶
Every flow personalizes the same way, with these lookups inside an HTML block.
- Answer:
{{ person|lookup:'ANSWER_BY_BLOCK-<blockRef>-<QuizID>' }} - Recommended product:
{{ person|lookup:'RECOMMENDATIONS_BY_SLOT-<QuizID>'|lookup:'<slot>'|lookup:'0'|lookup:'title' }}(swaptitlefordescription,price,onlineUrl, orimage) - Link to their results:
#response-{{ person|lookup:'RESPONSE_ID-<QuizID>' }} - Branch on a tag: in a
Conditional split,TAGS-<QuizID>contains<tag>
Let Quiz Copilot build it
Paste any template into Quiz Copilot and ask it to restyle or trim the code for you, no developer required.
- Answer:
{{ person|lookup:'Q-<QuizID> <blockId>: <question text>'|default:'' }} - Recommended product:
{{ person|lookup:'SLOT-<QuizID>: <slot name> - product_0_name'|default:'' }}(swapproduct_0_namefor_price,_sku,_urlor_image_url, and note the count starts at 0) - Branch on a tag: in a
Conditional split,T-<QuizID>: <tag>is set, or in a template{% if person|lookup:'T-<QuizID>: <tag>' %}...{% endif %}
- Answer:
{{ person|lookup:'Q-<QuizID> <blockId>: <question text>'|default:'' }} - Recommended product:
{{ person|lookup:'SLOT-<QuizID>: <slot name> - product_0_name'|default:'' }}(swapproduct_0_namefor_price,_sku,_urlor_image_url, and note the count starts at 0) - Branch on a tag: in a
Conditional split,T-<QuizID>: <tag>is set, or in a template{% if person|lookup:'T-<QuizID>: <tag>' %}...{% endif %}
- Answer:
{{ person|lookup:'Q-<QuizID> <blockId>: <question text>'|default:'' }} - Recommended product:
{{ person|lookup:'SLOT-<QuizID>: <slot name> - product_0_name'|default:'' }}(swapproduct_0_namefor_price,_sku,_urlor_image_url, and note the count starts at 0) - Branch on a tag: in a
Conditional split,T-<QuizID>: <tag>is set, or in a template{% if person|lookup:'T-<QuizID>: <tag>' %}...{% endif %}
- Answer:
{{ person|lookup:'Q-<QuizID> <blockId>: <question text>'|default:'' }} - Recommended product:
{{ person|lookup:'SLOT-<QuizID>: <slot name> - product_0_name'|default:'' }}(swapproduct_0_namefor_price,_sku,_urlor_image_url, and note the count starts at 0) - Branch on a tag: in a
Conditional split,T-<QuizID>: <tag>is set, or in a template{% if person|lookup:'T-<QuizID>: <tag>' %}...{% endif %}
- Answer:
{{ person|lookup:'Q-<QuizID> <blockId>: <question text>'|default:'' }} - Recommended product:
{{ person|lookup:'SLOT-<QuizID>: <slot name> - product_0_name'|default:'' }}(swapproduct_0_namefor_price,_sku,_urlor_image_url, and note the count starts at 0) - Branch on a tag: in a
Conditional split,T-<QuizID>: <tag>is set, or in a template{% if person|lookup:'T-<QuizID>: <tag>' %}...{% endif %}
The full token reference, the downloadable Klaviyo template, and worked examples are in Use Quiz Data in Klaviyo Email Templates.
Common pitfalls¶
Watch for these
- Two connections, not one. RevenueHunt supplies the quiz properties and tags.
Started Checkout,Placed OrderandViewed Productcome from your store platform's own connection to Klaviyo. Without both, flows 2 to 5 have nothing to trigger on. On Standalone, those events do not exist by default. - Confirm your exact property names. They include your quiz ID. Take a test quiz and read the property names off the resulting Klaviyo profile before you build.
- Decide who can enter a flow twice. The results email should be sent again when a customer retakes the quiz. The other five flows usually should not, or the customer gets too many emails.
- Filter every flow to customers who finished the quiz. Otherwise the copy reaches people who never took it, and the
lookuptokens render empty. - Lists must be Single Opt-in. Quiz contacts can only be added to a Single Opt-in Klaviyo list.
- New profiles and accented characters. A new profile can take a few minutes to appear. Accented characters (è, é, ê) can stop the data from arriving.
Related reading¶
- How to Send Quiz Leads to Klaviyo: the connection, segment and email-template mechanics in full.
- Sending Follow-up Emails with Klaviyo: the step-by-step tutorial for your first flow.
- Use Customer Tags: how answers become the tags every flow segments on.
- Ask for Marketing Consent: capture consent in the quiz so you can email compliantly.