Ecommerce

Lemon Squeezy Webhook MCP Server

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

Send Lemon Squeezy webhooks to MCPBundles and read order and subscription JSON in chat.

Best forIndie SaaSDigital ProductsSubscription Commerce

Try this workflow

Last Lemon Squeezy order

From the latest delivery export.json, read meta.event_name, data.attributes.user_email, product_name from first_order_item, total, and test_mode.

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 Lemon Squeezy Webhook

Built for

Indie SaaS, Digital Products, Subscription Commerce

Example workflows

Last Lemon Squeezy order

Walks JSON:API order fields from the newest capture.

Try this

From the latest delivery export.json, read meta.event_name, data.attributes.user_email, product_name from first_order_item, total, and test_mode.

Subscription lifecycle

Filters stored subscription events by event name and reads state fields.

Try this

List recent deliveries where meta.event_name starts with subscription_ and summarize status, renews_at, ends_at, and test_mode from data.attributes.

Context to know first

How do I connect Lemon Squeezy deliveries to MCPBundles?

Save a connection on MCPBundles, copy the hosted ingest URL from the credential panel, and paste it into Lemon Squeezy where webhook endpoints 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 Lemon Squeezy Webhook — workflow patterns, data models, and gotchas for your AI agent.

Lemon Squeezy Webhook

Each stored delivery is one Lemon Squeezy webhook POST — a JSON:API object with meta and data. The event name lives in meta.event_name; the resource body is under data with type, id, and attributes. Tools read what already landed; there is no pull API and no way to refund, cancel subscriptions, or replay webhooks from here.

First moves

  1. Latest report — default for “what order or subscription event happened last”.
  2. Read export.json.meta.event_name — classify the delivery before quoting money or access state.
  3. Inspect export.json.data.type and data.attributes — order, subscription, subscription invoice, license key, customer, or affiliate shapes differ.
  4. Recent reports — scan history when deduping retries, tracing a buyer, or separating test-mode traffic.
  5. One report by id — after listing, when the user points at a specific capture.

Payload envelope

Start every read from export.json:

  • meta.event_name — mirrors the upstream event (also sent as an HTTP header on delivery). Examples: order_created, order_refunded, subscription_created, subscription_updated, subscription_cancelled, subscription_resumed, subscription_expired, subscription_paused, subscription_unpaused, subscription_payment_success, subscription_payment_failed, subscription_payment_recovered, subscription_payment_refunded, license_key_created, license_key_updated, customer_updated, affiliate_activated.
  • meta.custom_data — checkout custom fields you attached upstream (user ids, plan codes, campaign tags). Present on order, subscription, and license-key events when configured; keys and values are entirely store-defined.
  • data.type — JSON:API resource kind: orders, subscriptions, subscription-invoices, license-keys, customers, affiliates.
  • data.id — stable resource id string for deduping across retries.
  • data.attributes — event-specific fields (money, buyer, product, subscription state).

Order events (meta.event_name order_created or order_refunded)

When data.type is orders, read from data.attributes:

  • Identityidentifier (UUID-style order id), order_number, store_id, customer_id.
  • Buyeruser_name, user_email.
  • Moneysubtotal, discount_total, tax, total in order currency minor units (cents); parallel *_usd and *_formatted fields when present. Divide cent integers by 100 for dollar amounts unless the user asked for cents.
  • Statusstatus, status_formatted, refunded, refunded_at.
  • Line item snapshotfirst_order_item with product_id, variant_id, product_name, variant_name, price, and test_mode on the line item.
  • Timingcreated_at, updated_at on the order; compare with source.captured_at for when the POST landed here.

Subscription events (subscription_* on data.type subscriptions)

Common subscription fields in data.attributes:

  • Productproduct_id, variant_id, product_name, variant_name.
  • Buyeruser_name, user_email, customer_id.
  • Statestatus (active, on_trial, paused, past_due, unpaid, cancelled, expired, …), status_formatted, cancelled, pause.
  • Billing timingrenews_at, ends_at (scheduled expiry while cancelled or after dunning), trial_ends_at, billing_anchor.
  • Links to buyer self-serviceurls.customer_portal, urls.update_payment_method (signed URLs; not the same as webhook signing).
  • Test purchasestest_mode boolean on attributes (and often on related order line items).
  • First itemfirst_subscription_item with price_id, quantity when present.

Lifecycle notes when interpreting history:

  • A new subscription typically produces separate stored deliveries for order_created, subscription_created, and subscription_payment_success (and license_key_created when licenses are enabled) — do not treat one capture as the full story.
  • subscription_updated fires on many later changes (renewals, payment-method updates, cancellations). Granular events like subscription_resumed or subscription_expired may also arrive; dedupe on data.id plus meta.event_name when counting unique business moments.
  • subscription_payment_recovered is always paired with subscription_payment_success after a failed renewal is retried.

Subscription invoice events (subscription_payment_*)

When data.type is subscription-invoices, the payload is an invoice object (renewal charge, failed charge, refund) rather than the subscription record itself. Read invoice totals, status, and linked subscription ids from data.attributes and cross-reference subscription captures by id when the user asks about recurring billing history.

License key events (license_key_created, license_key_updated)

When data.type is license-keys, read key status, activation limits, and linked order or subscription ids from data.attributes. A new licensed purchase also sends separate order_created (and often subscription_created) deliveries.

Response shape

  • export.json — parsed webhook body; start with meta.event_name, then data.type and data.attributes.
  • export.text — raw body when JSON is large or parsing failed.
  • source.captured_at — when the POST landed here, not necessarily data.attributes.created_at.

Operational order

  1. Start with the latest report — do not guess a report id.
  2. State meta.event_name and data.type before summarizing revenue or access.
  3. Check test_mode before quoting production totals.
  4. Read meta.custom_data when the user tracks internal ids from checkout.
  5. If captured_at is older than expected, say so — events arrive when upstream fires them (renewals, refunds, lifecycle changes), not on demand.
  6. List recent reports only for history, duplicate suspicion, or tracing one buyer across events.
  7. Read ## This connection in the skill supplement for store-specific product or custom_data field notes.

Gotchas

  • Read-only — cannot place orders, issue refunds, cancel subscriptions, or acknowledge deliveries upstream.
  • JSON:API shape — fields live under data.attributes, not at the top level; do not assume a flat Gumroad-style envelope.
  • Duplicate bursts — one checkout can produce several stored deliveries within seconds; dedupe on data.id and meta.event_name, not capture order alone.
  • Retries — failed upstream delivery retries up to three times with exponential backoff; the same event may appear more than once with different source.captured_at.
  • Money is in centstotal, subtotal, and line-item price are integer minor units unless *_formatted strings are present.
  • test_mode — filter test checkouts and simulated subscription events before revenue or activation decisions.
  • Signature domain note — upstream signs the exact raw POST bytes with HMAC-SHA256 in the X-Signature header. Re-serializing or pretty-printing JSON before verification changes the bytes and breaks the hash; stored export.json is already parsed for reading, not for re-signing. Receipt and portal URLs inside the payload carry their own query signature parameters — those are unrelated to webhook X-Signature.
  • Variable presencemeta.custom_data, first_order_item, license fields, and subscription invoice payloads appear only for relevant products and event types; absence is normal.

Tools in this Server (4)

Lemon Squeezy Wh Latest

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

Lemon Squeezy Wh List

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

Lemon Squeezy Wh Report

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

Lemon Squeezy 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 Lemon Squeezy deliveries to MCPBundles?

Save a connection on MCPBundles, copy the hosted ingest URL from the credential panel, and paste it into Lemon Squeezy where webhook endpoints 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 Lemon Squeezy 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/lemon-squeezy-webhook. Authentication is handled automatically.

How many tools does Lemon Squeezy Webhook provide?

Lemon Squeezy 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 Lemon Squeezy Webhook require?

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

Setup Instructions

Connect Lemon Squeezy Webhook to any MCP client in minutes

MCP URL
https://mcp.mcpbundles.com/bundle/lemon-squeezy-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 Lemon Squeezy Webhook and paste the MCP URL into Remote MCP server URL.
  4. Click Add. Lemon Squeezy Webhook will appear under Not connected — select it and click Connect to complete OAuth.
Name: Lemon Squeezy Webhook
Remote MCP server URL: https://mcp.mcpbundles.com/bundle/lemon-squeezy-webhook
Authentication: OAuth

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

Ready to use Lemon Squeezy Webhook?

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

Lemon Squeezy Webhook MCP — Read Orders in Chat