Cove Wishlist
Cove Wishlist for developers
REST API version 1.0.0. Updated 2026-10-21.
Cove Wishlist works as it is, or you can build on it: read and change wishlists from your own server, or build your own wishlist UI on the storefront. Nothing to install: no SDK, no script tags.
- REST API
- Authentication
- Rate limits and quota
- Errors
- Endpoints
- Storefront HTTP API
- Storefront JavaScript API
- Events
- Pixel events (Meta, GA4)
- Klaviyo and Omnisend
- Custom elements
- Styling hooks
- Versioning
REST API
A JSON API for your servers: an ERP, a CRM, a marketing tool or a headless storefront’s backend. It is on the Premium plan.
- Base URL:
https://covewishlist.com/api/v1 - OpenAPI 3.1 document: /developers/openapi.json (import it into Postman, Insomnia or a code generator).
- JSON in and out. Every response carries
Cache-Control: no-store. - Customers are identified by their numeric Shopify customer ID only. The API never accepts or returns an email, name or any other customer detail, and a request body with a field it doesn’t know is refused.
- Every change is idempotent: saving an item twice, or removing something that isn’t saved, changes nothing. Retrying is always safe.
- IDs are strings in responses (JSON numbers can’t hold every 64-bit ID). In request bodies, product and variant IDs may be numeric strings, numbers or GIDs (
gid://shopify/Product/…).
Authentication
Create a key in the app: Shopify admin › Apps › Cove Wishlist › Developers. Name it after what will use it and pick its access:
- Read: the GET endpoints.
- Read and write: also save and remove items.
The key is shown once, when you create it. We store only a one-way hash, so it can’t be shown again or recovered: if you lose it, revoke it and create another. Revoking takes effect at once. Keys are revoked automatically when the app is uninstalled. A shop can have up to 10 active keys.
Send the key as a bearer token:
curl https://covewishlist.com/api/v1/me \
-H "Authorization: Bearer $COVE_API_KEY"Server to server only. A key reads and changes every customer’s wishlist in your shop, so keep it on a server, in an environment variable or secret store. Never put it in theme code, a mobile app or anything a browser downloads. The API sends no CORS headers, so browsers can’t call it.
Keys work while the shop’s plan includes the developer API. After a downgrade, calls answer 403 plan_required until you upgrade again; the keys themselves are kept.
Rate limits and quota
- 120 requests per minute per key, and 600 per minute per shop across all its keys.
- Every response says where you are:
X-RateLimit-Limit,X-RateLimit-RemainingandX-RateLimit-Reset(Unix seconds). - Over the limit:
429 rate_limitedwith aRetry-Afterheader in seconds. Back off and retry. - Repeated failed authentication from one IP address is also limited (30 a minute).
- Each new save through the API counts as one wishlist action toward the shop’s monthly quota, exactly like a save on the storefront. At the limit, adds answer
429 quota_reached; reads and removes keep working.
Errors
Errors are JSON, { "error": "code" }, with the HTTP status below. Match on the code, not the message.
| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_request | The body or query failed validation (unknown fields included). |
| 400 | invalid_json | The body isn’t JSON. |
| 400 | invalid_customer_id | The customer ID isn’t a numeric Shopify customer ID. |
| 400 | invalid_product_id | The product ID isn’t a numeric Shopify product ID. |
| 400 | invalid_limit | `limit` is not an integer from 1 to 250. |
| 401 | missing_api_key | No `Authorization` header. |
| 401 | invalid_api_key | The key is malformed, unknown or revoked, or the app is uninstalled. |
| 403 | plan_required | The shop’s plan doesn’t include the developer API. Also carries `feature` and `plan`. |
| 403 | insufficient_scope | A write with a read-only key. |
| 404 | list_not_found | The `listId` isn’t one of this customer’s lists. |
| 404 | not_found | No such endpoint. |
| 405 | method_not_allowed | Wrong HTTP method; `Allow` names the right one. |
| 409 | list_full | The list already holds 500 items. |
| 413 | body_too_large | The body is over 16 KB. |
| 429 | rate_limited | Too many requests; wait `Retry-After` seconds. |
| 429 | quota_reached | The shop has used its monthly wishlist actions; adds are refused until the next month or an upgrade. |
| 500 | internal_error | Our fault. Safe to retry: every operation is idempotent. |
| 503 | paused | The app’s storefront features are paused on this shop. |
Endpoints
GET/me
The shop and scope of the key. Use it to check credentials.
{ "shop": "your-store.myshopify.com", "scope": "READ_WRITE" }GET/customers/{customerId}/wishlist
Every list of the customer with its saved items, newest first. A customer who never saved anything gets "lists": [], not a 404. List names are shopper text: show them as text, never as HTML. Share links and shoppers’ private notes are never returned; shared says whether a list has a live link.
curl https://covewishlist.com/api/v1/customers/7012345678901/wishlist \
-H "Authorization: Bearer $COVE_API_KEY"{
"customerId": "7012345678901",
"count": 2,
"lists": [
{
"id": "clx0examplelistid0000",
"name": "My wishlist",
"isDefault": true,
"shared": false,
"createdAt": "2026-10-01T09:30:00.000Z",
"count": 2,
"items": [
{ "productId": "8123456789", "variantId": "45123456789", "quantity": 1, "addedAt": "2026-10-20T18:02:11.000Z" },
{ "productId": "8123456790", "variantId": null, "quantity": 1, "addedAt": "2026-10-02T10:00:00.000Z" }
]
}
]
}POST/customers/{customerId}/items
Save a product, or one variant of it, for a customer (read and write key). Without listId it goes to the customer’s default list, created on first use; with it, to that list, which must be one of theirs. Answers 201 with "added": true, or 200 with "added": false when it was already there, plus the new wishlist. A list holds up to 500 items.
curl -X POST https://covewishlist.com/api/v1/customers/7012345678901/items \
-H "Authorization: Bearer $COVE_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "productId": "8123456789", "variantId": "45123456789" }'DELETE/customers/{customerId}/items/{productId}
Remove a saved product (read and write key). Query parameters: variantId removes that variant’s save instead of the product-level one; listId removes it from that list only, otherwise it leaves every list. Answers { "removed": n, "wishlist": … }; removed is 0 when nothing was saved.
curl -X DELETE "https://covewishlist.com/api/v1/customers/7012345678901/items/8123456789?variantId=45123456789" \
-H "Authorization: Bearer $COVE_API_KEY"GET/products/most-saved
The shop’s products by how many shoppers have them saved now (a shopper counts once however many lists hold it), with saves, the saved rows. limit is 1 to 250, default 50. Counts only: never who saved.
{ "products": [{ "productId": "8123456789", "shoppers": 42, "saves": 47 }] }Storefront HTTP API
The JSON endpoints the storefront hearts use, for custom wishlist UIs in an Online Store theme. They live under your store’s own domain at /apps/wishlist (Shopify’s app proxy), so they only work from your storefront: Shopify signs each request and passes the signed-in customer, if any. There is no key and nothing to configure. A headless storefront on another domain should call the REST API from its server instead.
- Every endpoint is
POSTwith a JSON body and answers JSON (Cache-Control: no-store). SendContent-Type: application/jsonandcredentials: "same-origin". - Signed-in customers are recognised from Shopify’s signature. Guests get a random
guestTokenin the response to their first save: keep it (Cove’s own script useslocalStoragekeycove:guest, so share it to work alongside the hearts) and send it back in every body. It is the guest’s only credential: never put it in a URL. After sign-in, the next/statemerges the guest list into the account. - Limits: 60 writes a minute per shopper, 1200 requests a minute per shop.
- Errors use the same
{ "error": "code" }shape:sign_in_required(403, the store turned guest wishlists off),plan_required(403),not_signed_in(401),list_not_found/not_saved(404),list_full,list_limit,list_exists,last_list(409),rate_limited(429),paused(503).
| POST /apps/wishlist… | Body | Returns |
|---|---|---|
/stateThe shopper’s saved items, lists and count. Creates nothing; merges a guest list into the customer after sign-in. | { guestToken? } | state |
/itemsSave, unsave or move one product or variant. Without listId, add goes to the default list and remove unsaves from every list. An add with listId makes that list the default. | { action: "add" | "remove", productId, variantId?, listId?, guestToken? } or { action: "move", productId, variantId?, listId, toListId, guestToken? } | state (+ guestToken on a guest’s first save) |
/listsManage named lists and their share links. Creating needs the multiple-lists plan, share and replace the sharing plan. | { action: "create", name } or { action: "rename", listId, name } or { action: "delete" | "default" | "share" | "pause" | "replace" | "revoke", listId }, plus guestToken? | state + listId |
/mergeSigned-in customers only: move this browser’s guest list into the account now. | { guestToken } | state + mergedItems |
/noteSet (or clear with "") the shopper’s own note on a saved item, up to 500 characters. | { productId, variantId?, note, guestToken? } | { note } |
/resolveProduct IDs and saved state for product handles (for cards that only know a handle). Unknown handles are left out. | { handles: string[] (1-50), guestToken? } | { products: { [handle]: { productId, saved } } } |
/viewTrade a guest token for a short-lived ticket to open the wishlist page as /apps/wishlist?view=<ticket>, so the token never appears in a URL. | { guestToken? } | { signedIn, ticket } |
/cartCount items added to cart from a wishlist (analytics only). | { items: 1-50, guestToken? } | { ok: true } |
The state most endpoints return (count is distinct saved products and variants; an item in two lists counts once):
{
"signedIn": false,
"count": 1,
"items": [
{ "productId": "8123456789", "variantId": null, "listIds": ["clx0examplelistid0000"] }
],
"lists": [{ "id": "clx0examplelistid0000", "name": "My wishlist", "isDefault": true }],
"features": { "multipleLists": false, "sharing": true },
"guestToken": "<only on a guest's first save>"
}const res = await fetch('/apps/wishlist/items', {
method: 'POST',
credentials: 'same-origin',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
action: 'add',
productId: '8123456789',
guestToken: localStorage.getItem('cove:guest') || undefined,
}),
});
const state = await res.json();
if (state.guestToken) localStorage.setItem('cove:guest', state.guestToken);Two pages are served there too, as Liquid inside your theme: GET /apps/wishlist (the shopper’s wishlist) and GET /apps/wishlist/s/{token} (a shared list).
Storefront JavaScript API
On every storefront page with the Cove Wishlist app embed on, window.CoveWishlist works the hearts’ wishlist from your own theme code: the same calls, the same shopper (signed in or guest), and every heart and counter on the page updates with it. Nothing to install. The script loads deferred, so code that may run first can wait for the cove:ready event on document.
| Method | Resolves with | Does |
|---|---|---|
get() | Item[] | The saved items: { productId, variantId, listIds }. |
count() | number | Saved products and variants (an item in two lists counts once). |
has(productId, variantId?) | boolean | Whether it is saved. Without a variant: the product is saved at all, in any variant. With one: that variant, or the product saved without a variant (which covers all of them). |
add(productId, variantId?) | Item[] | Save it to the shopper’s default list. Resolves with the new items. |
remove(productId, variantId?) | Item[] | Unsave it from every list, with every save that makes has() true for it: without a variant, the product in any variant; with one, that variant and a product-level save. |
toggle(productId, variantId?) | Item[] | Add it if it isn’t saved, remove it if it is. |
- Every method returns a promise. IDs are numeric Shopify IDs, as strings or numbers.
- Reads wait for the shopper’s wishlist to load, and cost no request at all for a shopper who has never saved anything.
- The API shows no toast or message: that is your UI’s job. Failures reject with an
Errorwhosecodeis the storefront API’s error code (sign_in_required,rate_limited,list_full…). A missing or non-numeric product ID rejects withinvalid_requestwithout a request.
Events
cove:change fires on document after every save, removal and sync, from the hearts, the API or another component. event.detail is { items, count, action, productId }: action is add, remove or sync (the first load, a guest list merged at sign-in, a move between lists or a list change), and productId is the product saved or removed (null on a sync). On an add or removal it may also carry variantId, listId (absent for a one-tap save, which goes to the default list, or a removal from every list) and source. cove:ready fires once, when the script has set up.
document.addEventListener('cove:change', event => {
const { count, action, productId } = event.detail;
document.querySelector('#my-count').textContent = String(count);
});
const button = document.querySelector('#my-heart');
button.addEventListener('click', async () => {
try {
await window.CoveWishlist.toggle(button.dataset.productId);
} catch (error) {
if (error.code === 'sign_in_required') location.href = '/account/login';
}
});Pixel events (Meta, GA4)
On the Pro plan and up, Cove publishes wishlist actions as Shopify custom customer events. Any pixel on your store can subscribe to them: a custom pixel you add in Settings › Customer events, or an app pixel that listens for them. Shopify’s Facebook & Instagram and Google & YouTube apps send Shopify’s standard events only, so they don’t forward these on their own: the custom pixel below does. Like every pixel, they follow your store’s customer privacy settings.
| Event | When | event.customData |
|---|---|---|
cove_item_added | A shopper saved a product or variant. | productId: Shopify product ID (string)variantId: Shopify variant ID, or null when the product was savedlistId: Cove’s opaque ID of the list, or null (a removal from every list)source: where it happened (see below) |
cove_item_removed | A shopper removed one. | productId: Shopify product ID (string)variantId: Shopify variant ID, or null when the product was savedlistId: Cove’s opaque ID of the list, or null (a removal from every list)source: where it happened (see below) |
cove_list_shared | A shopper copied their share link, sent it from the share sheet or opened the email link. | listId: Cove’s opaque ID of the shared listmethod: copy, native or email |
cove_notify_subscribed | A shopper’s back-in-stock email alert went live. A guest who still has to confirm it by email isn’t counted. | productId: Shopify product IDvariantId: the sold-out variant (never the email address) |
source is one of:
product_button: the product page button (or <cove-button>)card_heart: a heart on a product cardlist_sheet: the “Change” list picker after a savewishlist_page: the remove button on the wishlist pageundo: Undo in the toastcart_save: Save for later on a cart line (the item then leaves the cart)api: your own code, through window.CoveWishlist
No event carries an email address, a customer ID, a guest token or a share link. Cove installs no pixel of its own: that would need permission to write your store’s pixel settings, and Cove asks for no write access to your store’s data.
Send wishlist saves to Meta and Google Analytics 4
- In your Shopify admin, go to Settings › Customer events and click Add custom pixel. Name it “Cove Wishlist”.
- Under Customer privacy, require Marketing and Analytics permission, as you would for any ads pixel.
- Paste the code below, replace the Meta Pixel ID and GA4 measurement ID, then Save and Connect.
- Save a product on your store, then check with the Meta Pixel Helper (
AddToWishlist), GA4 DebugView (add_to_wishlist) or Shopify’s Test button on the pixel.
// Cove Wishlist → Meta Pixel and Google Analytics 4.
// Settings › Customer events › Add custom pixel. Paste this, replace the
// two IDs, and delete the half you don't use.
const META_PIXEL_ID = 'YOUR_META_PIXEL_ID';
const GA4_MEASUREMENT_ID = 'G-XXXXXXXXXX';
// Your catalog's ID for a saved item, so the event matches your ads catalog.
// Catalogs synced by Shopify's Facebook & Instagram and Google & YouTube
// apps usually use shopify_<COUNTRY>_<product ID>_<variant ID>: set your
// catalog's country, or return variantId if your catalog uses variant IDs.
const CATALOG_COUNTRY = 'US';
function catalogId(productId, variantId) {
return variantId
? 'shopify_' + CATALOG_COUNTRY + '_' + productId + '_' + variantId
: productId;
}
function loadScript(src) {
const script = document.createElement('script');
script.async = true;
script.src = src;
document.head.appendChild(script);
}
// Meta Pixel (Meta's base code, written out).
const fbq = (window.fbq = function () {
fbq.callMethod ? fbq.callMethod.apply(fbq, arguments) : fbq.queue.push(arguments);
});
fbq.push = fbq;
fbq.loaded = true;
fbq.version = '2.0';
fbq.queue = [];
loadScript('https://connect.facebook.net/en_US/fbevents.js');
fbq('init', META_PIXEL_ID);
// Google tag. No page view: your Google channel already sends those.
window.dataLayer = window.dataLayer || [];
function gtag() {
window.dataLayer.push(arguments);
}
loadScript('https://www.googletagmanager.com/gtag/js?id=' + GA4_MEASUREMENT_ID);
gtag('js', new Date());
gtag('config', GA4_MEASUREMENT_ID, { send_page_view: false });
analytics.subscribe('cove_item_added', (event) => {
const { productId, variantId } = event.customData;
const id = catalogId(productId, variantId);
fbq('track', 'AddToWishlist', {
content_ids: [id],
content_type: 'product',
});
gtag('event', 'add_to_wishlist', {
items: [{ item_id: id }],
});
});
The same analytics.subscribe pattern works for the other events, for any service your pixel can reach.
Klaviyo and Omnisend
On the Pro plan and up, Cove can also hand wishlist saves, removals and back-in-stock signups to the Klaviyo or Omnisend script already on your store, so you can build flows on them. Turn each one on in the theme editor: App embeds › Cove Wishlist › Advanced › Send wishlist events to Klaviyo or Send wishlist events to Omnisend. Both are off until you do.
- Cove uses each platform’s documented onsite JavaScript (
klaviyo.track, and Omnisend’s custom events) and only when that script is on the page. It never loads their scripts, and stores no Klaviyo or Omnisend API key. - No event carries an email address or a customer ID. The platform attributes the event to the visitor it already recognises: Klaviyo tracks onsite events for browsers it has identified, and Omnisend for identified contacts. A visitor neither knows is not recorded.
- When your store collects consent with Shopify’s Customer Privacy API (Shopify’s cookie banner does), nothing is sent for a shopper who declined marketing.
- The product details come from the page: on a product page, the variant’s title, URL, image and price as your theme renders them; from a heart on a product card or the wishlist page, what that card shows, without a price. Nothing is fetched to fill them in.
| When | Klaviyo metric | Omnisend custom event |
|---|---|---|
| A shopper saved a product or variant. | Added to Wishlist | added product to wishlist |
| A shopper removed one. | Removed from Wishlist | removed product from wishlist |
| A shopper asked Cove for a back-in-stock email (the address stays with Cove). | Signed Up for Back in Stock | signed up for back in stock |
| Klaviyo property | Omnisend properties.product | Holds |
|---|---|---|
ProductID | id | Shopify product ID (string) |
VariantID | variantId | Shopify variant ID, or null |
ProductName | title | the product title |
URL | url | the product page URL |
ImageURL | imageUrl | the variant’s image, else the product’s |
Price | price | the variant’s price: in units for Klaviyo (22.5), in cents for Omnisend (2250) |
Currency | currency | the shopper’s currency (ISO code) |
Source | properties.source | where it happened, as for pixel events; notify for a signup |
Attentive isn’t supported: its onsite Tag SDK has no custom events, and its custom events API needs a private API key, which Cove doesn’t hold. Use Shopify Flow (below) instead.
Build a wishlist reminder flow in Klaviyo
- Turn on Send wishlist events to Klaviyo and save a product on your store in a browser Klaviyo knows (for example after clicking one of your Klaviyo emails). Within a few minutes the profile’s activity feed shows
Added to Wishlist. - In Klaviyo, create a flow from scratch and choose the metric Added to Wishlist as its trigger.
- Add a flow filter such as “Placed Order zero times since starting this flow”, then a time delay (two or three days works for most stores).
- Add an email. Use
{{ event.ProductName }},{{ event.ImageURL }},{{ event.URL }}and{{ event.Price }}. For saves from a product card, which carry no price, look the product up in your synced catalog with Klaviyo’s catalog lookup tag onevent.ProductID.
In Omnisend, the same works as an automation whose trigger is the custom event added product to wishlist; its properties are available to the email.
Back in stock, and the Shopify Flow alternative
A browser event can’t tell Klaviyo that a product came back in stock: Cove knows that on its server, from your inventory. On the Starter plan and up, Cove’s Shopify Flow triggers (Wishlisted item back in stock, price dropped, running low, item added) fire for signed-in customers, and Klaviyo’s Shopify Flow connector can turn one into a Klaviyo event:
- In Shopify Flow, start a workflow with the Cove Wishlist trigger Wishlisted item back in stock.
- Add Klaviyo’s Track an event action. Name the event (for example “Wishlist Item Back in Stock”), map the customer’s email and the product’s title, URL and image from the trigger. The Klaviyo public API key that action asks for is entered in Shopify Flow, not in Cove.
- In Klaviyo, build a flow on that metric and send the email.
This works for any platform with a Shopify Flow action, and it reaches customers who saved while signed in, wherever they browse later. Cove can also send the back-in-stock email itself (Signed Up for Back in Stock then tells Klaviyo who asked).
Custom elements
For page builders and sections where the app’s blocks can’t go. Turn them on in the theme editor: App embeds › Cove Wishlist › Advanced › Load custom elements. Stores that leave it off load nothing extra.
<cove-button product-id variant-id button-style>: a wishlist button for exactly that product (or variant), with the same design, toast, undo and list picker as the product button.button-styleisicon-label(default),icon,text,pilloroutline. Changing an attribute re-renders it.<cove-count>: the number of saved items, hidden at 0.<cove-link>: a link to the wishlist page with the count. Empty, it shows the design’s icon; anything inside it (text, your own icon) becomes the link’s content.
<cove-button product-id="8123456789"></cove-button>
<cove-button product-id="8123456789" variant-id="45123456789" button-style="icon"></cove-button>
<cove-count></cove-count>
<cove-link></cove-link>
<cove-link>My wishlist</cove-link>The elements render text with textContent only and never fetch anything of their own.
Styling hooks
Restyle Cove from your theme’s CSS with these custom properties and classes. They are stable within version 1: we may add new ones, but renaming or removing one only happens in a new major version, announced here. Anything else about the markup (element order, wrappers, attributes not listed) can change in any release, so target the hooks, not the structure. Pro stores can also add custom CSS in the Design Studio.
Custom properties
Set by the app embed on :root from the Design Studio (the wishlist grid ones on .cove-wl). Override them in your theme to change one value everywhere.
| Property | What it is |
|---|---|
--cove-color | Icon colour. |
--cove-color-active | Icon colour when saved, and the count badge. |
--cove-color-hover | Icon colour on hover (falls back to --cove-color). |
--cove-bg | Background of card hearts and the floating wishlist link. |
--cove-border | Border of the pill button, hearts and floating link. |
--cove-size | Icon size. |
--cove-size-mobile | Icon size below 750px. |
--cove-radius | Corner radius of card hearts. |
--cove-card-offset | Distance of a card heart from the card’s corner. |
--cove-font-scale | Text size multiplier for the button, toast and social proof. |
--cove-font | Font family, only when the design picks one. |
--cove-heading-font | Heading font on the wishlist page, only when picked. |
--cove-label | Button label colour, only when set. |
--cove-button-fill | Button background, only when set. |
--cove-letter-spacing | Letter spacing of button, toast and social proof text. |
--cove-toast-bg | Toast background. |
--cove-toast-text | Toast text colour. |
--cove-wl-cols | Wishlist page grid columns (set on .cove-wl). |
--cove-wl-cols-mobile | Wishlist page grid columns below 750px. |
Buttons and hearts
| Class | What it is |
|---|---|
cove-product | Wrapper of the product page button block. |
cove-product--full | Full-width product button. |
cove-btn | Every wishlist button, including <cove-button>. |
cove-btn--outline | Outlined button style. |
cove-btn--pill | Pill button style. |
cove-btn__label | The button’s text. |
cove-icon | The heart (or custom) icon, an inline SVG. |
cove-proof | Social proof line under the product button. |
cove-notify | “Notify me when available” box under the product button (ACCB-394). |
cove-notify__button | The “Notify me” button. |
cove-notify__form | The guest form (email + consent). |
cove-notify__field | The email field’s label, around its text and the field. |
cove-notify__email | The guest form’s email field. |
cove-notify__consent | The consent tick and its text. |
cove-notify__submit | The guest form’s submit button. |
cove-notify__note | Confirmation or error text. |
cove-cart-save | “Save for later” button on a cart line, cart page and drawer (ACCB-385). |
cove-card | Added to a theme product card that carries a heart. |
cove-heart | Heart on a product card. |
cove-heart--top-right | Heart position: top right. |
cove-heart--top-left | Heart position: top left. |
cove-heart--bottom-right | Heart position: bottom right. |
cove-heart--bottom-left | Heart position: bottom left. |
cove-heart--overlay | Heart over a wishlist page card’s image. |
Wishlist link and count
| Class | What it is |
|---|---|
cove-launcher | Link to the wishlist page, including <cove-link>. |
cove-launcher--floating | The floating round link. |
cove-launcher--header | The link placed in the header. |
cove-launcher--element | A <cove-link>. |
cove-launcher--text | A <cove-link> with its own content. |
cove-count | Saved-item count; hidden at 0. |
cove-vh | Text for screen readers only (the wishlist link’s name, the compare-at price’s label). |
cove-count--inline | The count inside <cove-count>, in line. |
Toast and list picker
| Class | What it is |
|---|---|
cove-toast | The confirmation toast. |
cove-toast__link | Links and buttons in the toast. |
cove-sheet | The “Change” list picker overlay. |
cove-sheet__panel | Its panel. |
cove-sheet__title | Its title. |
cove-sheet__lists | The list of lists. |
cove-sheet__item | One list, with its tick box. |
cove-sheet__new | The new-list form. |
cove-sheet__create | Its create button. |
cove-sheet__close | The close button. |
Wishlist page
| Class | What it is |
|---|---|
cove-wl | The page (owner, guest or shared). |
cove-wl__head | Title row, with “Add all to cart”. |
cove-wl__title | Page title. |
cove-wl__intro | Intro text. |
cove-wl__tools | Row above the grid: list tabs, share and manage lists. |
cove-wl__actions | Share and manage lists chips. |
cove-wl__notice | “Link paused” notice. |
cove-wl__addall | “Add all to cart” form. |
cove-wl__signin | Sign-in prompt for guests. |
cove-wl__flagged | “Needs attention” notice. |
cove-wl__grid | The product grid. |
cove-wl__pages | Pagination. |
cove-wl__loading | Loading state of the guest page. |
cove-wl__empty | Empty state. |
cove-wl__empty-title | Empty state title. |
cove-wl__empty-badge | Circle around the empty state illustration. |
cove-wl__empty-img | Empty state image. |
cove-wl__empty-icon | Empty state illustration, when no image is set. |
cove-wl__cta | Empty state button. |
cove-wl-card | One saved product. |
cove-wl-card__media | Its image (data-ratio: square, portrait or natural). |
cove-wl-card__placeholder | Image placeholder. |
cove-wl-card__badges | Badges over the image. |
cove-wl-badge | A badge. |
cove-wl-badge--drop | “Price dropped” badge. |
cove-wl-remove | Remove button over the image. |
cove-wl-card__body | Vendor, title, variant and price. |
cove-wl-card__heading | The card’s heading (h2), around the product title. |
cove-wl-card__title | Product title. |
cove-wl-card__vendor | Vendor. |
cove-wl-card__choice | Variant slot: the saved variant or the variant chooser. |
cove-wl-card__variant | Variant. |
cove-wl-card__price | Price. |
cove-wl-card__cart | Add-to-cart form. |
cove-wl-card__add | Add-to-cart button. |
cove-wl-card__options | Variant buttons (one option with up to six values). |
cove-wl-card__option | One variant button. |
cove-wl-card__select-wrap | Around a select. |
cove-wl-card__select | Variant or list select. |
cove-wl-card__label | Form labels. |
cove-wl-card__actions | Card footer: note and “Move to”. |
cove-wl-card__note | The note’s first line. |
cove-wl-note | The note dialog. |
cove-wl-note__form | Its form. |
cove-wl-move | “Move to” form. |
cove-wl-link | Text-style buttons (note, move, list and share actions). |
cove-wl-link--danger | Delete list, stop sharing. |
cove-wl-lists | List tabs. |
cove-wl-manage | Manage lists chip and dialog. |
cove-wl-chip | Small bordered controls (share, manage lists). |
cove-wl-ico | Line icons in chips and buttons. |
cove-wl-share | Share controls. |
cove-wl-share__open | Opens the share dialog. |
cove-wl-share__live | Dot on it while the link is live. |
cove-wl-share__hint | Who can see the link. |
cove-wl-share__field | Link field and Copy. |
cove-wl-share__row | Email and share buttons. |
cove-wl-share__more | Pause, replace, stop. |
cove-wl-dialog | Share, manage lists, “Move to” and note dialogs. |
cove-wl-dialog__panel | Its panel. |
cove-wl-dialog__head | Title and close button. |
cove-wl-dialog__title | Its title. |
cove-wl-dialog__x | Its close button. |
cove-wl-dialog__choices | The lists to move to. |
cove-wl-dialog__item | One list to move to. |
cove-wl-dialog__count | Its item count. |
cove-wl-dialog__actions | Its buttons. |
cove-wl-dialog__foot | Secondary actions under a rule. |
cove-wl-dialog__text | What a confirm dialog’s action will do. |
cove-wl-confirm | A confirm dialog (delete a list, new link, stop sharing). |
cove-wl-btn | Buttons inside dialogs. |
cove-wl-btn--primary | The main one. |
cove-wl-btn--danger | A confirm dialog’s action that can’t be undone. |
cove-wl-field | A dialog field with its button. |
cove-wl-field__label | Its label. |
cove-wl-act | One list or share action form. |
States
| Class | What it is |
|---|---|
is-saved | On a button or heart whose item is saved. |
is-busy | While a save or removal is in flight. |
is-toggled | On the button the shopper pressed (save animations key on it). |
is-visible | On the toast while it shows. |
is-ready | On the guest wishlist page once loaded. |
is-unavailable | On a wishlist card whose product can’t be bought. |
Versioning
The REST API is versioned in its path (/api/v1) and follows semantic versioning: within v1 we only add (new endpoints, new optional fields, new error codes), so ignore fields you don’t know. Anything that would break an integration ships as /api/v2, announced here with time to move. The storefront endpoints, window.CoveWishlist, its events, the custom elements and the styling hooks follow the same rule (version 1).
Questions or a feature you need: contact@stackcraftdigital.co.uk. Security reports: see our security page.