webhooks

webhooks is a skill for Claude Code, Codex from RevenueCat/play-billing-skills. It costs 86 tokens per session (5,439 once invoked), scanned A, a copy of rc-webhooks, Apache-2.0.

A guide for receiving RevenueCat subscription and purchase updates on a server. RevenueCat is a service that tracks in-app purchases across stores and sends your backend standardized JSON notifications called webhooks.

In plain words
What is it for?
Use it when building the HTTPS endpoint, checking webhook signatures, recording processed event IDs, and updating user access based on event types and entitlements.
Why use it?
It helps prevent missed or duplicated updates and clarifies how cancellations, expirations, renewals, and other purchase events differ. It also explains how to verify that notifications really came from RevenueCat.

Skill for Claude CodeCodex

Written for no agent in particular: nothing here depends on one.

Good fit Use it when building the HTTPS endpoint, checking webhook signatures, recording processed event IDs, and updating user access based on event types and entitlements.

Compare 6 skills from other repositories ↓
Install with agentmods
npx agentmods add skills/revenuecat/play-billing-skills/webhooks
Install

Getting it into your agent

One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.

Any agent
npx skills add RevenueCat/play-billing-skills --skill webhooks
Clone the repo
git clone --depth 1 https://github.com/RevenueCat/play-billing-skills

Made for: Claude Code, Codex.

Wrote this? Show the measurements

A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.

agentmods badge for webhooks

README.md
[![agentmods](https://agentmods.dev/badge/skills/revenuecat/play-billing-skills/webhooks/github.svg)](https://agentmods.dev/skills/revenuecat/play-billing-skills/webhooks)
Your own site
<a href="https://agentmods.dev/skills/revenuecat/play-billing-skills/webhooks"><img src="https://agentmods.dev/badge/skills/revenuecat/play-billing-skills/webhooks/github.svg" alt="Measured on agentmods" height="20"></a>

Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.

agentmods 80×15 button for webhooks

Your own site · 80×15
<a href="https://agentmods.dev/skills/revenuecat/play-billing-skills/webhooks"><img src="https://agentmods.dev/badge/skills/revenuecat/play-billing-skills/webhooks.svg" alt="Reviewed on agentmods" width="80" height="20"></a>
Per session 86 Skills are progressive disclosure: only the name and description are preloaded; the body loads when the skill is used.
When invoked 5,439 The whole file, excluding the scripts and references it only reads on demand.
Security scan A 0 findings. A grade says what 26 rules found in the file — not that it is safe.
Origin 97% copy Near-identical to another mod in the catalogue.
Token cost

What it costs to keep this loaded

Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.

ModelPer sessionOnce invoked
Fable 5.1 $0.00086 $0.05439
Opus 5.5 $0.00034 $0.02176
Sonnet 5.5 $0.00017 $0.01088
Haiku 4.5 $0.00009 $0.00544

Measured 11d ago against content hash fc294f56d045, method: parsed. Prices are Anthropic first-party input rates as of 2026-10-07, from the pricing page.

Security

Grade A, and why

webhooks scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 11d ago.

A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.

Nothing flagged

None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.

Origin

This is a copy

97% identical to rc-webhooks — 229 lines differ, which has more behind it and is treated as the original. This page carries a canonical link to it rather than competing with it.

revenuecat/webhooks/SKILL.md · 318 lines

How it starts

The opening of the file, as written. The whole thing — 318 lines — stays where its author put it; the contents beside it link to each section on GitHub.

RevenueCat Webhooks

You configure one endpoint. RevenueCat posts one normalized JSON event schema for every store. Your job on the server side is to authenticate the request, deduplicate by event.id, and update your records from the customer the event touches.

Phase 1: Discover

Confirm what you are wiring up before touching code.

  • You own a server side HTTPS endpoint that accepts POST with a JSON body.
  • You set an authorization header value on the webhook integration in the RevenueCat dashboard under Integrations then Webhooks. If you also turn on HMAC webhook signing there, you stored its signing secret, which the dashboard shows only once.
  • Google Play Real Time Developer Notifications are connected to RevenueCat. Without them RevenueCat may learn about a refund of a one time purchase only when the app next opens.
  • You have durable storage to record processed event IDs and entitlement state per user.
  • You have the secret REST API key on the server, to re-read customers with GET /v1/subscribers/{app_user_id}.
  • You understand that RevenueCat has already mapped products to entitlements, so the customer it returns lists every entitlement with its expires_date, expired ones included. You do not maintain a product to entitlement table on your backend.

Every event has this outer shape:

{
  "api_version": "1.0",
  "event": {
    "id": "evt_01HABCXYZ0000000000000001",
    "type": "INITIAL_PURCHASE",
    "app_user_id": "user_12345",
    "original_app_user_id": "$RCAnonymousID:8b1d0e5c4f2a4d3e9c6b7a5f4e3d2c1b",
    "aliases": ["$RCAnonymousID:8b1d0e5c4f2a4d3e9c6b7a5f4e3d2c1b", "user_12345"],
    "product_id": "premium_monthly",
    "period_type": "NORMAL",
    "purchased_at_ms": 1700000000000,
    "expiration_at_ms": 1702592000000,
    "store": "PLAY_STORE",
    "environment": "PRODUCTION",
    "entitlement_ids": ["pro_access"],
    "transaction_id": "GPA.1234-5678-9012-34567"
  }
}

Phase 2: Plan

Take access from the customer, not from the event. For every event that can change access, re-read the customer it touches with GET /v1/subscribers/{app_user_id} and store the entitlements RevenueCat reports now. RevenueCat recommends this after any webhook, and it stays correct when events arrive late or out of order: automatic retries follow after 5, 10, 20, 40, and 80 minutes and a dashboard retry can come any time, so a retried EXPIRATION can land after the event that restored access, and another source (a granted entitlement, another store) can still grant an entitlement that one product's EXPIRATION lists. Use the payload only for what the customer does not carry, such as consumable credits.

Read the full file on GitHub · 318 lines

Changes

What this file has done since we first saw it

Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.

  1. 11d ago Changed · +105 lines · +30 tokens per session fc294f56d045
  2. 1mo ago First seen · 213 lines · 56 tokens per session scan A 13176b7a32af

Subscribe to this mod's changes

webhooks is a skill published in the GitHub repository RevenueCat/play-billing-skills (58 stars, last pushed 12d ago), licensed Apache-2.0. It adds 86 tokens to every session and 5,439 once invoked, about $0.0003 per session on Opus 5.5. A static security scan graded it A with 0 findings. It is 97% identical to rc-webhooks, differing in 229 lines, and is treated as a copy.

Related

Other skills, from other repositories

convex-billing

Add Stripe billing/payments to the Convex app via @convex-dev/stripe (checkout + webhook + gating).

openclaw/clawhub · 29 tokens

cloudbase-wechat-integration

A guide for connecting CloudBase applications to WeChat services, including payments, official accounts, and user identity.

TencentCloudBase/CloudBase-AI-Toolkit · 94 tokens

shopify-admin

Write or explain Admin GraphQL queries and mutations for apps and integrations that extend the Shopify admin. Use when the user wants to understand, design, or generate the operation itself—even before deciding how to run it. Do not choose admin first for app monetization—charging merchants for the app itself via app…

Shopify/Shopify-AI-Toolkit · 226 tokens

shopify-functions

Shopify Functions allow developers to customize the backend logic that powers parts of Shopify. Available APIs: Discount, Cart and Checkout Validation, Cart Transform, Pickup Point Delivery Option Generator, Delivery Customization, Fulfillment Constraints, Local Pickup Delivery Option Generator, Order Routing Location…

Shopify/Shopify-AI-Toolkit · 61 tokens

baselinker-webhooks

Receive BaseLinker (Base.com) webhooks. Use when building a BaseLinker order or warehouse callback receiver, because BaseLinker is not a normal webhook source: deliveries arrive as HTTP HEAD requests with NO body, the entire payload is in the query string (observed params: orderid, state), there is NO signature…

hookdeck/webhook-skills · 131 tokens

whatnot-webhooks

Receive and verify Whatnot webhooks (whatnot.com — the live-shopping and livestream-auction marketplace). Use when building a Whatnot Seller API app that handles webhook topics like order/created, order/updated, product/sold, listing/created, livestream/stopped or bulkoperation/finished, or when debugging…

hookdeck/webhook-skills · 136 tokens