push-notifications

Send browser push notifications for price drops, back-in-stock alerts, and cart reminders to bring shoppers back without needing their email

11 stars

Best use case

push-notifications is best used when you need a repeatable AI agent workflow instead of a one-off prompt.

Send browser push notifications for price drops, back-in-stock alerts, and cart reminders to bring shoppers back without needing their email

Teams using push-notifications should expect a more consistent output, faster repeated execution, less prompt rewriting.

When to use this skill

  • You want a reusable workflow that can be run more than once with consistent structure.

When not to use this skill

  • You only need a quick one-off answer and do not need a reusable workflow.
  • You cannot install or maintain the underlying files, dependencies, or repository context.

Installation

Claude Code / Cursor / Codex

$curl -o ~/.claude/skills/push-notifications/SKILL.md --create-dirs "https://raw.githubusercontent.com/finsilabs/awesome-ecommerce-skills/main/skills/marketing-growth/push-notifications/SKILL.md"

Manual Installation

  1. Download SKILL.md from GitHub
  2. Place it in .claude/skills/push-notifications/SKILL.md inside your project
  3. Restart your AI agent — it will auto-discover the skill

How push-notifications Compares

Feature / Agentpush-notificationsStandard Approach
Platform SupportNot specifiedLimited / Varies
Context Awareness High Baseline
Installation ComplexityUnknownN/A

Frequently Asked Questions

What does this skill do?

Send browser push notifications for price drops, back-in-stock alerts, and cart reminders to bring shoppers back without needing their email

Where can I find the source code?

You can find the source code on GitHub using the link provided at the top of the page.

SKILL.md Source

# Push Notifications

## Overview

Web push notifications deliver timely messages to subscribers even when they are not on your site — for back-in-stock alerts, price drops, and cart reminders. Push requires explicit browser permission, making the opt-in prompt timing critical. For Shopify, WooCommerce, and BigCommerce, dedicated push notification apps (PushOwl, OneSignal) handle all the subscriber management, triggering logic, and delivery without custom service worker code.

## When to Use This Skill

- When adding back-in-stock notifications to replace static "notify me" email forms
- When recovering abandoned carts via a browser push channel alongside email
- When building a price-watch feature for wishlisted items
- When email deliverability is poor and a supplemental channel is needed
- When targeting mobile-first markets where push opt-in rates exceed email opt-in

## Core Instructions

### Step 1: Choose the right push notification platform

| Platform | Best For | Shopify | WooCommerce | BigCommerce | Price |
|----------|---------|---------|-------------|-------------|-------|
| **PushOwl** | Shopify-native, back-in-stock + abandonment | App Store | — | — | Free tier; $19+/mo |
| **OneSignal** | All platforms, free tier, highly configurable | Via JS tag | Plugin | Via JS tag | Free tier; $9+/mo |
| **Klaviyo Web Push** | Already using Klaviyo for email | App Store | Plugin | App Marketplace | Included in Klaviyo |
| **PushEngage** | WooCommerce + segmented campaigns | — | Plugin | Via JS tag | Free tier; $9+/mo |

**Shopify recommendation:** Use **PushOwl** — it's the most integrated Shopify push app with built-in back-in-stock, cart abandonment, and shipping alerts.

**WooCommerce recommendation:** Use **PushEngage** or **OneSignal** — both have WordPress plugins and handle subscriber management automatically.

### Step 2: Set up push notifications

---

#### Shopify with PushOwl

1. Install **PushOwl** from the Shopify App Store
2. Go to **PushOwl → Settings → Opt-in Prompt** and configure:
   - Delay the prompt: set it to trigger after a customer views 2+ pages or adds an item to cart
   - Opt-in message: "Get notified when items are back in stock and for price drops"
3. Go to **PushOwl → Automations → Back in Stock** and enable it — PushOwl automatically adds a "Notify Me" button to out-of-stock products and fires the push when inventory is replenished
4. Go to **PushOwl → Automations → Cart Abandonment** and enable it:
   - Set timing: 1 hour after abandonment, then 24 hours
   - Customize the notification message and the cart recovery URL
5. Go to **PushOwl → Campaigns** to send broadcast push notifications for sales, new arrivals, or flash discounts

---

#### WooCommerce with PushEngage

1. Install **PushEngage** from the WordPress plugin directory (free tier available)
2. Go to **PushEngage → Settings → Subscription Prompt** and configure the opt-in dialog
3. Enable automated campaigns:
   - Go to **PushEngage → Automation → Cart Abandonment** and set the timing and message
   - Go to **PushEngage → Automation → Back in Stock** and enable it (requires WooCommerce stock event integration)
4. For price drop alerts: go to **PushEngage → Automation → Price Drop Alert** and enable subscriber opt-in per product
5. Use **PushEngage → Broadcast** to send manual push campaigns to all subscribers

---

#### BigCommerce with OneSignal

1. Sign up for **OneSignal** at onesignal.com and create a Web Push app
2. Go to **OneSignal → Settings → Web Push → Setup** and follow the HTTPS domain verification
3. Add the OneSignal JavaScript snippet to your BigCommerce store via **Storefront → Script Manager**:
   ```javascript
   <script src="https://cdn.onesignal.com/sdks/web/v16/OneSignalSDK.page.js" defer></script>
   <script>
     window.OneSignalDeferred = window.OneSignalDeferred || [];
     OneSignalDeferred.push(async function(OneSignal) {
       await OneSignal.init({ appId: "YOUR_APP_ID" });
     });
   </script>
   ```
4. For back-in-stock: use BigCommerce webhooks to trigger a OneSignal API call when product stock transitions from 0 to available
5. For cart abandonment: use BigCommerce's Abandoned Cart webhook + OneSignal REST API to send cart recovery pushes

---

#### Custom / Headless

For headless stores, implement push using the Web Push API directly:

```javascript
// Service worker — save as /sw.js in your public directory
self.addEventListener('push', (event) => {
  const data = event.data?.json() ?? {};
  event.waitUntil(
    self.registration.showNotification(data.title, {
      body: data.body,
      icon: data.icon ?? '/icons/icon-192.png',
      image: data.image,
      data: { url: data.url },
      actions: data.actions ?? [],
    })
  );
});

self.addEventListener('notificationclick', (event) => {
  event.notification.close();
  event.waitUntil(clients.openWindow(event.notification.data?.url ?? '/'));
});
```

```typescript
// Server-side push sending using the web-push library
import webpush from 'web-push';

webpush.setVapidDetails(
  'mailto:admin@yourstore.com',
  process.env.VAPID_PUBLIC_KEY!,
  process.env.VAPID_PRIVATE_KEY!
);

// Generate VAPID keys once: npx web-push generate-vapid-keys

async function sendPushNotification(subscription: PushSubscription, payload: {
  title: string;
  body: string;
  url: string;
  icon?: string;
}) {
  try {
    await webpush.sendNotification(subscription, JSON.stringify(payload));
  } catch (err: any) {
    if (err.statusCode === 410) {
      // Subscription expired — remove from database
      await db.pushSubscriptions.deleteByEndpoint(subscription.endpoint);
    }
  }
}

// Triggered when inventory transitions from 0 to > 0
async function notifyBackInStock(productId: string) {
  const product = await db.products.findById(productId);
  const waitlist = await db.pushWaitlist.findByProduct(productId);

  for (const entry of waitlist) {
    const sub = await db.pushSubscriptions.findByUserId(entry.userId);
    if (!sub) continue;
    await sendPushNotification(sub, {
      title: 'Back in stock!',
      body: `${product.name} is available again`,
      url: `${process.env.STORE_URL}/products/${product.slug}`,
      icon: product.images[0]?.url,
    });
  }
}
```

### Step 3: Optimize opt-in timing

The most critical factor for push notification effectiveness is **when** you show the permission prompt. Never ask on the first page load.

**Best triggers for the opt-in prompt:**
- After the visitor has viewed 3+ products
- Immediately after a customer adds an item to cart
- When a customer views an out-of-stock product (context: "Get notified when it's back")
- On the order confirmation page ("Get shipping updates and deals via browser push")

In PushOwl: go to **Settings → Opt-in Prompt → Advanced** and set the trigger condition.
In PushEngage: go to **Subscription Prompt → Display Rules** and set page view count or cart event triggers.

### Step 4: Set up the highest-converting push campaigns

**Priority order by conversion rate:**

1. **Back-in-stock alerts** — highest CTR (15–25%); customers opted in specifically for this product
2. **Cart abandonment** — set for 1 hour and 24 hours after abandonment; use urgency in the second push ("Your cart expires soon")
3. **Price drop alerts** — customers watching a specific product convert at 10–20% when notified of their target price
4. **Shipping updates** — low-friction way to grow push subscribers (capture at order confirmation); keeps brand top-of-mind

**In PushOwl:** all four are available as pre-built automations under **Automations** — enable them and customize the message.

### Step 5: Measure push performance

| Metric | Healthy Target | Where to Find |
|--------|----------------|---------------|
| Opt-in rate | 5–15% of new visitors | App dashboard |
| Back-in-stock click rate | 15–25% | PushOwl/PushEngage analytics |
| Cart abandonment recovery rate | 2–5% | App analytics |
| Unsubscribe rate per campaign | < 2% | App analytics |

If unsubscribe rate is above 2%, reduce push frequency or improve message relevance.

## Best Practices

- **Never request permission on first page load** — acceptance rates jump from ~5% to ~25% when shown after a user action like adding to cart
- **Limit to 2 push notifications per day per user maximum** — excessive frequency is the top driver of opt-out
- **Set a TTL on time-sensitive notifications** — flash sale pushes should expire when the sale ends; PushOwl and PushEngage both support notification expiry
- **Keep notification body under 100 characters** — longer bodies are truncated on Android; test on mobile before deploying
- **Use "Notify me" at the product level for out-of-stock** — this captures high-intent subscribers with context; generic sitewide opt-ins perform worse

## Common Pitfalls

| Problem | Solution |
|---------|----------|
| Low opt-in rate | Move the permission prompt to after add-to-cart or product view #3; never show on first load |
| iOS users not receiving push | Web push on iOS requires iOS 16.4+ and the user must install the site as a PWA (Add to Home Screen); this is a browser limitation |
| Push notifications not firing for back-in-stock | Verify the inventory webhook is connected in PushOwl/PushEngage settings; check the app's automation logs |
| High unsubscribe rate | Reduce push frequency; add preference management so subscribers can choose which notification types they receive |
| Duplicate subscriptions in the database | For custom implementations, use `upsert` keyed on `(userId, endpoint)` |

## Related Skills

- @email-marketing-automation
- @cart-abandonment-recovery
- @sms-marketing
- @exit-intent-popups
- @customer-retention-engine

Related Skills

wishlist-save-for-later

11
from finsilabs/awesome-ecommerce-skills

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

storefront-theming

11
from finsilabs/awesome-ecommerce-skills

Build a themeable storefront with design tokens and CSS custom properties that supports white-labeling, multi-brand variants, and dark mode

search-autocomplete

11
from finsilabs/awesome-ecommerce-skills

Speed up product discovery with instant search suggestions, fuzzy typo matching, and category-aware results powered by Algolia or Elasticsearch

responsive-storefront

11
from finsilabs/awesome-ecommerce-skills

Build a mobile-first storefront with thumb-friendly navigation, sticky add-to-cart buttons, and touch-optimized components for high mobile conversion

recently-viewed-products

11
from finsilabs/awesome-ecommerce-skills

Show shoppers the products they recently browsed using browser storage so they can easily pick up where they left off on your store

quick-view-modal

11
from finsilabs/awesome-ecommerce-skills

Let shoppers preview product details and add items to cart from the listing page without navigating away, reducing friction in the shopping flow

product-page-design

11
from finsilabs/awesome-ecommerce-skills

Design high-converting product detail pages with image galleries, variant selectors, social proof, and clear calls-to-action that drive add-to-cart

product-comparison

11
from finsilabs/awesome-ecommerce-skills

Let shoppers select multiple products and compare them side-by-side in a table with highlighted differences to help them make the right buying decision

mega-menu-builder

11
from finsilabs/awesome-ecommerce-skills

Build a rich navigation mega menu with product images, category highlights, featured banners, and keyboard-accessible dropdowns for large catalogs

image-zoom-360

11
from finsilabs/awesome-ecommerce-skills

Boost product confidence with high-res image zoom, 360-degree spin views, and inline video so shoppers can examine products closely before buying

faceted-navigation

11
from finsilabs/awesome-ecommerce-skills

Let shoppers filter products by multiple attributes simultaneously with URL-shareable filter state, instant results, and mobile-friendly controls

accessibility-commerce

11
from finsilabs/awesome-ecommerce-skills

Make your store usable by everyone with WCAG 2.1 AA compliance — screen reader support, keyboard navigation, and accessible cart and checkout flows