> For the complete documentation index, see [llms.txt](https://help.memberply.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://help.memberply.com/integrations/webhooks.md).

# Webhooks integration

The Webhooks integration sends important Memberply membership events to an external URL. You can use this to connect Memberply with tools such as GHL, Zapier, Make, CRMs, or your own custom systems.

Use webhooks when you want another platform to react automatically when a customer's membership changes.

## What the integration can do

* Send member activation events when a customer becomes an active member.
* Send member cancellation events when a member becomes inactive.
* Send tier change events when a member moves from one membership tier to another.
* Send subscription payment failure events for failed membership billing attempts.
* Send reward points balance change events when reward points are redeemed.
* Sign each webhook request so your receiving system can verify it came from Memberply.
* Send a test webhook to confirm your endpoint is receiving requests.
* Retry failed deliveries and show recent delivery history in Memberply.

## Before you start

You need an endpoint URL that can receive `POST` requests with a JSON body.

This URL may come from:

* GHL.
* Zapier.
* Make.
* A custom CRM.
* Your own server or middleware.

Your endpoint should return a successful `2xx` response after it receives the webhook.

## Set up webhooks

1. From the Memberply dashboard, click **Integrations**.
2. Click **Webhooks**.
3. Paste your endpoint URL.
4. Select the events you want Memberply to send.
5. Click **Save settings**.
6. Copy the signing secret and store it somewhere secure.
7. Click **Send test webhook** to confirm your endpoint receives requests.

After this is saved, Memberply will start queueing the selected events for delivery to your endpoint URL.

## Delivery history and retries

Memberply queues each webhook delivery in the database before sending it. This keeps membership flows fast and means delivery can continue even if your endpoint is temporarily unavailable.

Memberply treats any `2xx` response from your endpoint as a successful delivery.

If your endpoint times out or returns a non-`2xx` response, Memberply keeps the delivery in a retry queue and tries again automatically. A delivery can be attempted up to 5 times. The retry schedule is:

* 1 minute after the first failed attempt.
* 5 minutes after the second failed attempt.
* 30 minutes after the third failed attempt.
* 2 hours after later failed attempts, until the maximum attempt count is reached.

The delivery worker checks for due deliveries every 10 seconds by default. It claims a batch of due deliveries before sending them, so multiple Memberply API instances can run the worker without sending the same webhook at the same time.

You can see recent webhook deliveries from **Integrations** > **Webhooks** in Memberply. The delivery history shows:

* The event name and webhook event ID.
* Whether the delivery is pending, delivered, or failed.
* How many attempts have been made.
* The last response code or error.
* The next scheduled retry, if one is pending.

If you need to send a webhook again, click **Replay** next to the delivery. Replay creates a new delivery attempt for the same payload.

Each webhook payload includes an `id`. Use this ID in your receiving system for idempotency, so the same event is not processed twice if it is retried or replayed.

## Available events

| Event                                | When it is sent                                       |
| ------------------------------------ | ----------------------------------------------------- |
| `member.activated`                   | A customer becomes an active member.                  |
| `member.cancelled`                   | A member becomes inactive or loses membership access. |
| `member.tier_changed`                | A member moves from one membership tier to another.   |
| `member.subscription_payment_failed` | A subscription billing attempt fails.                 |
| `member.points_balance_changed`      | A reward points balance changes.                      |

## Webhook payload

Each webhook is sent as a `POST` request with a JSON body.

Example payload:

```json
{
  "id": "example_webhook_id",
  "event_name": "member.activated",
  "occurred_at": "2026-05-28T10:30:00Z",
  "shop": "example.myshopify.com",
  "data": {
    "member": {
      "email": "customer@example.com",
      "first_name": "Jane",
      "last_name": "Smith",
      "phone": "+61400000000",
      "country": "Australia",
      "shopify_customer_id": 123456789,
      "status": "active",
      "member_since": "2026-05-01T00:00:00Z"
    },
    "membership": {
      "tier_name": "Gold Membership",
      "membership_product_shopify_id": 123456789,
      "last_tier_name": "Gold Membership",
      "last_membership_product_shopify_id": 123456789,
      "cancellation_scheduled_at": null,
      "cancelled_at": null
    },
    "metrics": {
      "current_points_balance": 120,
      "lifetime_points_earned": 300,
      "points_redeemed": 180,
      "total_orders": 4,
      "total_spend": 250,
      "currency": "USD",
      "last_order_date": "2026-05-20T00:00:00Z"
    },
    "shopify": {
      "shop_domain": "example.myshopify.com",
      "customer_id": 123456789
    },
    "extra": null
  }
}
```

Some events include extra event-specific data in the `extra` object.

For example, `member.points_balance_changed` includes:

```json
{
  "points": {
    "previous_balance": 200,
    "new_balance": 120,
    "points_changed": -80,
    "action_type": "Redeemed",
    "description": "Points redeemed for discount code"
  }
}
```

## Request headers

Memberply sends these headers with each webhook:

| Header                  | Description                                                                        |
| ----------------------- | ---------------------------------------------------------------------------------- |
| `X-Memberply-Event`     | The event name, such as `member.activated`.                                        |
| `X-Memberply-Signature` | An HMAC SHA-256 signature generated from the request body and your signing secret. |

Use the signing secret to confirm the webhook was sent by Memberply before processing it.

## Important notes

Webhook delivery is intended for automation and integration workflows. It is not a replacement for a full public API.

If you regenerate the signing secret, update your receiving system before relying on signature verification.

If your endpoint is temporarily unavailable, Memberply retries failed deliveries automatically. You can also review and replay recent deliveries from the Webhooks integration page.

Reward points events are only useful when the Reward Points benefit is enabled.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://help.memberply.com/integrations/webhooks.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
