Klaviyo Integration

Stashlist sends wishlist events to Klaviyo automatically. Use them to build flows, segments, and notifications that convert saves into sales.

Setup

Step 1: Get your Klaviyo Private API Key

  1. Log in to klaviyo.com and go to your account.
  2. Navigate to Settings → Account → API Keys.
  3. Click Create Private API Key. Give it a name like Stashlist and set access to Full Access (or at minimum, Events with Read/Write access).
  4. Copy the key. It starts with pk_.
Keep your private key secure. Never share it publicly or add it to frontend code. Stashlist stores it encrypted and only uses it server-side.

Step 2: Connect in Stashlist

  1. In your Shopify admin, open Stashlist → Integrations.
  2. Paste your Private API Key into the Klaviyo card and click Connect.
  3. The card will show Connected and events will start flowing immediately.

Events reference

Stashlist fires these events to your Klaviyo account. Each event includes the customer's profile (email, name) and the product details.

Event name When it fires
Added to Wishlist A customer saves a product by clicking the heart icon
Removed from Wishlist A customer removes a product from their wishlist
Viewed Wishlist A logged-in customer with a non-empty wishlist loads the wishlist page
Price Drop A wishlisted product's price drops by the configured threshold (%) or more
Back in Stock An out-of-stock wishlisted product becomes available again
Low in Stock Inventory for a wishlisted product drops below the configured threshold

Event properties

Every event includes these properties. Property names are case-sensitive in Klaviyo templates, so copy them exactly as written here.

Property Description
ProductID Shopify product ID
VariantID Shopify variant ID of the saved item
ProductName Product name, e.g. "Cornaro Black Leather"
VariantName Variant name, e.g. "Blue / Large". Empty string for single-variant products
Price Price as a number, e.g. 89. For Price Drop events this is the new, lower price
ImageURL Product image URL, ready to drop into an email template
URL Full URL to the product page

The event value is also set to the price, so Klaviyo revenue reporting on these metrics works without extra configuration. Profiles are identified by email, with the Shopify customer ID stored as external_id.

Products saved by guests don't fire events. Klaviyo needs an email address to attach the event to a profile. Guest wishlists are stored in the browser until the shopper logs in, at which point their saved items transfer to their account. Events fire from that point forward.

Notification thresholds

Price Drop, Back in Stock, and Low in Stock events are fired by a background job that checks your wishlisted products on a schedule. You can configure the thresholds in Stashlist → Integrations → Klaviyo → Notification Thresholds.

  • Price drop threshold: the minimum percentage drop required to fire a Price Drop event (default: 10%)
  • Low in stock threshold: inventory must fall below this number of units to fire a Low in Stock event (default: 5 units)
  • Back in stock: fires when a product that was out of stock becomes available. Toggle on/off.

Building flows in Klaviyo

Once events are flowing, use them as flow triggers:

  1. Go to Flows → Create Flow → Build Your Own.
  2. Set the trigger to Metric and pick the Stashlist event, for example Added to Wishlist.
  3. Build the flow using the event properties above to personalise the content.
An event has to exist before you can pick it. A metric only appears in Klaviyo's trigger dropdown once it has fired at least once. If you can't find Added to Wishlist, save a product on your storefront while logged in as a test customer, wait about a minute, then refresh the dropdown.

Template variables

Inside a flow email, reference event properties with {{ event.PropertyName }}. These are the ones you'll use most:

{{ event.ProductName }}              Cornaro Black Leather
{{ event.VariantName }}              Black / 42
{{ event.Price|floatformat:2 }}      755.00
{{ event.URL }}                      https://yourstore.com/products/...
{{ event.ImageURL }}                 https://cdn.shopify.com/...
{{ person.first_name|default:"there" }}   Tobias

To show the product image, add an Image block, click the source field, and switch it to a dynamic value using {{ event.ImageURL }}. Point the image's link at {{ event.URL }} so the whole image is clickable.

Handling single-variant products. VariantName is an empty string when a product has no variants, which leaves an orphaned separator in a line like Product, Variant. Wrap it:

{% if event.VariantName %}{{ event.ProductName }} — {{ event.VariantName }}{% else %}{{ event.ProductName }}{% endif %}

Recommended flows

1. Wishlist reminder

Trigger: Added to Wishlist  ·  Emails: 2  ·  Why it works: the shopper told you what they want. This is the highest-intent audience you have.

Add a 24 hour time delay, then the first email. Follow it with a 6 day delay and a second email. Add a flow filter on both: has not placed an order since starting this flow, so anyone who already bought drops out.

Email 1 subject lines

  • Still thinking about the {{ event.ProductName }}?
  • You saved this one
  • {{ person.first_name|default:"Hi" }}, your saved item is waiting

Email 1 body

Hi {{ person.first_name|default:"there" }},

You saved the {{ event.ProductName }} to your wishlist.
It's still available if you'd like to take another look.

[ Product image, linked to {{ event.URL }} ]

{{ event.ProductName }}
{{ event.Price|floatformat:2 }}

[ View product ]  → {{ event.URL }}

Keep email 2 shorter. If you run limited stock, this is the place to say so plainly, without inventing urgency that isn't real.

2. Price drop alert

Trigger: Price Drop  ·  Emails: 1  ·  Why it works: it reaches only the people who already wanted the item, rather than blasting a sale to your whole list.

Send immediately, no delay. Nothing else in your stack can send an email this well-timed.

Subject lines

  • The {{ event.ProductName }} just dropped in price
  • Price drop on something you saved

Body

Hi {{ person.first_name|default:"there" }},

Something on your wishlist just went down in price.

[ Product image, linked to {{ event.URL }} ]

{{ event.ProductName }}
Now {{ event.Price|floatformat:2 }}

[ Shop now ]  → {{ event.URL }}
You can't show the old price from the event alone. Stashlist sends the new price as Price, not the previous one, so a "was $X, now $Y" line isn't possible from Klaviyo template variables. Write the copy around the new price instead, as above. If the strikethrough matters to you, add a Shopify product block to the email and let Klaviyo pull the compare-at price directly from your catalogue.

3. Back in stock

Trigger: Back in Stock  ·  Emails: 1  ·  Why it works: these shoppers wanted the item badly enough to save it while it was unavailable.

Send immediately. For limited restocks, this email genuinely is time-sensitive, so it's one of the few places urgency language is honest.

Subject lines

  • {{ event.ProductName }} is back
  • Back in stock: the one you saved

Body

Hi {{ person.first_name|default:"there" }},

The {{ event.ProductName }} you saved is available again.

[ Product image, linked to {{ event.URL }} ]

{{ event.ProductName }}
{{ event.Price|floatformat:2 }}

[ Shop now ]  → {{ event.URL }}

4. Low in stock

Trigger: Low in Stock  ·  Emails: 1  ·  Use with care: this one is easy to overuse.

Fires when a saved item's inventory falls below your threshold. Worth sending on genuinely scarce stock, worth skipping if your inventory routinely dips and restocks, since shoppers learn quickly when "almost gone" isn't true and stop opening.

Subject line

  • Low stock on the {{ event.ProductName }}

5. Welcome the first save

Trigger: Added to Wishlist  ·  Emails: 1  ·  Optional.

Add a flow filter for Added to Wishlist, zero times before starting this flow so it only reaches first-time savers. Use it to explain that saved items are kept for them, and that you'll let them know about price drops and restocks. Sets the expectation for every email that follows.


Segments worth building

Beyond flows, these event metrics make useful campaign audiences:

  • Active wishlisters. Added to Wishlist at least once in the last 90 days. High intent, good for new-arrival and sale campaigns.
  • Engaged, not converted. Added to Wishlist at least twice, and Placed Order zero times. These shoppers browse seriously but haven't crossed the line yet, so a first-order incentive lands well here.
  • Recently browsing. Viewed Wishlist in the last 14 days. They're actively shopping right now, which makes it a good send window.
  • High-value intent. Added to Wishlist where Price is greater than your average order value. Worth a more considered, personal approach than a bulk campaign.

Testing your flows

  1. Log in to your storefront as a test customer with a real email address you can check.
  2. Save a product to trigger Added to Wishlist.
  3. In Klaviyo, go to Analytics → Metrics and open the metric to confirm the event arrived with all its properties.
  4. Use Preview → Send preview email in your flow to check the template renders with real values rather than blanks.

If properties come through empty in a preview, the most common cause is a name mismatch. Check the casing against the property table above, ImageURL and ProductID in particular, since the intuitive spellings ImageUrl and ProductId silently render as nothing.

Price Drop, Back in Stock, and Low in Stock come from a scheduled background job rather than a live shopper action, so they won't fire on demand during testing. They arrive on the next run after the underlying price or inventory actually changes in Shopify.