> ## Documentation Index
> Fetch the complete documentation index at: https://storekit.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Troubleshooting Klaviyo

> Troubleshoot storekit's Klaviyo integration: missing orders, browser and native app events, duplicate profiles, push delivery, consent, catalog sync and connection errors.

Work down the list that matches what you see. Web and order problems often come down to the private key's scopes, a store's **Enable Klaviyo** switch being off, a missing **Public key / site ID**, or an order with no customer email. If you are checking your branded app, use [Native Apps](#native-apps) below.

## Connecting

<AccordionGroup>
  <Accordion title="Connecting with a private key says Invalid Private Klaviyo API key">
    The key is wrong, or it is missing the **Lists — Read** scope, which storekit uses to check the key. Create a new private key in Klaviyo with every scope listed in [Connecting Klaviyo](/docs/guides/integrations/marketing/klaviyo/connect#before-you-start), then under **Klaviyo account** → **Edit** paste it into **Private key** and click **Connect** (or **Replace key**) again.
  </Accordion>

  <Accordion title="Subscriber list says No lists available">
    Your Klaviyo account has no lists yet, or the key lacks **Lists — Read**. Create a list in Klaviyo, then reload the store's Klaviyo page.
  </Accordion>

  <Accordion title="I need to change the private key">
    Under **Klaviyo account** → **Edit**, paste the new key into **Private key** and click **Replace key**. The new key replaces the old one for every store in the account; per-store settings (the switch, list, public key) are kept.
  </Accordion>
</AccordionGroup>

## Orders

<AccordionGroup>
  <Accordion title="No orders are arriving in Klaviyo">
    In order:

    1. On the store's Klaviyo page, check the **Enable Klaviyo** switch in the header is on — and that **Save** was clicked after switching it.
    2. Check the private key has **Events — Write** and **Profiles — Write**. Without them Klaviyo rejects every event.
    3. Check the order had a customer email. Orders without one are never sent — dine-in and kiosk orders often have none.
    4. In Klaviyo, open the customer's profile by email and look at the activity feed; events can take a minute or two to appear.
  </Accordion>

  <Accordion title="Orders appear in Klaviyo for a store I never set up">
    Connecting switches on every store in the account. Open that store's Klaviyo page, switch **Enable Klaviyo** off and click **Save**.
  </Accordion>

  <Accordion title="Placed Order arrived but not Fulfilled Order">
    **Fulfilled Order** is sent when the order is marked complete in storekit. Orders that are accepted but never marked complete produce no **Fulfilled Order**. Build post-order flows on **Placed Order** with a delay if your stores do not reliably complete orders.
  </Accordion>

  <Accordion title="The same order shows twice">
    storekit gives every event a stable unique ID, so retries do not duplicate. Two genuinely different events with the same order are expected — for example **Placed Order** and **Fulfilled Order**, or one **Ordered Product** per dish. If you see two **Placed Order** events with the same `OrderId`, contact storekit support with the order code.
  </Accordion>

  <Accordion title="Prices look 100x too big or too small">
    Every event sends money in major units (`12.50`, never `1250`) — see [Conventions](/docs/guides/integrations/marketing/klaviyo/event-reference#conventions). A template that divides or multiplies by 100 is the usual cause.
  </Accordion>
</AccordionGroup>

## Browser Events

<AccordionGroup>
  <Accordion title="Orders arrive but no Viewed Product, Added to Cart or Started Checkout">
    The store has no **Public key / site ID** — the header shows **Needs attention** with *"No browser events: add this store's public key / site ID"*. Under **This store** → **Edit**, add it and click **Save**. Each store needs its own entry. Ad blockers and privacy browsers also block these events for some customers; that is normal and cannot be fixed on storekit's side.
  </Accordion>

  <Accordion title="Browser events exist but are not attached to a profile">
    Browser events are anonymous until the customer types their email at checkout. A customer who browses and leaves before checkout never gets a profile, so **Viewed Product** on its own cannot trigger a flow for them. Kiosk customers are identified only when their order is placed.
  </Accordion>

  <Accordion title="Abandoned checkout emails link to an empty basket">
    Expected. The basket is kept in the customer's browser and clears roughly ten minutes after they leave. Render the `Items` from the **Started Checkout** event in the email so they can re-add them — see [Flows to Build](/docs/guides/integrations/marketing/klaviyo/flows#abandoned-checkout).
  </Accordion>
</AccordionGroup>

## Native Apps

<AccordionGroup>
  <Accordion title="Web orders arrive, but no app profiles or app events">
    Connecting your ordering website does not automatically connect your app. Contact storekit support to confirm the app is connected to the same Klaviyo account as your stores. Use the latest available app version when testing.
  </Accordion>

  <Accordion title="An app customer's profile has a name but no email">
    A name alone is not enough to match the customer to their existing email profile. If the customer signed in with an email address but it is missing in Klaviyo, contact storekit support so we can investigate the missing details.
  </Accordion>

  <Accordion title="The same customer has separate web and app profiles">
    Compare the email addresses on both Klaviyo profiles. Different email addresses can result in separate profiles for the same person. If the addresses match, or one profile is missing its email, contact storekit support before deleting either profile. Existing duplicates may need review rather than merging automatically.
  </Accordion>

  <Accordion title="Profiles appear, but Opened App is missing">
    Signing in updates the customer profile; it is not itself an Opened App event. Using the latest app version, sign in, switch to another app, then return. Check the customer's activity in Klaviyo.

    If the event is still missing, contact storekit support with the app name, app version, whether you use iPhone or Android, and the time you tested.
  </Accordion>

  <Accordion title="Opened App arrives, but push notifications do not">
    An app visit does not mean the customer has allowed notifications. Check that notifications are allowed for your app in the phone's settings. If they are, ask storekit support to confirm push messaging is ready for your app.

    Opened Push records a tap on a Klaviyo notification, not an ordinary app launch or a storekit order notification.
  </Accordion>
</AccordionGroup>

## Consent and Lists

<AccordionGroup>
  <Accordion title="Customers tick the opt-in box but are not subscribed">
    One of:

    * No list is chosen under **This store** → **Edit** → **Subscriber list** on that store — the summary says *"None: opt-ins aren't subscribed"*. Choosing one only affects orders placed after you **Save**.
    * **Marketing opt-in** is off under **Settings** → **General** on that store, so no box was shown.
    * The order had no email address.
    * The private key lacks **Subscriptions — Write**.
    * The list uses double opt-in and the customer has not confirmed yet.
  </Accordion>

  <Accordion title="Subscribed for email but not SMS">
    The phone number could not be converted to a valid international number for the store's country, so storekit subscribed the email only. Landline numbers and numbers with typos are the usual cause. Klaviyo also requires SMS to be set up on your account before it accepts SMS consent.
  </Accordion>

  <Accordion title="Customers who did not tick the box are in Klaviyo">
    Expected. Every order with an email creates or updates a profile so their order history is complete. They are **not** subscribed to your list and Klaviyo will not send them marketing unless you subscribe them yourself.
  </Accordion>
</AccordionGroup>

## Historical Sync

<AccordionGroup>
  <Accordion title="Historical sync did not trigger my flows">
    Expected. Synced orders carry their original dates and are sent as a backfill, so Klaviyo records them without firing flows. They count towards segments only.
  </Accordion>

  <Accordion title="Run sync is missing or greyed out">
    Under **Klaviyo account** → **Edit** → **Historical orders**, the sync has already been run for the account (it shows **Completed**) or is still **In progress**. It runs once per account and cannot be re-run from the dashboard.
  </Accordion>

  <Accordion title="Some past orders are missing">
    Only orders with status **Complete** or **Accepted** that have a customer email, from stores switched on at the time of the sync, are included.
  </Accordion>
</AccordionGroup>

## Catalog

<AccordionGroup>
  <Accordion title="Dishes are missing from the Klaviyo catalog">
    The sync includes named, non-deleted dishes from every menu on stores whose **Enable Klaviyo** switch is on. Check the store's switch, and check the private key has **Catalogs — Read/Write**. The sync runs at 05:00 daily; a dish added today appears tomorrow.
  </Accordion>

  <Accordion title="Two dishes were merged into one catalog item">
    Dishes are keyed by PLU, then SKU, then POS ID. Two different dishes sharing the same PLU (common after a POS import) become one catalog item. Fix the PLU on one of them in storekit and the next sync creates a separate item.
  </Accordion>

  <Accordion title="A removed dish is still in the catalog">
    storekit never deletes catalog items. Delete it in Klaviyo.
  </Accordion>
</AccordionGroup>

## Review Events

<AccordionGroup>
  <Accordion title="No Review Requested events">
    Under **Stores** → your store → **Settings** → **Feedback**, check **Enable feedback** is on. If **Opt-in only** is on, only customers who ticked the marketing box are asked. Requests go out after the order's estimated ready time plus **Notification delay**, and a customer is asked at most once per store per 24 hours.
  </Accordion>

  <Accordion title="Review Requested arrived but no Review Submitted">
    The customer has not completed the review form. Only completed reviews are sent.
  </Accordion>

  <Accordion title="A 3-star review came through as Negative Review Submitted">
    Expected. Ratings of 4 and 5 are positive; 1 to 3 are negative. The threshold is fixed.
  </Accordion>
</AccordionGroup>

## Still Stuck

Contact storekit support with the store name, the order code (`OrderCode`, shown on the customer's receipt) and what you expected to see in Klaviyo. Please do not send your private API key.

## Related

<CardGroup cols={2}>
  <Card title="Connecting Klaviyo" icon="plug" href="/docs/guides/integrations/marketing/klaviyo/connect">
    Scopes and per-store setup
  </Card>

  <Card title="Event Reference" icon="table-list" href="/docs/guides/integrations/marketing/klaviyo/event-reference">
    Every event and property
  </Card>
</CardGroup>


## Related topics

- [Klaviyo](/docs/guides/integrations/marketing/klaviyo/overview.md)
- [Klaviyo for Native Apps](/docs/guides/integrations/marketing/klaviyo/native-apps.md)
- [Sync Past Orders to Klaviyo](/docs/guides/integrations/marketing/klaviyo/historical-sync.md)
- [Troubleshooting](/docs/guides/integrations/pos/comtrex/troubleshooting.md)
- [Connecting Klaviyo](/docs/guides/integrations/marketing/klaviyo/connect.md)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.