Connect Klaviyo
Send wholesale tiers, companies, net terms and application events to Klaviyo so you can segment B2B buyers and automate approval, quote and renewal emails.
Klaviyo already knows what your customers have bought and browsed. It knows nothing about your wholesale program - who is approved, what tier they buy at, which company they belong to, or when their access expires. Connecting Klaviyo sends that context across, so you can build segments and automated flows around your B2B customers using the email tool you already have.
What gets sent
Two things: profile properties for segmentation, and events you can trigger flows from.
Only wholesale customers are synced - anyone with a discount group, a company, or a submitted application. Your retail customers are left alone, so this doesn't inflate the active profile count Klaviyo bills you on.
This is a one-way sync. We write wholesale data into your Klaviyo account and never read your Klaviyo data back.
How to connect
- In the app, open Klaviyo in the left sidebar
- Click Connect Klaviyo - you'll be sent to Klaviyo to approve access (you need an owner, admin or manager role there)
- Approve, and you land back on the page with a green Connected badge showing your Klaviyo account name
There are no API keys to copy. Before you connect, the page estimates how many profiles will be touched, since Klaviyo bills per active profile. Most of them already exist in your account from Klaviyo's own Shopify integration - the new ones are applicants who have never placed an order.
Once connected, your existing wholesale customers and their history are backfilled automatically. The backfill never triggers your flows, so it's safe to connect after you've already built them.
Profile properties
Every synced customer gets these properties, all prefixed wholesale_. Use the exact key when building a segment in Klaviyo. The Klaviyo page in the app shows the same table, so you can copy the strings straight out of it.
| Property | Type | Description |
|---|---|---|
wholesale_status | string | none, pending, approved, denied or expired |
wholesale_tier | string | Name of the customer discount group in force |
wholesale_tier_id | number | Internal ID of that discount group |
wholesale_discount_type | string | percentage or fixed |
wholesale_discount_amount | number | Discount value for the tier |
wholesale_min_order | number | Minimum order quantity for the tier |
wholesale_min_order_value | number | Minimum order value for the tier |
wholesale_company | string | Company the customer buys for |
wholesale_company_id | number | Internal company ID |
wholesale_company_type | string | App-managed or Shopify-managed |
wholesale_net_terms | number | Payment terms in days |
wholesale_tax_exempt | boolean | Whether the customer is tax exempt |
wholesale_approved_at | date | When the account was approved |
wholesale_expires_at | date | When wholesale access lapses - use this for renewal flows |
wholesale_applied_at | date | When they last submitted an application |
wholesale_shopify_customer_id | string | Shopify customer ID, for reference |
Properties are kept up to date as customers move between tiers and companies. When a customer loses their tier, the property is cleared rather than left behind, so they drop out of your wholesale segments automatically.
An applicant you've asked for more information counts as pending in wholesale_status - they're still an open applicant, not a decided one. If you want to email that group specifically, trigger on the Wholesale Application Needs Info metric below rather than segmenting on the property.
Your onboarding form fields
Answers from your wholesale sign-up forms are synced too, as wholesale_form_<field name> - so a "Reseller Permit" field becomes wholesale_form_reseller_permit. The Klaviyo page lists the exact key for every field on your forms.
Renaming a field in the form builder does not rename its Klaviyo property, so any segment you've already built keeps working.
File upload fields are never sent to Klaviyo.
Flow triggers
These events appear in Klaviyo's flow trigger dropdown as metrics. Each one shows up the first time it fires.
| Metric | Fires when | Example use |
|---|---|---|
| Wholesale Application Submitted | Someone submits a wholesale application form | Send a "we've received your application" autoresponder |
| Wholesale Application Approved | An application is approved and the account activated | Start an onboarding series with ordering instructions |
| Wholesale Application Needs Info | You ask an applicant for more information before deciding | Tell them what's missing and link them back to your form |
| Wholesale Application Denied | An application is denied | Send a polite decline that explains why |
| Wholesale Tier Changed | A customer moves to a different discount group | Congratulate them on an upgrade and show their new pricing |
| Wholesale Company Assigned | A customer is added to a company | Welcome a new buyer at an existing wholesale account |
| Wholesale Membership Expiring | Wholesale access lapses soon | Prompt them to renew before they lose their pricing |
| Wholesale Membership Expired | Wholesale access has lapsed | Win-back flow offering reinstatement |
| Wholesale Quote Sent | A draft order invoice is sent to the customer | Chase unpaid quotes after 3, 7 and 14 days |
| Wholesale Order Placed | A wholesale customer places an order, with tier and company context | Reorder reminders based on their usual cadence |
Variables on decision events
The three application decision events - approved, needs info and denied - each carry two extra values you can drop into the email:
| Variable | What it holds |
|---|---|
{{ event.reason }} | The reason you typed when setting the status |
{{ event.reapply_url }} | Your application page URL, set under Wholesale GOAT → Settings |
Both can be empty, so wrap them in a conditional rather than assuming they're there. The Klaviyo page in the app lists every variable available on every metric.
See emailing applicants your decision for a worked example.
Segment ideas
- Exclude wholesale from retail campaigns: segment where
wholesale_statusequalsapproved, then exclude it from your consumer promotions - Renewals: segment on
wholesale_expires_atbeing within the next 30 days, and send a renewal reminder - Tier-specific pricing announcements: segment on
wholesale_tierto email only your top-tier stockists - Stalled applicants:
wholesale_statusispendingandwholesale_applied_atis more than a week ago, for your team to chase
Sending email to wholesale customers
Most of these events are transactional rather than marketing. Someone asked you for a wholesale account, so telling them it was received, approved, declined, or that you need something more from them is a service message. In Klaviyo, mark those flow messages as transactional and they send regardless of subscription status - only metric-triggered flows can be marked that way, which is exactly what these are.
Two are promotional rather than transactional, and do need marketing consent: Wholesale Membership Expiring and Wholesale Membership Expired, when you use them as renewal or win-back nudges.
Segmenting doesn't involve consent at all. Adding wholesale properties to a profile so you can exclude those buyers from retail campaigns works no matter what they're subscribed to.
We never set marketing consent on your behalf. Customers who haven't opted in stay unsubscribed in Klaviyo, exactly as they were.
Checking that it's working
The Klaviyo page shows how many profiles and events are waiting to send, when the last sync ran, and a Recent activity table of the events we've sent, who they were for, and whether they landed. That's the fastest way to answer "did my flow fire?".
Syncing is batched, so expect a short delay - usually under a minute - between an action in the app and the event appearing in Klaviyo.
Use Resync if you want to push current wholesale data for every customer again, for example after a large import. Like the initial backfill, a resync updates profiles without triggering flows.
Troubleshooting
- "Reconnect required" banner: Klaviyo revoked our access, usually because the connection was removed inside Klaviyo, or because nobody used it for a long time. Click Reconnect to restore syncing - queued events are sent once you do.
- A greeting comes out blank: an applicant's first name isn't guaranteed - only email and phone are required on an application. Give
{{ person.first_name }}a fallback in Klaviyo, or turn on auto-create customer from form submission so names sync reliably. - A customer isn't updating: we match profiles by email address. If the customer's email in Klaviyo differs from the one on their Shopify customer record, they won't match.
- A metric is missing from the flow dropdown: metrics only appear in Klaviyo after their event has fired at least once. Approve a test application to make it show up.
- Failed events: the Recent activity table flags failures, and hovering one shows the reason. Failed events are retried automatically.
Disconnecting stops all syncing immediately. Properties already written to your Klaviyo profiles stay there.
Need help?
Reach out at hello@conspireagency.com and we'll help you get your flows set up.
Email notifications for applications
Notify your team by email whenever a new wholesale application form is submitted, so B2B sign-ups never sit unreviewed.
Emailing applicants your decision
Tell wholesale applicants they've been approved, denied, or need to send more information, using your own branded emails through Klaviyo.