Webhooks
Send subscription events from Subrise to a URL on your own server. Events, payload fields and how to secure your endpoint.
Available on Enterprise plan
A webhook sends a subscription event to a URL you choose. When the event happens, such as a new or paused subscription, Subrise posts the subscription's details to that URL. Use webhooks to keep your own systems, such as a CRM or a warehouse tool, in step with Subrise.
These are Subrise webhooks. They are separate from Shopify's own webhooks.
Create a webhook
- Go to Settings > Webhooks.
- Click Create webhook.
- In Event, choose the event to send.
- In URL, enter your endpoint. It must be a public
https://address. - Click Add webhook.
The webhook appears in Your webhooks with its event and callback URL. To remove it, click the delete button on its row.
Each event has one URL. To send an event to a new URL, remove its webhook and create it again.
If your plan doesn't include webhooks, the page shows Webhooks aren't on your plan and an upgrade button.
Events
| Event | Sent when |
|---|---|
| Subscription created | A subscription is created: at checkout, in the admin or by a migration. |
| Subscription updated | A subscription's products, dates, frequency, discounts, address or payment method change. |
| Subscription paused | A subscription is paused. |
| Subscription resumed | A paused or cancelled subscription is resumed. |
| Subscription cancelled | A subscription is cancelled. |
| Upcoming subscription | Before each order, on the schedule of your upcoming order email. |
| Subscription billing failed | A renewal charge fails. |
| Subscription order placed | A renewal is charged and its order is created. |
Payload
Subrise sends a POST request with a JSON body. Every event has the same body: the subscription as it is after the event.
The body doesn't name the event. The request headers do:
| Header | What it holds |
|---|---|
Subrise-Topic | The event, such as subscription_paused for Subscription paused. |
Subrise-Event-Id | An ID for this event. It's the same on every retry. |
Subrise-Shop | Your store's myshopify.com domain. |
Subrise-Timestamp | When this attempt was sent, in Unix seconds. |
You can also give each event its own URL, such as https://example.com/subrise/paused.
{
"shop": "your-store.myshopify.com",
"id": "28845637871",
"email": "jane@example.com",
"customerId": "7212345678901",
"customerPhone": "+15555550123",
"totalPrice": 39.9,
"totalDiscount": 0,
"totalShipping": 0,
"billingFirstName": "Jane",
"billingLastName": "Doe",
"billingAddress1": "1 Main St",
"billingCity": "Austin",
"billingState": "Texas",
"billingZip": "78701",
"billingCountry": "United States",
"billingProvinceCode": "TX",
"shippingFirstName": "Jane",
"shippingLastName": "Doe",
"shippingAddress1": "1 Main St",
"shippingAddress2": "",
"shippingCity": "Austin",
"shippingState": "Texas",
"shippingZip": "78701",
"shippingCountry": "United States",
"shippingTelephone": "+15555550123",
"shippingProvinceCode": "TX",
"nextBillingDate": "2026-11-18T14:00:00.000Z",
"originOrder": { "id": "gid://shopify/Order/6123456789012", "legacyResourceId": "6123456789012", "name": "#1042" },
"createdAt": "2026-08-18T13:57:02.000Z",
"isPrepaid": false,
"lastOrderDate": "2026-10-18T14:00:05.000Z",
"status": "ACTIVE",
"paymentMaskedNumber": "•••• •••• •••• 4242",
"note": "",
"customAttributes": [],
"currencyCode": "USD",
"frequency": "Charges 1 times a month",
"remainingOrders": "Recurring",
"lines": [
{
"productId": "gid://shopify/Product/8107112694039",
"variantId": "gid://shopify/ProductVariant/44612345678901",
"productTitle": "Coffee",
"variantTitle": "1lb",
"fullTitle": "Coffee - 1lb",
"image": "https://cdn.shopify.com/s/files/coffee.jpg",
"productHandle": "coffee",
"quantity": 2,
"sku": "COF-1LB",
"price": "19.95",
"discountedPrice": "17.96",
"customAttributes": [],
"requiresShipping": true
}
],
"addons": []
}Fields
| Field | What it holds |
|---|---|
shop | Your store's myshopify.com domain. |
id | The subscription contract ID. |
email, customerId, customerPhone | The subscriber. customerId is the numeric Shopify customer ID, not a gid:// ID. |
totalPrice | The price of one order. |
totalDiscount, totalShipping | Always 0 today. Use the line prices instead. |
billing*, shipping* | The billing and shipping addresses. Empty strings when not saved. |
nextBillingDate | When the next order bills, ISO 8601. |
originOrder | The checkout order that started the subscription, when there was one. |
createdAt | When the subscription started. |
isPrepaid | True for a prepaid subscription. |
lastOrderDate | When Shopify last updated the subscription. Can be empty. |
status | ACTIVE, PAUSED, CANCELLED, EXPIRED or FAILED. |
paymentMaskedNumber | The masked card number, when known. |
note, customAttributes | The subscription's note and custom attributes. |
currencyCode | The subscription's currency. |
frequency | The billing frequency as text, such as "Charges 1 times a month". |
remainingOrders | Orders left on a subscription with a set number of orders, or "Recurring". |
lines | The recurring products. Prices are strings. |
addons | One-time add-ons on the next order, in the same shape as lines. |
Respond and retry
Answer with any 2xx status as soon as you receive the request, then do your own work. If your server returns another status or doesn't answer within 15 seconds, Subrise tries again later, waiting longer each time, up to 12 attempts in all.
Because of retries, the same event can arrive more than once. Make your handler safe to run twice: skip a Subrise-Event-Id you've already handled.
Secure your endpoint
Subrise doesn't sign webhook requests with a secret you can check. To make sure a request came from your Subrise webhook:
- Put a long random token in the URL, such as
https://example.com/subrise/paused/8f3c9e1a..., and reject requests without it. - Check that
shopis your store's domain. - Treat the body as a notification. Before you act on something important, read the current state from the Developer API.
The payload holds customer names, emails, phone numbers and addresses. Store it as carefully as you store your other customer data.