Early bird discounts live! Claim your offer

member.* events

Member (subscriber) lifecycle events.

A "member" in webhook events is the project-scoped subscriber (the ProjectUser model), not a team member. Fires on joining, churning, bans, and Telegram-side events driven by the bot.

Events

EventFires when
member.joinedAn access code is redeemed against a non-trial plan. Not paid checkouts.
member.trial_joinedA cardless trial starts, or a code is redeemed against a trial plan.
member.convertedA trial converts to a paying subscription (Stripe only).
member.churnedA subscriber's subscription ends without renewal.
member.removedA subscriber is removed without being banned (e.g., kicked for inactivity).
member.bannedA creator bans a subscriber.
member.unbannedA ban is lifted.
member.kickedA subscriber is ejected from the project without a ban: status goes to churned, active subscriptions are cancelled, and every resource grant is revoked.
member.resource_addedA subscriber is added to an additional resource (channel, group).
member.resource_removedA subscriber is removed from a specific resource.

See the dedicated pages above for full payload, field reference, and caveats per event.

Example payload

Subscription-driven member events (joined, trial_joined, converted, churned, resource_added, resource_removed) carry flat identifier fields:

{
  "id": "evt_01HX...",
  "type": "member.joined",
  "created_at": "2026-05-18T10:05:00Z",
  "api_version": "2026-05-01",
  "project_id": "7f3d1c92-8b45-4e6a-9d21-5c8e0a4b6f13",
  "data": {
    "subscription_id": "5b7e2d40-1a86-4c39-97f2-e83d0b16c5a4",
    "project_id": "7f3d1c92-8b45-4e6a-9d21-5c8e0a4b6f13",
    "plan_id": "c4e82f16-93a7-4d5b-b81c-6e0f27a94d3b",
    "subscriber_id": "2a91c4e7-6f38-4b52-8e0d-9c1a7b3f5d80",
    "access_code": "SLATE-SUNDAY-4F2A9"
  }
}

Moderation events (banned, unbanned, kicked, removed) instead nest a subscriber object:

{
  "id": "evt_01HX...",
  "type": "member.banned",
  "created_at": "2026-05-18T10:05:00Z",
  "api_version": "2026-05-01",
  "project_id": "7f3d1c92-8b45-4e6a-9d21-5c8e0a4b6f13",
  "data": {
    "subscriber": {
      "id": "2a91c4e7-6f38-4b52-8e0d-9c1a7b3f5d80",
      "telegram_user_id": null,
      "status": "banned"
    },
    "reason": "Spamming referral links"
  }
}

data.subscriber.telegram_user_id is always null — the member's Telegram id lives on the linked chat row, not on the member. Resolve it from data.subscriber.id.

Guarantees

  • member.joined and member.trial_joined fire only for zero-payment acquisition — access-code redemptions and cardless trials. Paid checkouts emit subscription.activated with no member.* join event.
  • member.trial_joined accompanies subscription.trial_started on the cardless-trial and access-code paths.
  • member.converted fires at most once per trial conversion, and only for Stripe.
  • No member.* payload carries the subscriber's email. Resolve subscriber detail with GET /v1/projects/{project}/members/{member} using subscriber_id.
  • The members endpoint returns email (member-chosen and verified) and billing_email (taken from their payment provider, unverified). Both require a token with project-user:view.

Required abilities

Tokens subscribing to member.* events must carry project-user:view.

How is this guide?

On this page

Subscriby is a product designed by you — for you.

No boardroom full of executives deciding what we ships next. Our roadmap always shaped by you with your feedback.

Share feedback or a request