Zapier
Automate Subscriby workflows with Zapier. 106 event triggers, 45 write actions, 45 searches — every REST route on api.subscriby.net and every event in the webhook catalog. Currently available as an invite-only integration.
The Subscriby Zapier app exposes 106 instant triggers, 45 write actions, and 45 searches — full parity with the live api.subscriby.net/v1 surface plus the complete WebhookEvent catalog.
Install
The Subscriby Zapier integration is currently invite-only and is not yet publicly listed in the Zapier App Directory. To request access, contact the Subscriby team. Once you receive an invite link, click it to connect your account. During the OAuth-less connection step Zapier asks for an API token — mint one at app.subscriby.net/settings/tokens with the abilities listed per trigger / action below.
The Subscriby Zapier app is undergoing testing and validation before its public Zapier listing. Access is invite-only during this period.
Production tokens start with sbt_live_; non-production (staging, local)
tokens start with sbt_test_. Both work — Subscriby rejects tokens from the
wrong environment automatically.
Triggers — 106 webhook events
Grouped by family. Every trigger uses the REST Hook pattern: on Zap activation Zapier calls POST /v1/webhook-subscriptions, on deactivation it calls the matching DELETE. All triggers additionally implement a polling fallback (performList) against /v1/webhook-events so the Zap editor can show a sample even before any live event has fired.
Every trigger additionally requires webhook-endpoint:manage on the token so Zapier can create and delete the underlying webhook endpoints.
How triggers work
You pick a trigger in Zapier
Example: New Subscription. Zapier's performSubscribe calls:
POST https://api.subscriby.net/v1/webhook-subscriptions
Authorization: Bearer sbt_live_<id>_<secret>
Idempotency-Key: <zap-scoped-uuid>
Content-Type: application/json
{
"name": "Zapier — New Subscription",
"url": "<zapier-inbound-url>",
"events": ["subscription.created"]
}Subscriby registers the endpoint
The response includes { data: { id }, secret }. Zapier stores both — the secret powers SB-Signature verification on every inbound event.
Event fires inside Subscriby
Any matching event enqueues a delivery to the Zapier inbound URL. Zapier verifies the signature, decodes the envelope, and hands data.* to your Zap.
You turn the Zap off
Zapier calls DELETE /v1/webhook-subscriptions/{id} with a matching idempotency key. The endpoint is removed server-side.
Actions — 45
All writes auto-inject a fresh Idempotency-Key header per call — retries are safe.
Project (5)
create_project—POST /v1/projectsupdate_project—PATCH /v1/projects/{project}archive_project—POST /v1/projects/{project}/archiverestore_project—POST /v1/projects/{project}/restoredelete_project—DELETE /v1/projects/{project}
Plan (5)
create_plan—POST /v1/projects/{project}/plansupdate_plan—PATCH /v1/projects/{project}/plans/{plan}publish_plan—POST /v1/projects/{project}/plans/{plan}/publishunpublish_plan—POST /v1/projects/{project}/plans/{plan}/unpublishdelete_plan—DELETE /v1/projects/{project}/plans/{plan}
Plan Kind — a breaking change in 3.0.0
Create Plan and Update Plan now open with a Plan Kind dropdown, and the fields below it change to match:
| Plan Kind | Sells |
|---|---|
| Recurring Subscription | Access that begins at payment and renews on a cycle. |
| Time-Limited Pass | One dated access window per purchase. |
| Pass Series | A slate of other pass plans' windows, sold once — a season ticket. |
Only the fields your chosen kind accepts are shown, mirroring the API, which refuses a block belonging to another kind rather than ignoring it.
Existing Zaps need their fields re-mapped
The field keys behind these two actions changed in 3.0.0. A Zap that set Billing Cycle still sets one — the field moved into the subscription kind's group — but the mapping has to be re-made by whoever built the Zap. No other trigger, action or search changed its keys.
Building a Pass Series
A series points at windows that already exist on your pass plans, so the order matters:
- Find Pass Windows — the new search. Returns each window's ID, its local range, whether it is still on sale and how many people hold it. Filter by plan, status or date range.
- Create Plan with Plan Kind → Pass Series, pasting those IDs into Pass Window IDs.
- Optionally add Automatic Inclusion Rules. A rule describes windows rather than naming them and keeps matching after the save: a window scheduled later is added to the slate and granted to everyone already holding the series, at no charge. Handpicked IDs never grow on their own — the two compose.
Resource IDs is optional on a series and means a lounge the holder keeps for the whole span; each window already grants its own plan's resources.
Subscription + Member (4)
cancel_subscription—POST /v1/subscriptions/{subscription}/cancelban_member—POST /v1/projects/{project}/members/{member}/banunban_member—POST /v1/projects/{project}/members/{member}/unbankick_member—POST /v1/projects/{project}/members/{member}/kick
Support conversation (3)
reply_support_conversation—POST /v1/support/conversations/{conversation}/messages(set Private Note to record a private team note instead of messaging the member)resolve_support_conversation—POST /v1/support/conversations/{conversation}/resolveassign_support_conversation—POST /v1/support/conversations/{conversation}/assign(leave the assignee empty to clear an assignment)
Resource + Access code (5)
create_resource—POST /v1/projects/{project}/resourcesunlink_resource—POST /v1/projects/{project}/resources/{resource}/unlinkdelete_resource—DELETE /v1/projects/{project}/resources/{resource}bulk_generate_access_codes—POST /v1/projects/{project}/plans/{plan}/access-codes/bulk-generatedelete_access_code—DELETE /v1/projects/{project}/plans/{plan}/access-codes/{access_code}
Webhook endpoint + Token (5)
create_webhook_endpoint—POST /v1/webhook-endpoints(the response surfaces the one-time plaintextsecret)delete_webhook_endpoint—DELETE /v1/webhook-endpoints/{endpoint}rotate_webhook_secret—POST /v1/webhook-endpoints/{endpoint}/rotate-secrettest_webhook_endpoint—POST /v1/webhook-endpoints/{endpoint}/testrevoke_token—DELETE /v1/tokens/{token}
Broadcast (1)
broadcast_message—POST /v1/projects/{project}/broadcasts
Sends one Telegram message to a segment of a project's members. The send is queued, so the action returns the audience it resolved and the recipient count — not a delivery result. Pair it with the Broadcast Completed trigger to log sent and failed.
Test action sends for real
A broadcast cannot be recalled, and Audience defaults to All Users. Clicking Test action while building the Zap sends a real message to every member with a linked chat, not a sample. Set the audience — and, if you want it, the plan — before you test, or point the test at a project with no members.
Choosing the audience
Three fields compose. Audience picks a segment, Narrow to a Plan optionally restricts it to one plan, and Running Out Within (Days) sets the horizon that Expiring Soon reads.
| Group | Segments |
|---|---|
| Member status | All Users, Customers Only, Trialing Users, Leads, Churned Users |
| Subscription state | Expiring Soon, Cancelled Still Inside Their Period, Paused Subscriptions, Trialing Without a Card |
| Passes | All Active Pass Holders, All Active Pass Holders Not in Queue, and the two single-window forms |
Narrow to a Plan composes rather than replaces: Customers Only plus a plan reaches people paying for it right now, Churned Users plus a plan reaches people who held it and left. The plan and the state always describe the same subscription, so somebody paying for Silver who once trialled Gold is not a Gold customer.
The API refuses a plan on Leads, who never subscribed, and on the pass segments, whose plan is implied by the window — a 422 rather than a silently widened send.
An auto-renewing subscription is never Expiring Soon
A subscription's end date is rewritten to the new period end every time it renews, so a date inside the horizon describes the next invoice, not an expiry. Counting it would sweep every monthly subscriber into the segment once a month. A member appears only once their access genuinely lapses — renewal is off, or the plan does not renew at all.
The two single-window pass segments additionally require a Pass Window ID; the API refuses the send without one rather than quietly addressing nobody.
Subscription lifecycle (3)
pause_subscription—POST /v1/subscriptions/{subscription}/pause(suspends resource access; billing continues)unpause_subscription—POST /v1/subscriptions/{subscription}/unpause(restores access and issues fresh invite links — the ones revoked at pause do not come back)reactivate_subscription—POST /v1/subscriptions/{subscription}/reactivate(calls off a scheduled cancellation; Stripe only, other providers error)
Team + RBAC (14)
create_team—POST /v1/teamsupdate_team—PATCH /v1/teams/{team}delete_team—DELETE /v1/teams/{team}invite_team_member—POST /v1/teams/{team}/members(addressed by email, because the invitee may not have a Subscriby account yet; the role field takes a role code that must already exist on the team)update_team_member_role—PATCH /v1/teams/{team}/members/{user}/roleremove_team_member—DELETE /v1/teams/{team}/members/{user}cancel_team_invitation—DELETE /v1/teams/{team}/invitations/{invitation}create_role—POST /v1/rolesupdate_role—PATCH /v1/roles/{role}delete_role—DELETE /v1/roles/{role}create_group—POST /v1/groupsupdate_group—PATCH /v1/groups/{group}delete_group—DELETE /v1/groups/{group}sync_group_members—PUT /v1/groups/{group}/members
Two of these replace rather than merge
Permissions replace. Sending the permissions field on Update Role or Update Group makes that list the entire set. Omit it to leave existing permissions alone.
Sync Group Members is a sync, not an add. Anyone missing from the list is removed from the group, and an empty list empties it. Read the group first if you mean to append.
Creating and re-permissioning need the Growth plan. Deleting and removing do not — a creator whose plan lapsed still has collaborators attached and has to be able to take access away.
Searches — 45
Return a single object (wrapped in [x]) or an array. Use them in dynamic dropdowns, cross-Zap lookups, or as standalone fetch steps.
Core resources
list_projects,get_project,find_project_by_handlelist_plans,find_plan_by_name,find_plan_by_idlist_subscriptions,find_subscription_by_idlist_members,find_member_by_id,find_subscriber_by_telegram_idlist_resources,get_resourcelist_access_codes,preview_access_code_costlist_support_conversations,find_support_conversation,list_support_messages
Infrastructure
list_payment_methods,get_payment_methodlist_webhook_endpoints,list_webhook_deliverieslist_tokens,get_token
Teams + RBAC
list_teams,get_team,get_current_teamlist_team_members,get_team_memberlist_roles,get_rolelist_groups,get_group
Ops + distribution
list_activity(bysubject_type+subject_id)get_bot_status,get_bot_link,get_portal_url,get_deep_link
Analytics
All require dashboard:read except list_transactions which uses project-subscription:view-any.
get_dashboard_metrics— MRR, active subscribers, churn, revenue trendget_earnings_report— gross / fees / net, timeseries byday/week/monthget_subscriber_analytics— signups, cancellations, churn rate, trial conversionget_transaction_breakdown— USD totals grouped byplan,payment_provider,currency, orprojectget_plan_performance— per-plan active subs, revenue, average ticketlist_transactions— keyset-paginated transaction list
Recipes
Prebuilt Zap ideas combining Subscriby triggers with common downstream apps. Swap the destination for whatever CRM, spreadsheet, or messaging tool fits your stack.
Revenue ops
New subscriber → welcome email
- Trigger:
subscription.createdon project X. - Action: Mailjet / Resend / Postmark → send a "Welcome" email using the subscriber's email field.
Most members have no
email— they join through a bot and are never asked for one.billing_emailis often the only address on file, and it is unverified, so treat it as identification rather than a consented mailing address.
New subscriber → CRM upsert
- Trigger:
subscription.created. - Action: HubSpot / Pipedrive / Attio → create-or-update contact; tag with plan name + initial MRR.
Churn → Slack alert
- Trigger:
subscription.cancelledorsubscription.expired. - Action: Slack → post in
#churn-watchwith subscriber handle, plan, and days-subscribed.
Failed payment → Slack + follow-up email
- Trigger:
payment.failed. - Action 1: Slack → post in
#revenue-ops. - Action 2: Delay 12 hours, then run the
find_subscription_by_idsearch. If the next retry hasn't cleared the state, fire a Mailjet reminder with a one-tap link to update the payment method.
Past due → automated drip
- Trigger:
subscription.past_due. - Action: Mailjet sequence — day 1 "payment failed", day 3 "reminder", day 7 "last chance".
Trial converting → personal nudge
- Trigger:
subscription.trial_converting. - Action: Slack DM to the creator with a link to the subscriber's profile so they can intervene before the trial flips to paid.
Access codes
Access-code batch generated → Airtable export
- Trigger:
access_code.generated. - Action: Airtable → append a row with batch metadata (plan, count, expiry).
Access-code redeemed → Google Sheet log
- Trigger:
access_code.redeemed. - Action: Google Sheets → append a row with subscriber id, plan id, masked code, timestamp.
Gift campaign → generate + DM
- Trigger: New row in an Airtable "Influencer List".
- Action 1:
bulk_generate_access_codes(1 code,export_type=file). - Action 2:
get_deep_linkwithaccess_code=<code>to build a one-tap bot link. - Action 3: Slack DM / email the influencer with the link.
Team + audit
Member banned → Telegram ops chat
- Trigger:
member.banned. - Action: Telegram → send to an ops chat with reason + the ban-issuing admin's name.
Team role changed → audit trail
- Trigger:
team.member.role_changed. - Action: Notion database → append an entry with old/new role, actor, timestamp.
Suspicious activity → auto-revoke token
- Trigger:
list_activitysearch on an hourly schedule, filter foractor_kind = 'mcp'entries touching high-value resources. - Action: If count exceeds your threshold, call
revoke_tokenon the flagged token id and post the incident to Slack.
Billing
Grace-period warning → creator heads-up
- Trigger:
billing.grace_period_warning. - Action: Email the account owner with a link to
/settings/billingbefore the grace window elapses.
Account locked → ops escalation
- Trigger:
billing.account_locked. - Action 1: PagerDuty → incident.
- Action 2: Slack → post in
#oncallwith the tier cycle and last successful payment date.
Tier upgraded → CRM annotation + welcome pack
- Trigger:
billing.tier_upgraded. - Action 1: HubSpot → update lifecycle stage to "paid".
- Action 2: Loom or Notion → send the creator the tier-specific onboarding playbook.
Analytics & reporting
Weekly revenue digest
- Trigger: Schedule — every Monday 09:00.
- Action 1:
get_dashboard_metricswithperiod=7d. - Action 2:
get_transaction_breakdownwithdimension=payment_provider,period=7d. - Action 3: Email / Slack a digest combining both.
Plan performance → Google Sheet
- Trigger: Schedule — daily.
- Action 1:
get_plan_performancefor each active project. - Action 2: Google Sheets → append rows (one per plan) for the dashboard you hand to finance.
Month-end close → earnings statement
- Trigger: Schedule — 1st of each month 06:00.
- Action 1:
get_earnings_reportwithgranularity=dayfor the previous month. - Action 2: Generate a PDF via DocRaptor and email it to accounting@yourco.
Integrations hygiene
Onboarding checklist
- Trigger:
member.trial_joined. - Action 1: HubSpot → start "Trial onboarding" sequence.
- Action 2: Delay 3 days.
- Action 3:
find_member_by_idto check status; if still trialing, send a reminder.
Test webhook endpoint on deploy
- Trigger: GitHub Actions → new release published.
- Action:
test_webhook_endpointagainst every active endpoint in your team. Post a summary in Slack.
Rotate webhook secret → secret manager
- Trigger: Schedule — every 90 days.
- Action 1:
rotate_webhook_secreton the endpoint. - Action 2: Write the fresh
secretinto HashiCorp Vault / AWS Secrets Manager / 1Password. - Action 3: Slack → notify
#platformthat the rotation landed.
Troubleshooting
| Symptom | Likely cause | Fix |
|---|---|---|
Test-auth returns 401 AUTHENTICATION_REQUIRED | Token expired or revoked | Mint a new token |
Test-auth returns 403 TOKEN_MISSING_ABILITY | Token lacks team:view | Mint with team:view plus the specific abilities each trigger / action / search needs |
Test-auth returns 404 TENANT_MISMATCH | Token has no scope:team:<uuid> entry | Mint from the dashboard — the UI always appends the scope automatically |
performSubscribe returns 422 VALIDATION_FAILED on events.*.in | Event name typo / outdated | Rebuild the Zap; the Zapier app is kept in lockstep with the webhook catalog |
| Zap receives no events | Endpoint auto-disabled after consecutive failures | Re-enable from /settings/webhooks or use the test_webhook_endpoint action for a diagnostic ping |
Analytics search returns 400 VALIDATION_FAILED on dimension | get_transaction_breakdown requires plan / payment_provider / currency / project | Pick one of the four |
Source
The Zapier app is maintained at github.com/envigo-innovations/subscriby-zapier. PRs welcome. See the CHANGELOG for per-version event / action / search deltas.
Related
- Webhook events — canonical catalog of every
typevalue. - API authentication — how
sbt_live_/sbt_test_tokens are minted.
How is this guide?
Automations & Integrations
Ship Subscriby into Zapier, n8n, Make, LangChain, Postman, Insomnia, and any OpenAPI-aware toolkit — all backed by the same REST surface and outbound webhook taxonomy.
n8n
Drive Subscriby from n8n — verified node with a 106-event trigger and a full-parity action node covering every REST endpoint, plus HTTP/Webhook fallbacks.