Wholesale GOAT
Guides

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

  1. In the app, open Klaviyo in the left sidebar
  2. Click Connect Klaviyo - you'll be sent to Klaviyo to approve access (you need an owner, admin or manager role there)
  3. 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.

PropertyTypeDescription
wholesale_statusstringnone, pending, approved, denied or expired
wholesale_tierstringName of the customer discount group in force
wholesale_tier_idnumberInternal ID of that discount group
wholesale_discount_typestringpercentage or fixed
wholesale_discount_amountnumberDiscount value for the tier
wholesale_min_ordernumberMinimum order quantity for the tier
wholesale_min_order_valuenumberMinimum order value for the tier
wholesale_companystringCompany the customer buys for
wholesale_company_idnumberInternal company ID
wholesale_company_typestringApp-managed or Shopify-managed
wholesale_net_termsnumberPayment terms in days
wholesale_tax_exemptbooleanWhether the customer is tax exempt
wholesale_approved_atdateWhen the account was approved
wholesale_expires_atdateWhen wholesale access lapses - use this for renewal flows
wholesale_applied_atdateWhen they last submitted an application
wholesale_shopify_customer_idstringShopify 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.

MetricFires whenExample use
Wholesale Application SubmittedSomeone submits a wholesale application formSend a "we've received your application" autoresponder
Wholesale Application ApprovedAn application is approved and the account activatedStart an onboarding series with ordering instructions
Wholesale Application Needs InfoYou ask an applicant for more information before decidingTell them what's missing and link them back to your form
Wholesale Application DeniedAn application is deniedSend a polite decline that explains why
Wholesale Tier ChangedA customer moves to a different discount groupCongratulate them on an upgrade and show their new pricing
Wholesale Company AssignedA customer is added to a companyWelcome a new buyer at an existing wholesale account
Wholesale Membership ExpiringWholesale access lapses soonPrompt them to renew before they lose their pricing
Wholesale Membership ExpiredWholesale access has lapsedWin-back flow offering reinstatement
Wholesale Quote SentA draft order invoice is sent to the customerChase unpaid quotes after 3, 7 and 14 days
Wholesale Order PlacedA wholesale customer places an order, with tier and company contextReorder 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:

VariableWhat 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_status equals approved, then exclude it from your consumer promotions
  • Renewals: segment on wholesale_expires_at being within the next 30 days, and send a renewal reminder
  • Tier-specific pricing announcements: segment on wholesale_tier to email only your top-tier stockists
  • Stalled applicants: wholesale_status is pending and wholesale_applied_at is 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.

On this page