skills/storefront-ui/wishlist-save-for-later/SKILL.md
Let shoppers save products to a wishlist, share it with friends, and get notified when saved items come back in stock or drop in price
npx skillsauth add finsilabs/awesome-ecommerce-skills wishlist-save-for-laterInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Implement persistent wishlists that survive browser sessions for both authenticated and guest users. Includes shareable wishlist links, back-in-stock email alerts for out-of-stock wishlist items, and move-to-cart flows. Guest wishlists stored in localStorage are merged with the server-side list on login.
| Platform | Recommended Approach | Why | |----------|---------------------|-----| | Shopify | Install Wishlist Plus (free tier) or Growave (from $9/mo, includes wishlist + loyalty + reviews) | Wishlist Plus is the most installed wishlist app on Shopify — adds heart buttons to product and collection pages, persistent wishlists for logged-in users, guest wishlist via browser storage, and a shareable wishlist page | | WooCommerce | Install YITH WooCommerce Wishlist (free) — the most widely used WooCommerce wishlist plugin | YITH Wishlist adds an "Add to Wishlist" button to product pages, creates a shareable wishlist page for each customer, handles guest wishlists via session, and includes "move to cart" functionality | | BigCommerce | Enable the built-in Wishlists feature in Account → Wishlists — it's native to the platform; extend with Wishlist Plus app if needed | BigCommerce includes server-side wishlists for registered customers built in; guests need a third-party app or custom solution | | Custom / Headless | Build with localStorage for guest users + server-side storage for authenticated users; merge on login | Full control over data model, sharing, and back-in-stock notifications; see implementation below |
Wishlist Plus (recommended — free tier available):
/pages/wishlist) in the app settings/pages/wishlistBack-in-stock alerts:
YITH WooCommerce Wishlist (free):
[yith_wcwl_wishlist] shortcode, then select it/wishlist/?token=[user-token] for sharingBack-in-stock with YITH:
Built-in Wishlists:
For guest wishlists: BigCommerce's built-in wishlist requires login. Install Wishlist Plus from the BigCommerce App Marketplace for guest wishlist support.
localStorage guest wishlist:
// lib/wishlistStore.js
const KEY = 'guest_wishlist';
export function getGuestWishlist() {
try { return JSON.parse(localStorage.getItem(KEY) ?? '[]'); } catch { return []; }
}
export function toggleGuestWishlist(item) {
const items = getGuestWishlist();
const exists = items.some(i => i.variantId === item.variantId);
const updated = exists
? items.filter(i => i.variantId !== item.variantId)
: [...items, { ...item, addedAt: Date.now() }];
try { localStorage.setItem(KEY, JSON.stringify(updated)); } catch {}
return updated;
}
Merge guest wishlist on login:
export async function mergeGuestWishlistOnLogin() {
const guestItems = getGuestWishlist();
if (guestItems.length === 0) return;
await fetch('/api/wishlist/merge', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ items: guestItems }),
});
localStorage.removeItem('guest_wishlist');
}
// Server: POST /api/wishlist/merge
// Insert only items not already in the user's server wishlist
Heart button component:
function WishlistButton({ product, variant }) {
const { toggle, isWishlisted } = useWishlist();
const wishlisted = isWishlisted(variant.id);
return (
<button
onClick={() => toggle({ productId: product.id, variantId: variant.id })}
aria-label={wishlisted ? `Remove ${product.name} from wishlist` : `Add ${product.name} to wishlist`}
aria-pressed={wishlisted}
className={`wishlist-btn ${wishlisted ? 'active' : ''}`}>
<svg aria-hidden="true" viewBox="0 0 24 24"
fill={wishlisted ? 'currentColor' : 'none'} stroke="currentColor">
<path d="M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 0 0 0-7.78z" />
</svg>
</button>
);
}
Back-in-stock notification trigger (run on inventory webhook or cron):
async function notifyBackInStock(variantId) {
const subscribers = await db.backInStockSubscriptions.findMany({
where: { variantId, notifiedAt: null },
});
for (const sub of subscribers) {
await emailService.send({
to: sub.email,
template: 'back-in-stock',
data: { productName: sub.productName, productUrl: sub.productUrl },
});
await db.backInStockSubscriptions.update({
where: { id: sub.id }, data: { notifiedAt: new Date() },
});
}
}
localStorage entries older than 90 days to avoid showing discontinued products| Problem | Solution |
|---------|----------|
| Guest wishlist lost on login | Implement the merge flow immediately after authentication; trigger it in the post-login redirect |
| Back-in-stock email sends multiple times | Mark notifiedAt on the subscription record after sending; only notify subscribers where notifiedAt IS NULL |
| Wishlist heart causes full-page re-render | Manage wishlist state at a context level (React Context or Zustand) so only the heart button re-renders |
| Share link exposes private data | Render only product name, image, and price on shared wishlists — never addresses, notes, or account info |
| localStorage blocked in private browsing | Wrap all reads/writes in try/catch; fall back to in-memory storage for the current session |
development
Build a themeable storefront with design tokens and CSS custom properties that supports white-labeling, multi-brand variants, and dark mode
development
Speed up product discovery with instant search suggestions, fuzzy typo matching, and category-aware results powered by Algolia or Elasticsearch
development
Build a mobile-first storefront with thumb-friendly navigation, sticky add-to-cart buttons, and touch-optimized components for high mobile conversion
data-ai
Show shoppers the products they recently browsed using browser storage so they can easily pick up where they left off on your store