Klaviyo Integration
Setup
Step 1: Get your Klaviyo Private API Key
- Log in to klaviyo.com and go to your account.
- Navigate to Settings → Account → API Keys.
- 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).
- Copy the key. It starts with
pk_.
Step 2: Connect in Stashlist
- In your Shopify admin, open Stashlist → Integrations.
- Paste your Private API Key into the Klaviyo card and click Connect.
- 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.
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.
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.
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:
- Go to Flows → Create Flow → Build Your Own.
- Set the trigger to Metric and pick the Stashlist event, for example Added to Wishlist.
- Build the flow using the event properties above to personalise the content.
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.
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 }} 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
- Log in to your storefront as a test customer with a real email address you can check.
- Save a product to trigger Added to Wishlist.
- In Klaviyo, go to Analytics → Metrics and open the metric to confirm the event arrived with all its properties.
- 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.