Ecommerce

Paddle Webhook MCP Server

Connect your account, then chat with AI to run tools.

Send Paddle Billing webhooks to MCPBundles and read subscription and transaction JSON in chat.

Best forSaaS BillingMerchant of RecordSubscriptions

Try this workflow

Last Paddle event

From the latest delivery, read export.json event_type, event_id, occurred_at, and summarize data id, status, customer_id, and details.totals.grand_total when present.

Managed
4 tools
Agent guide included

Opens MCPBundles Studio with this server selected. After sign-in, chat and run tools from the same thread.

Browse all tools

What you can do with Paddle Webhook

Built for

SaaS Billing, Merchant of Record, Subscriptions

Example workflows

Last Paddle event

Classifies Billing envelope fields from stored JSON.

Try this

From the latest delivery, read export.json event_type, event_id, occurred_at, and summarize data id, status, customer_id, and details.totals.grand_total when present.

Subscription lifecycle

Scans stored subscription events without ingest metadata.

Try this

List recent deliveries where event_type starts with subscription. and extract data.id, status, customer_id, and next_billed_at from each export.json.

Context to know first

How do I connect Paddle deliveries to MCPBundles?

Save a connection on MCPBundles, copy the hosted ingest URL from the credential panel, and paste it into Paddle where notification destinations are configured. Your agent reads stored deliveries — latest, history, and content — in chat.

Can an agent trigger a new delivery?

No. Ingest is read-only. Data arrives when the upstream system sends it; agents query what already landed.

AI Skill
SKILL.md

Domain knowledge for Paddle Webhook — workflow patterns, data models, and gotchas for your AI agent.

Paddle Webhook

Each stored delivery is one Paddle Billing notification — a single JSON object POSTed when an event occurs in the connected account. The envelope is always the same: event_id, event_type, occurred_at, notification_id, and a data snapshot of the entity that changed. Tools read what already landed; there is no pull API and no way to replay, acknowledge, or mutate Paddle state from here.

Paddle Billing vs Paddle Classic

This skill describes Paddle Billing notifications (current default for new accounts). Billing payloads use event_type in entity.action form (for example transaction.completed, subscription.created) and prefixed ids (evt_, ntf_, txn_, sub_, ctm_).

Paddle Classic is a different system: webhooks identify events with alert_name (for example subscription_created, payment_succeeded) and a flat, legacy field layout — not the Billing envelope above. If export.json has alert_name instead of event_type, treat it as Classic and read that schema; do not assume Billing field names.

First moves

  1. Latest report — default for “what billing event happened last”.
  2. Read export.json.event_type — classify before quoting money, subscription status, or customer ids.
  3. Recent reports — scan history when deduping retries, tracing checkout, or comparing subscription lifecycle events.
  4. One report by id — after listing, when the user points at a specific delivery.

Envelope fields (export.json)

  • event_type — dotted name in entity.action format; primary router (transaction.paid, subscription.canceled, customer.created, adjustment.created, etc.).
  • event_id — stable event id (evt_…); dedupe key for at-least-once delivery and automatic retries.
  • occurred_at — RFC 3339 time the event happened upstream; use for ordering when events arrive out of sequence.
  • notification_id — delivery attempt id (ntf_…); changes on replays and separate destinations — not a dedupe key.
  • data — entity snapshot at event time; shape depends on event_type prefix.

Event classification

Transaction events (event_type starts with transaction.)

Common types: transaction.created, transaction.ready, transaction.paid, transaction.completed, transaction.billed, transaction.updated, transaction.canceled, transaction.past_due, transaction.payment_failed, transaction.revised.

Useful data fields when present:

  • Identityid (txn_…), status (draft, ready, paid, completed, billed, canceled, past_due).
  • Linkscustomer_id (ctm_…), address_id, business_id, subscription_id (sub_…), discount_id.
  • Moneydetails.totals (subtotal, tax, discount, grand_total, fee, earnings, currency_code); amounts are strings in the lowest currency unit (cents for USD).
  • Line itemsitems[] with price, product, quantity, nested price.unit_price.
  • Paymentspayments[] with method, status, and captured amounts after transaction.paid.
  • Passthroughcustom_data on the transaction or line items when set at checkout.

Checkout sequence (typical): transaction.createdcustomer.created / address.created / business.created during checkout → transaction.paid (payment captured) → subscription.created for recurring items → transaction.completed (fees, invoice numbers, subscription linkage finished). Use transaction.paid for earliest paid signal; transaction.completed for fully processed revenue records.

Subscription events (event_type starts with subscription.)

Common types: subscription.created, subscription.trialing, subscription.activated, subscription.updated, subscription.paused, subscription.resumed, subscription.past_due, subscription.canceled, subscription.imported.

Useful data fields when present:

  • Identityid (sub_…), status (active, trialing, canceled, past_due, paused).
  • Customercustomer_id, address_id, business_id.
  • Billingcurrency_code, billing_cycle (interval, frequency), started_at, first_billed_at, next_billed_at, canceled_at.
  • Itemsitems[] with linked price and product ids.
  • Checkout linktransaction_id appears on subscription.created only (ties the new subscription to the checkout transaction); other subscription events omit it.
  • Passthroughcustom_data.

Other entity groups (less common on ingest connections but valid event_type values)

  • Customer / address / businesscustomer.created, address.updated, business.created, etc.; data.id is the entity id, often with email, name, or address fields.
  • Adjustmentsadjustment.created, adjustment.updated for refunds, chargebacks, credits; inspect action, status, and linked transaction ids.
  • Catalog / opsproduct.*, price.*, discount.*, payout.*, report.*, payment_method.*, api_key.* when subscribed.

Response shape

  • export.json — parsed notification body; start with event_type, event_id, and data.
  • export.text — raw body when JSON is large or parsing failed.
  • source.captured_at — when the POST landed here; compare with occurred_at for ordering and freshness.

Operational order

  1. Start with the latest report — do not guess a report id.
  2. State event_type and read data.status (for transactions/subscriptions) before summarizing revenue or access changes.
  3. If captured_at is older than expected, say so — notifications arrive on upstream events, not on demand.
  4. List recent reports only for history, duplicate suspicion, checkout tracing, or explicit compare-by-date asks.
  5. Read ## This connection in the skill supplement for product- or environment-specific field notes.

Gotchas

  • Read-only — cannot refund, cancel subscriptions, replay notifications, or change Paddle settings from here.
  • Billing vs Classic — mismatched schemas break field assumptions; check for event_type vs alert_name first.
  • At-least-once delivery — Paddle retries until HTTP 200 within five seconds; dedupe on event_id, not notification_id or captured_at.
  • Out-of-order events — compare occurred_at when subscription.updated and subscription.canceled disagree; do not assume arrival order equals lifecycle order.
  • One event per POST — unlike batched providers, each delivery is a single notification, not an array of unrelated events.
  • Paid vs completedtransaction.paid confirms capture; transaction.completed adds fees, earnings, invoice numbers, and subscription creation side effects.
  • Amount encoding — totals in details.totals are string minor units; divide by 100 for USD dollars unless the user asked for cents.
  • Partial snapshotsdata is the entity at event time; customer email and line-item detail may require correlating multiple recent deliveries (customer.* plus transaction.*).
  • Sandbox vs live — infer from data.custom_data, product/price ids, or dashboard context; there is no single universal live flag on every event type.
  • Empty — no stored reports means nothing has arrived yet; say no webhook is available.

Tools in this Server (4)

Paddle Wh Latest

Return the most recently stored report — tabular rows, raw text, or JSON depending on format. Default starting point for current report questions.

Paddle Wh List

List recent stored reports — ids, capture time, filename, and format. Follow with latest report or get report for full content.

Paddle Wh Report

Return one stored report by report_id — full content with the same source/export envelope as latest report.

Paddle Wh Status

Connection status — whether any reports have landed, when the last file arrived, filename, and stored report count. Includes the ingest URL only when ...

Frequently Asked Questions

How do I connect Paddle deliveries to MCPBundles?

Save a connection on MCPBundles, copy the hosted ingest URL from the credential panel, and paste it into Paddle where notification destinations are configured. Your agent reads stored deliveries — latest, history, and content — in chat.

Can an agent trigger a new delivery?

No. Ingest is read-only. Data arrives when the upstream system sends it; agents query what already landed.

How do I connect Paddle Webhook to my AI agent?

Add the MCPBundles server URL to your MCP client configuration (Claude Desktop, Cursor, VS Code, etc.). The URL format is: https://mcp.mcpbundles.com/bundle/paddle-webhook. Authentication is handled automatically.

How many tools does Paddle Webhook provide?

Paddle Webhook provides 4 tools that can be called by AI agents, along with a SKILL.md that gives your AI agent domain knowledge about when and how to use them.

What authentication does Paddle Webhook require?

Paddle Webhook uses API Key. Paddle Webhook requires credentials. Connect via MCPBundles and authentication is handled automatically.

Setup Instructions

Connect Paddle Webhook to any MCP client in minutes

MCP URL
https://mcp.mcpbundles.com/bundle/paddle-webhook

One-click install:

The link prefills the Add custom connector dialog — you still review the values and click Add, then Connect to complete OAuth.

Or add manually

  1. Open claude.ai → Settings → Connectors.
  2. Click the + button and choose Add custom connector.
  3. Set Name to Paddle Webhook and paste the MCP URL into Remote MCP server URL.
  4. Click Add. Paddle Webhook will appear under Not connected — select it and click Connect to complete OAuth.
Name: Paddle Webhook
Remote MCP server URL: https://mcp.mcpbundles.com/bundle/paddle-webhook
Authentication: OAuth

Custom connectors at claude.ai require a paid Claude plan (Pro, Max, Team, or Enterprise).

Ready to use Paddle Webhook?

Sign in to connect your credentials and start running tools from the chat.

Paddle Webhook MCP — Read Billing Events in Chat