Klaviyo Unique Coupon Codes for BFCM: Avoid Skipped Sends
A Klaviyo message that contains a unique coupon code is skipped when no code is available for its recipient. The documentation says so for campaigns and for flows alike (Klaviyo, getting started with coupon codes). A BFCM concentrates that risk: the sends that hand out codes (early access, welcome for new subscribers, abandoned cart) get squeezed into a few days, at the pace of promotional traffic.
This article follows codes from creation to use: static or unique, generation for campaigns, flow replenishment, forms, expiration, links that apply the code to the cart, tests and tracking.
TL;DR. Three documented rules govern Klaviyo unique codes. A campaign can only be scheduled if the stock covers the expected recipients, and on Shopify the codes are generated by hand before scheduling; if the audience is determined at send time, the extra recipients are skipped. A flow does not check stock: with no code available, the message is skipped. An expiration set in Klaviyo actually runs 24 hours longer, which shifts the end of an announced offer.
Want an outside look before you build? We offer a Q4 readiness audit: 30 minutes, free, no strings attached.
Static or unique: the choice for each mechanic
Klaviyo distinguishes two types of codes (Klaviyo, getting started with coupon codes). A static code is a single string that unlocks a specific discount: everyone receives the same one, it can be widely shared, and it is easier to remember. A unique code, also called dynamic, is a random series of numbers or letters that a recipient can use once. Each recipient gets their own, and no two people have the same code. Unique codes are usually longer, and they limit oversharing of discounts.
The Shopify page lists as campaign uses codes for email subscribers, pre-sale discounts for VIP customers and shipping delay discounts. For flows, it lists abandoned cart (with a code that stays active for a few days), win-back and the welcome series (Klaviyo, unique coupon codes for Shopify). It states that Klaviyo coupon codes only work for non-recurring orders, and not for subscription orders such as those Recharge handles.
A split follows for a BFCM. It is our reading of those uses, and Klaviyo does not formulate it.
| Mechanic | Code type | Reason |
|---|---|---|
| Public weekend offer | Static | The page acknowledges it gets shared, which is the point of a public offer |
| VIP and waitlist early access | Unique | The page cites the VIP pre-sale, and a unique code limits sharing |
| Welcome for weekend sign-ups | Unique, through a flow | The flow generates the codes automatically for Shopify |
| Abandoned cart | Unique, short expiration | The page cites a code active for 2 to 4 days |
Two platform limits complete the table. Klaviyo can generate codes for Shopify, WooCommerce, PrestaShop, Magento 1.x and Magento 2; for the others, you upload a CSV file with one column headed Coupon or Coupon Code. And a flow that hands out a code during the operation has to be checked against the site's own discount: our Q4 2026 promotional calendar covers the case of promotional flows that keep running during Black Friday.
Campaigns: the stock is generated before scheduling
On Shopify, a unique campaign code is generated manually, before the send is scheduled (Klaviyo, unique coupon codes for Shopify). The coupon is created under Content > Coupons with an exact name to reuse in the message, an optional prefix, a discount type (fixed amount, percentage, free shipping), a scope (whole order, products or collections), a minimum purchase, the allowed combinations, an activation date and an expiration. The three-dot menu then offers Add Codes.
Three rules on the page weigh on a BFCM.
- You must generate at least as many codes as expected recipients. With fewer codes than the estimated audience, the campaign can be neither scheduled nor sent. The Review & Send Campaign step shows a Coupon Codes area that flags it.
- Generating a large number of codes can take up to several hours. Klaviyo asks you to leave time between creating the codes and the send time, and not to overestimate the number of codes significantly: the estimated audience is the baseline.
- If the campaign is scheduled with Determine recipients at send time and the actual number of recipients exceeds the number of codes generated, the extra recipients are skipped and do not receive the email.
The third rule ties into the mechanics described in BFCM Segments in Klaviyo: Exclusions, Overlaps, Skipped Profiles. A waitlist that keeps growing until send day (Black Friday Waitlist in Klaviyo) does exactly what the rule anticipates: the real audience exceeds the one used to count the codes.
On the margin to allow, the documentation we reviewed is partial. The SMS page recommends generating 50 more codes than needed, doing it one or two days before sending, and keeping that margin in case people join the list or segment before a scheduled send (Klaviyo, unique coupon codes in SMS and MMS). The Shopify page, for its part, asks you not to overestimate significantly. None of the pages we reviewed gives a margin for email. A margin based on how the audience grew over the previous days respects both instructions.
Other rules on the page prevent late blockages.
- An A/B test needs enough codes to cover the full send, even if the code only goes to part of the audience.
- An email can contain several codes, provided you have enough for each recipient, whereas an SMS accepts only one: several coupons in the same SMS trigger an error and stop the send. Blocks hidden by display logic are a trap: codes are assigned to all recipients even if the block stays hidden, and they can block the send for lack of stock.
- Create a separate coupon for each campaign, do not use the same coupon for a flow and a campaign, and create a new coupon when the scope of products or categories changes: Klaviyo tries to assign the existing codes, and customers can receive codes with outdated rules.
The code stock, surface by surface
Campaigns, flows and forms do not behave the same way when stock runs out. The table gathers what the pages we reviewed say.
| Surface | Stock check | Insufficient stock | Replenishment |
|---|---|---|---|
| Campaign | At the Review & Send Campaign step | Scheduling or sending blocked | Manual |
| Campaign, audience determined at send time | No, for late arrivals | Extra recipients skipped | Manual |
| Flow, Shopify codes | No, message by message | Assignment skipped, which triggers generation | Automatic |
| Flow, uploaded codes | No | Message skipped; a flow at 0 codes cannot go Live | Manual |
| Form | Not documented | Static fallback code | Automatic for Shopify, manual for uploaded codes |
Flows
For a flow's Shopify codes, Klaviyo generates the codes automatically, with daily replenishment; if all codes are used before the replenishment, the next assignment attempt is skipped, which triggers the generation of additional codes (Klaviyo, unique coupon codes for Shopify). The SMS page describes the same logic differently: Klaviyo generates 100 codes when the stock drops below 100, for Shopify and Magento, and notes that a flow has no review step, unlike a campaign (Klaviyo, unique coupon codes in SMS and MMS).
For uploaded codes, the introductory page explains that a flow sends recipient by recipient, so Klaviyo cannot check that enough codes are available. A flow email whose coupon has no code available cannot be turned Live, and at send time the message is skipped if the stock is empty. Skipped profiles appear in the flow email's analytics: Recipient Activity, then Other. In its section on uploaded codes, the same page announces a low-stock alert: if a coupon was sent in the last 24 hours and fewer than 500 codes remain, the account owner receives an email. When you create an uploaded coupon, a minimum code count between 100 and 5,000 can be set, 500 by default; the page does not say whether that minimum changes the alert threshold.
A BFCM puts two flows under strain: welcome, which receives the weekend's sign-ups, and abandoned cart. The check is a daily one: open the coupons tab, read the Available/Total column, and look at the skipped profiles of the flow emails concerned. To test a Shopify coupon with a variable expiration in a flow, the Shopify page sets the flow to Manual status: the first code can take about three minutes to generate, and the test profile shows under Skipped: Retrying Generating Coupon Codes while it does.
Forms: the code in the success message
Klaviyo recommends showing the code in the form's success message (Klaviyo, adding coupon codes to sign-up forms). Unique codes can only be displayed there for Shopify coupons, uploaded coupons and API coupons. For WooCommerce, Magento 2 and PrestaShop, Klaviyo can create unique codes but cannot display them in a form: the page points to uploaded or API coupons instead.
Three settings prevent a form from running out of codes.
- A static coupon can serve as a fallback (Fallback Coupon): it only appears if the unique codes run out, so the visitor still gets a discount. It has to exist before it is pasted into the field.
- For a Shopify coupon with a one-year or specific-date expiration, Klaviyo generates a first batch of 600 codes when the coupon is added to the form, then more when the stock drops below 400. With an expiration in days or hours, it generates 600 codes a day (Klaviyo, unique coupon codes for Shopify).
- A Shopify coupon shown in a form is automatically applied to the person's cart at checkout.
Banner forms that collect neither email nor SMS consent can only include static coupons. Klaviyo also enables bot protection, including a CAPTCHA, on forms that show coupon codes (Klaviyo, getting started with sign-up forms).
Expiration: 24 hours longer, and UTC
The Shopify page is explicit: a coupon's real expiration is always 24 hours after the date entered, so the recipient can still use the code if sending or delivery is delayed. A coupon set to expire in 4 hours stays valid for 24 hours after those 4 hours. Dates are set in UTC in Klaviyo, while Shopify sets the expiration date and time according to the store's timezone, so the two displays can differ for the same coupon (Klaviyo, unique coupon codes for Shopify). The activation date follows the same principle, with an option that activates generated codes at send time.
For uploaded coupons, Klaviyo keeps no metadata: it does not know the code's value, duration or restrictions. The expiration date you enter only sets how long the codes stay available in Klaviyo, one year by default. Real validity is a matter for your store or point of sale (Klaviyo, getting started with coupon codes).
For a BFCM, this closes a communication trap. Before you write "until Monday midnight" in an email, create the coupon, open the matching price rule in Shopify and read the real expiration date and time. Then align the email and page copy.
Links that apply the code to the cart
Klaviyo offers link formats that apply the code to the Shopify session (Klaviyo, adding a link that applies a coupon code to a Shopify cart). For a Klaviyo unique coupon, the destination is the homepage, with the code as a path parameter:
mysite.com/discount/{% coupon_code 'CouponName' %}
To open another page, for example a collection, add a redirect:
mysite.com/discount/{% coupon_code 'CouponName' %}?redirect=/collections/my-collection
In an abandoned cart flow triggered by Started Checkout, the URL of the checkout in progress accepts a parameter:
{{ event.extra.checkout_url }}&discount={% coupon_code 'CouponName' %}
Three warnings on the page matter during a promotion. Klaviyo cannot ensure the code is auto-applied when the link points to a page other than checkout: the theme can strip the code from the URL. An item already discounted in the cart does not accept an additional discount, because Shopify does not stack them in that case. Finally, if the code does not apply during a test, the parameter often needs to start with & instead of ?, because ? only works when the code is the only parameter.
The second warning is the most sensitive on Black Friday. Decide before sending which mechanism carries the discount, and test the link on a discounted item.
Testing without wasting codes
The in-app preview in Klaviyo shows the coupon name followed by "PREVIEW", shows no real code and uses none. A test email sent to an address, on the other hand, uses a real code: the same code appears in every inbox for one minute, then another test send shows a new one (Klaviyo, getting started with coupon codes). The Shopify page adds that if several people are included in the preview send, they all receive the same code. Allow a few extra codes for testing.
After the send, the code a person received can be read in the Coupons section of their profile, and the remaining total in the Available/Total column of the coupons tab.
A given recipient gets only one unique code per coupon. If you resend an email or SMS with the same coupon, they receive the same code as long as it has not expired. Two flow messages that use the same coupon also send the same code, including between an email and an SMS.
Tracking usage and spotting leaks
For Shopify and Magento stores, Klaviyo can pull in the discount code used on an order. A Used a coupon segment is built with What someone has done > Placed Order, then a filter on discount codes. The page states that this works for static codes or a single unique code, not for a set of unique codes identified by name or prefix. Klaviyo presents this segment as a way to see whether a code is being passed on to other people (Klaviyo, getting started with coupon codes).
To follow up with people who did not use their code, add an email in the same flow a few days later. For a unique code, the page advises a split or a Placed Order zero times since starting this flow filter. For a static or uploaded code, it advises a filter on an order placed with that discount code.
Checklist for D-14
- Each BFCM mechanic has its code type (static or unique) and its own coupon.
- Campaign coupons are generated one or two days before the send, with a margin based on how the audience is growing.
- Campaigns scheduled with Determine recipients at send time have a stock that covers the audience expected at send time.
- Flow coupons are checked daily: Available/Total, low-stock alerts, skipped profiles in Recipient Activity.
- Every form that shows a unique code has a static fallback code.
- The real expiration date and time are read in Shopify before they are communicated.
- Links that apply the code are tested under real conditions, on a discounted item and on a full-price item.
- Test sends are counted in the code stock.
- A segment tracking used codes is in place before launch.
- The "price cut or promo code" decision is made and written down for each offer.
FAQ
How many codes should I generate for a campaign?
At least as many as the expected recipients: otherwise Klaviyo blocks scheduling and sending. Do not overestimate significantly, because generating a large number of codes can take up to several hours. The SMS page recommends a 50-code margin, and none of the pages we reviewed gives a figure for email.
What happens when the codes run out?
In a campaign, Klaviyo blocks scheduling or sending when the stock is below the estimated audience, and skips the extra recipients if the audience is determined at send time. In a flow, the message is skipped. In a form, the static fallback code is displayed if one was set up.
Can a recipient get two different codes for the same offer?
Not for the same coupon: a person receives only one unique code, which stays the same if you resend the message as long as it has not expired.
Do Klaviyo codes work with subscriptions?
No. The Shopify page states that they only work for non-recurring orders, not for subscription orders such as those Recharge handles.
Can I show a unique code in a form on PrestaShop or WooCommerce?
Not with the coupons Klaviyo generates for those platforms: the page says those codes cannot be displayed in forms. The documented alternative goes through uploaded coupons or API coupons.
Want an outside look at your codes and flows before the opening? Talk to the Deliver team or book a Q4 readiness audit.
Provenance and verification
Numeric and technical claims compared on 2026-09-30 with the Klaviyo pages listed in sources: campaigns blocked below the expected recipient count, recipients skipped when the audience is determined at send time, flows with no stock check, the alert below 500 codes, form batches of 600 codes with a 400 threshold, the real expiration offset by 24 hours, one code per SMS, and the format of links that apply the code to the cart. Two Klaviyo pages disagree on which platforms can generate codes for SMS: the more recent introductory page is used. Points the documentation does not settle were left out.
- Sources checked on
- Reviewed by
- Claude (Claude Code session, September 30, 2026) English localization of the French source, with every figure and setting checked against the vendor documentation listed in sources, reopened the same day.
- AI assistance
- Yes
- Sources
-
- help.klaviyo.com/hc/en-us/articles/115005084727
- help.klaviyo.com/hc/en-us/articles/115006155388
- help.klaviyo.com/hc/en-us/articles/6038674938523
- help.klaviyo.com/hc/en-us/articles/115005253088
- help.klaviyo.com/hc/en-us/articles/360044863132
- help.klaviyo.com/hc/en-us/articles/360050216012
- help.klaviyo.com/hc/en-us/articles/360026474752
Want to apply this to your stack?
Spend 30 minutes with Charlotte to review your CRM setup, size the opportunity and leave with a practical action plan.
Book a 30-minute call →