Skip to main content
GET
/
api
/
v1
/
webhooks
/
topics.json
Webhook Topics
curl --request GET \
  --url https://api.launchmystore.io/api/v1/webhooks/topics.json \
  --header 'Authorization: Bearer <token>' \
  --header 'Content-Type: application/json' \
  --data '
{
  "topic": "<string>",
  "address": "<string>",
  "format": "<string>",
  "fields": [
    {}
  ]
}
'

Webhook Topics

LaunchMyStore supports 43 webhook topics that notify your app when events occur in the merchant’s store. Subscribe to these topics with POST /api/v1/webhooks.json to receive real-time notifications. This page is the authoritative topic list.

Available Topics

Orders

TopicDescription
orders/createFired when a new order is created. Payload includes a standard shipping_lines[] array with source (the app handle the customer’s shipping rate came from) — see orders/create payload.
orders/updatedFired when an order is updated
orders/paidFired when an order payment is completed
orders/cancelledFired when an order is cancelled
orders/fulfilledFired when all items in an order are fulfilled

orders/create payload

{
  "order": {
    "orderId":      "5c02f40b-aca3-...",
    "invoiceId":    "A0XJ12K",
    "status":       "pending",
    "email":        "buyer@example.com",
    "name":         "Live Buyer",
    "address":      "1 MG Road",
    "addressLine2": "Building A",
    "city":         "New Delhi",
    "state":        "DL",
    "country":      "India",
    "pinCode":      "110011",
    "mobileNumber": "9876543210",
    "currency":     "INR",
    "finalPrice":   8160,
    "shippingPrice": 8085,
    "paymentMethod": "COD",
    "createdAt":    "2026-06-01T22:51:50.123Z",
    "shippingMethod": {
      "appId":       "0524d70f-...",
      "appHandle":   "shiprocket",
      "serviceCode": "shiprocket-1",
      "serviceName": "Blue Dart Air",
      "price":       8085,
      "currency":    "INR"
    }
  },
  "orderProducts": [
    {
      "orderProductId": "...",
      "productId":      "...",
      "varientId":      "...",
      "name":           "Slipper M",
      "quantity":       1,
      "price":          75
    }
  ],
  "shop": {
    "storeId":    "ef10744c-5c4a-4f47-85fc-062ba44afb5f",
    "domainSlug": "raja337276"
  },
  "shipping_lines": [
    {
      "title":    "Blue Dart Air",
      "code":     "shiprocket-1",
      "source":   "shiprocket",
      "price":    "8085",
      "currency": "INR"
    }
  ]
}
shipping_lines[].source is the routing key for shipping apps. When a merchant has multiple shipping apps installed, every app receives every orders/create webhook. Each app inspects source against its own handle and only acts when it matches — this is how your app distinguishes “the customer picked MY rate” from “the customer picked another app’s rate”. See Live Rate Providers for the full handler pattern. source values:
  • "<app_handle>" (e.g. "shiprocket") — customer picked this app’s live rate at checkout
  • null — customer picked a merchant ShippingZone or a local-delivery rule (no app should auto-push)
code carries your app’s service_code from the live-rate response. Convention is <app_handle>-<carrier_id> so apps can strip the prefix to recover their carrier’s internal identifier.

Products

TopicDescription
products/createFired when a new product is created
products/updateFired when a product is updated
products/deleteFired when a product is deleted

Collections

TopicDescription
collections/createFired when a new collection is created
collections/updateFired when a collection is updated
collections/deleteFired when a collection is deleted

Customers

TopicDescription
customers/createFired when a customer record is created
customers/updateFired when a customer is updated
customers/deleteFired when a customer is deleted

Discounts

TopicDescription
discounts/createFired when a discount code is created
discounts/updateFired when a discount code is updated
discounts/deleteFired when a discount code is deleted

Blogs

TopicDescription
blogs/createFired when a blog is created
blogs/updateFired when a blog is updated
blogs/deleteFired when a blog is deleted

Inventory

TopicDescription
inventory/updateFired when an inventory level changes at any location

Fulfillments

TopicDescription
fulfillments/createFired when a fulfillment is created
fulfillments/updateFired when a fulfillment is updated

Refunds

TopicDescription
refunds/createFired when a refund is processed (includes refunds on subscription orders)

Subscriptions

Recurring product subscriptions sold through selling plans. The underlying recurring billing is handled by the merchant’s Stripe subscription; these topics fire as the Stripe subscription moves through its lifecycle.
TopicDescription
subscriptions/createFired on the first successful charge — a new subscription has started (Stripe invoice.payment_succeeded, billing_reason: subscription_create).
subscriptions/renewFired on each automatic renewal charge (Stripe invoice.payment_succeeded, billing_reason: subscription_cycle).
subscriptions/updateFired when the subscription changes — plan/quantity change, status change, or trial→active (Stripe customer.subscription.updated).
subscriptions/payment_failedFired when a renewal charge fails (Stripe invoice.payment_failed). The subscription enters Stripe’s dunning/retry flow.
subscriptions/cancelledFired when the subscription ends — cancelled by the merchant/customer, or expired at period end (Stripe customer.subscription.deleted).
There is no separate subscriptions/expired topic. An expired subscription ends as customer.subscription.deleted in Stripe and is delivered as subscriptions/cancelled. A refund on a subscription order is delivered via refunds/create, not a subscription topic.

Lifecycle order

A typical subscription fires these topics in order over its lifetime:
checkout ──▶ subscriptions/create        (first charge succeeds, access granted)
         ──▶ subscriptions/update         (e.g. trial → active, plan change)   [0..n]
         ──▶ subscriptions/renew          (each automatic renewal charge)      [0..n]
         ──▶ subscriptions/payment_failed (a renewal charge fails)             [0..n]
         ──▶ subscriptions/cancelled      (ends — cancelled or expired)        (terminal)
subscriptions/renew and subscriptions/payment_failed can repeat for the life of the subscription. subscriptions/cancelled is terminal — no further events fire for that subscription afterwards.

subscription payload

All five subscription topics share the same payload shape:
{
  "orderId":              "5c02f40b-aca3-...",
  "invoiceId":            "A0XJ12K",
  "storeId":              "ef10744c-5c4a-4f47-85fc-062ba44afb5f",
  "subscriptionId":       "sub_1QabcdEFgh...",
  "customerId":           "cus_QabcdEF...",
  "customerEmail":        "buyer@example.com",
  "status":               "active",
  "planName":             "Coffee Club — Monthly",
  "amount":               24.0,
  "currency":             "usd",
  "billingInterval":      "month",
  "billingIntervalCount": 1,
  "currentPeriodStart":   1717286400,
  "currentPeriodEnd":     1719878400,
  "trialEnd":             null
}
FieldTypeDescription
orderIdstringThe LaunchMyStore order the subscription was created from. Stable across the whole subscription lifecycle — use it as your local correlation key.
invoiceIdstringHuman-readable invoice/order reference.
storeIdstringThe merchant store the subscription belongs to.
subscriptionIdstringThe recurring subscription identifier (sub_…). Unique per subscription.
customerIdstringThe billing customer identifier (cus_…).
customerEmailstringBuyer email — handy for provisioning access on an external system.
statusstringCurrent subscription status (see below).
planNamestringThe plan/product name shown to the buyer.
amountnumberCharge amount per billing cycle, in major units (e.g. 24.0 = $24.00).
currencystringISO-4217 currency code, lowercase.
billingIntervalstringday | week | month | year.
billingIntervalCountnumberNumber of intervals between charges (e.g. 3 + month = quarterly).
currentPeriodStartnumberUnix timestamp (seconds) — start of the current paid period.
currentPeriodEndnumberUnix timestamp (seconds) — when the next renewal is due.
trialEndnumber | nullUnix timestamp (seconds) when the trial ends, or null if no trial.
status mirrors the underlying subscription status. The value you can expect per topic:
TopicTypical status
subscriptions/createactive, or trialing if the plan has a trial
subscriptions/renewactive
subscriptions/updateany — trialing, active, past_due, canceled
subscriptions/payment_failedpast_due
subscriptions/cancelledcanceled

Example handler

Grant access on the first charge and each renewal, pause on a failed charge, and revoke on cancellation:
app.post('/webhooks/subscriptions', verifyHmac, (req, res) => {
  const topic = req.headers['x-lms-topic'];
  const s = req.body; // the subscription payload above

  switch (topic) {
    case 'subscriptions/create':
    case 'subscriptions/renew':
      grantAccess(s.customerEmail, { until: s.currentPeriodEnd });
      break;
    case 'subscriptions/payment_failed':
      pauseAccess(s.customerEmail);          // card retry in progress
      break;
    case 'subscriptions/cancelled':
      revokeAccess(s.customerEmail);         // terminal
      break;
    case 'subscriptions/update':
      syncPlan(s.customerEmail, s.planName, s.status);
      break;
  }
  res.sendStatus(200); // ack within 10s
});
Idempotency & ordering: deliveries are at-least-once and may arrive out of order or be retried, so key your handler on subscriptionId + currentPeriodStart and make access changes idempotent. The topic is in the X-LMS-Topic header; verify the X-LMS-Hmac-SHA256 signature (see Webhook Verification) before acting.

Carts

TopicDescription
carts/createFired when a new cart is created
carts/updateFired when a cart is modified (line add/remove/qty change)

Checkouts

TopicDescription
checkouts/createFired when a checkout begins
checkouts/updateFired when a checkout step is updated

Themes

TopicDescription
themes/publishFired when a theme is published as the active theme
themes/updateFired when theme files or settings change

Shop

TopicDescription
shop/updateFired when shop settings are updated

App Lifecycle

TopicDescription
app/installedFired when your app is installed into a store
app/uninstalledFired when your app is uninstalled from a store
app/installed and app/uninstalled are dispatched to your app’s configured webhook URL regardless of whether you explicitly subscribed to them — they are platform-level lifecycle events you should always handle.

Storefront Forms

TopicDescription
newsletter/createFired when a visitor subscribes via a storefront newsletter form
contact_form/createFired when a storefront contact form is submitted

GDPR (Mandatory)

TopicDescription
customers/data_requestMerchant or customer requested their data export. Your app must return all stored personal data for the customer within 30 days.
customers/redactA customer has been deleted; redact (or hash) any data your app stores about them within 30 days.
shop/redactA store has uninstalled your app for 48+ hours; permanently delete all merchant data within 30 days.
GDPR webhooks are mandatory for app-store listing. See GDPR compliance for the payload contract and deadlines.

Subscribing to Webhooks

Create a webhook subscription using the API:
curl -X POST "https://api.launchmystore.io/api/v1/webhooks.json" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "topic": "orders/create",
    "address": "https://your-app.com/webhooks/orders",
    "format": "json"
  }'

Webhook Subscription Parameters

topic
string
required
The webhook topic to subscribe to. Must be one of the 43 topics above.
address
string
required
HTTPS URL where webhook payloads are POSTed.
format
string
default:"json"
Payload format: json (default) or xml.
fields
array
Specific top-level fields to include in the payload. Omit to receive the full payload object.

Webhook Delivery

PropertyValue
HTTP MethodPOST
Content-Typeapplication/json
Timeout10 seconds
Retry policy3 attempts: 60s → 300s → 900s with ±10% jitter
Signature headerX-LMS-Hmac-SHA256
Your endpoint must return a 2xx status code within 10 seconds to acknowledge receipt. Anything else is treated as a failure and retried per the policy above. After 3 failed attempts the delivery is moved to the delivery-log error state — inspect via Webhook Delivery Logs. See Webhook Verification for the HMAC contract.

Listing Subscriptions

curl -X GET "https://api.launchmystore.io/api/v1/webhooks.json" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

Deleting a Subscription

curl -X DELETE "https://api.launchmystore.io/api/v1/webhooks/{id}.json" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN"