{"id":"b204565a-fb10-4811-a933-d5d54c6a3eb4","shortId":"L4vB7S","kind":"skill","title":"chargebee-webhooks","tagline":"Receive and verify Chargebee webhooks. Use when setting up Chargebee webhook handlers, debugging Basic Auth verification, or handling subscription billing events.","description":"# Chargebee Webhooks\n\n## When to Use This Skill\n\n- Setting up Chargebee webhook handlers\n- Debugging Basic Auth verification failures\n- Understanding Chargebee event types and payloads\n- Processing subscription billing events\n\n## Essential Code\n\nChargebee uses Basic Authentication for webhook verification. Here's how to implement it:\n\n### Express.js\n\n```javascript\n// Verify Chargebee webhook with Basic Auth\n// NOTE: Chargebee uses Basic Auth (not HMAC signatures), so raw body access\n// is not required. Use express.json() for automatic JSON parsing:\napp.post('/webhooks/chargebee', express.json(), (req, res) => {\n  // Extract Basic Auth credentials\n  const auth = req.headers.authorization;\n  if (!auth || !auth.startsWith('Basic ')) {\n    return res.status(401).send('Unauthorized');\n  }\n\n  // Decode and verify credentials\n  const encoded = auth.substring(6);\n  const decoded = Buffer.from(encoded, 'base64').toString('utf-8');\n  const [username, password] = decoded.split(':');\n\n  const expectedUsername = process.env.CHARGEBEE_WEBHOOK_USERNAME;\n  const expectedPassword = process.env.CHARGEBEE_WEBHOOK_PASSWORD;\n\n  if (username !== expectedUsername || password !== expectedPassword) {\n    return res.status(401).send('Invalid credentials');\n  }\n\n  // Access the parsed JSON directly\n  const event = req.body;\n  console.log(`Received ${event.event_type} event:`, event.id);\n\n  // Handle specific event types\n  switch (event.event_type) {\n    case 'subscription_created':\n    case 'subscription_changed':\n    case 'subscription_cancelled':\n      // Process subscription events\n      break;\n    case 'payment_succeeded':\n    case 'payment_failed':\n      // Process payment events\n      break;\n  }\n\n  res.status(200).send('OK');\n});\n\n// Note: If you later need raw body access (e.g., for HMAC signature\n// verification with other providers), use express.raw():\n// app.post('/webhooks/other', express.raw({ type: 'application/json' }), (req, res) => {\n//   const rawBody = req.body.toString();\n//   // ... verify signature using rawBody ...\n// });\n```\n\n### Next.js (App Router)\n\n```typescript\n// app/webhooks/chargebee/route.ts\nimport { NextRequest } from 'next/server';\n\nexport async function POST(req: NextRequest) {\n  // Extract Basic Auth credentials\n  const auth = req.headers.get('authorization');\n  if (!auth || !auth.startsWith('Basic ')) {\n    return new Response('Unauthorized', { status: 401 });\n  }\n\n  // Decode and verify credentials\n  const encoded = auth.substring(6);\n  const decoded = Buffer.from(encoded, 'base64').toString('utf-8');\n  const [username, password] = decoded.split(':');\n\n  const expectedUsername = process.env.CHARGEBEE_WEBHOOK_USERNAME;\n  const expectedPassword = process.env.CHARGEBEE_WEBHOOK_PASSWORD;\n\n  if (username !== expectedUsername || password !== expectedPassword) {\n    return new Response('Invalid credentials', { status: 401 });\n  }\n\n  // Process the webhook\n  const event = await req.json();\n  console.log(`Received ${event.event_type} event:`, event.id);\n\n  return new Response('OK', { status: 200 });\n}\n```\n\n### FastAPI\n\n```python\n# main.py\nfrom fastapi import FastAPI, Header, HTTPException, Depends\nfrom typing import Optional\nimport base64\nimport os\n\napp = FastAPI()\n\ndef verify_chargebee_auth(authorization: Optional[str] = Header(None)):\n    \"\"\"Verify Chargebee webhook Basic Auth\"\"\"\n    if not authorization or not authorization.startswith(\"Basic \"):\n        raise HTTPException(status_code=401, detail=\"Unauthorized\")\n\n    # Decode credentials\n    encoded = authorization[6:]\n    decoded = base64.b64decode(encoded).decode('utf-8')\n\n    # Split username:password (handle colons in password)\n    if ':' not in decoded:\n        raise HTTPException(status_code=401, detail=\"Invalid authorization format\")\n\n    colon_index = decoded.index(':')\n    username = decoded[:colon_index]\n    password = decoded[colon_index + 1:]\n\n    expected_username = os.getenv(\"CHARGEBEE_WEBHOOK_USERNAME\")\n    expected_password = os.getenv(\"CHARGEBEE_WEBHOOK_PASSWORD\")\n\n    if username != expected_username or password != expected_password:\n        raise HTTPException(status_code=401, detail=\"Invalid credentials\")\n\n    return True\n\n@app.post(\"/webhooks/chargebee\")\nasync def handle_chargebee_webhook(\n    event: dict,\n    auth_valid: bool = Depends(verify_chargebee_auth)\n):\n    \"\"\"Handle Chargebee webhook events\"\"\"\n    event_type = event.get(\"event_type\")\n    print(f\"Received {event_type} event: {event.get('id')}\")\n\n    # Process event based on type\n    if event_type in [\"subscription_created\", \"subscription_changed\", \"subscription_cancelled\"]:\n        # Handle subscription events\n        pass\n    elif event_type in [\"payment_succeeded\", \"payment_failed\"]:\n        # Handle payment events\n        pass\n\n    return {\"status\": \"OK\"}\n```\n\n## Common Event Types\n\n> **⚠️ WARNING: Verify Event Names!**\n>\n> The event type names below are examples and **MUST be verified** against the [Chargebee API documentation](https://apidocs.chargebee.com/docs/api/events#event_types) for your specific Chargebee configuration. Event names can vary significantly between API versions and configurations.\n>\n> **Special attention required for:**\n> - Payment events (shown as `payment_succeeded` and `payment_failed` below)\n> - Invoice events (shown as `invoice_generated` below)\n> - Any custom events specific to your Chargebee setup\n>\n> **Always check your Chargebee Webhook settings for the exact event names your account uses.**\n\n| Event | Triggered When | Common Use Cases |\n|-------|----------------|------------------|\n| `subscription_created` | New subscription is created | Provision access, send welcome email |\n| `subscription_changed` | Subscription is modified | Update user permissions, sync changes |\n| `subscription_cancelled` | Subscription is cancelled | Revoke access, trigger retention flow |\n| `subscription_reactivated` | Cancelled subscription is reactivated | Restore access, send notification |\n| `payment_succeeded` | Payment is successfully processed | Update payment status, send receipt |\n| `payment_failed` | Payment attempt fails | Retry payment, notify customer |\n| `invoice_generated` | Invoice is created | Send invoice to customer |\n| `customer_created` | New customer is created | Create user account, sync data |\n\n## Environment Variables\n\n```bash\n# Chargebee webhook Basic Auth credentials\nCHARGEBEE_WEBHOOK_USERNAME=your_webhook_username\nCHARGEBEE_WEBHOOK_PASSWORD=your_webhook_password\n```\n\n## Local Development\n\nFor local webhook testing, use Hookdeck CLI:\n\n```bash\nbrew install hookdeck/hookdeck/hookdeck\nhookdeck listen 3000 --path /webhooks/chargebee\n```\n\nNo account required. Provides local tunnel + web UI for inspecting requests.\n\n## Reference Materials\n\n- [Overview](references/overview.md) - What Chargebee webhooks are, common event types\n- [Setup](references/setup.md) - Configure webhooks in Chargebee dashboard\n- [Verification](references/verification.md) - Basic Auth verification details and gotchas\n\n## Examples\n\n- [Express Example](examples/express/) - Complete Express.js implementation with tests\n- [Next.js Example](examples/nextjs/) - Next.js App Router implementation with tests\n- [FastAPI Example](examples/fastapi/) - Python FastAPI implementation with tests\n\n## Recommended: webhook-handler-patterns\n\nWe recommend installing the [webhook-handler-patterns](https://github.com/hookdeck/webhook-skills/tree/main/skills/webhook-handler-patterns) skill alongside this one for handler sequence, idempotency, error handling, and retry logic. Key references (open on GitHub):\n\n- [Handler sequence](https://github.com/hookdeck/webhook-skills/blob/main/skills/webhook-handler-patterns/references/handler-sequence.md) — Verify first, parse second, handle idempotently third\n- [Idempotency](https://github.com/hookdeck/webhook-skills/blob/main/skills/webhook-handler-patterns/references/idempotency.md) — Prevent duplicate processing\n- [Error handling](https://github.com/hookdeck/webhook-skills/blob/main/skills/webhook-handler-patterns/references/error-handling.md) — Return codes, logging, dead letter queues\n- [Retry logic](https://github.com/hookdeck/webhook-skills/blob/main/skills/webhook-handler-patterns/references/retry-logic.md) — Provider retry schedules, backoff patterns\n\n## Related Skills\n\n- [stripe-webhooks](https://github.com/hookdeck/webhook-skills/tree/main/skills/stripe-webhooks) - Stripe payment webhook handling\n- [shopify-webhooks](https://github.com/hookdeck/webhook-skills/tree/main/skills/shopify-webhooks) - Shopify e-commerce webhook handling\n- [github-webhooks](https://github.com/hookdeck/webhook-skills/tree/main/skills/github-webhooks) - GitHub repository webhook handling\n- [resend-webhooks](https://github.com/hookdeck/webhook-skills/tree/main/skills/resend-webhooks) - Resend email webhook handling\n- [clerk-webhooks](https://github.com/hookdeck/webhook-skills/tree/main/skills/clerk-webhooks) - Clerk auth webhook handling\n- [elevenlabs-webhooks](https://github.com/hookdeck/webhook-skills/tree/main/skills/elevenlabs-webhooks) - ElevenLabs webhook handling\n- [openai-webhooks](https://github.com/hookdeck/webhook-skills/tree/main/skills/openai-webhooks) - OpenAI webhook handling\n- [paddle-webhooks](https://github.com/hookdeck/webhook-skills/tree/main/skills/paddle-webhooks) - Paddle billing webhook handling\n- [webhook-handler-patterns](https://github.com/hookdeck/webhook-skills/tree/main/skills/webhook-handler-patterns) - Handler sequence, idempotency, error handling, retry logic\n- [hookdeck-event-gateway](https://github.com/hookdeck/webhook-skills/tree/main/skills/hookdeck-event-gateway) - Webhook infrastructure that replaces your queue — guaranteed delivery, automatic retries, replay, rate limiting, and observability for your webhook handlers","tags":["chargebee","webhooks","webhook","skills","hookdeck","agent-skills","ai-coding","api-integrations","event-driven","github-webhooks","llm-tools","shopify-webhooks"],"capabilities":["skill","source-hookdeck","skill-chargebee-webhooks","topic-agent-skills","topic-ai-coding","topic-api-integrations","topic-event-driven","topic-github-webhooks","topic-llm-tools","topic-shopify-webhooks","topic-stripe-webhooks","topic-webhook-security","topic-webhook-signatures","topic-webhooks"],"categories":["webhook-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/hookdeck/webhook-skills/chargebee-webhooks","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add hookdeck/webhook-skills","source_repo":"https://github.com/hookdeck/webhook-skills","install_from":"skills.sh"}},"qualityScore":"0.484","qualityRationale":"deterministic score 0.48 from registry signals: · indexed on github topic:agent-skills · 69 github stars · SKILL.md body (9,777 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-02T06:55:45.990Z","embedding":null,"createdAt":"2026-04-18T22:13:48.426Z","updatedAt":"2026-05-02T06:55:45.990Z","lastSeenAt":"2026-05-02T06:55:45.990Z","tsv":"'-8':132,286,390 '/docs/api/events#event_types)':545 '/hookdeck/webhook-skills/blob/main/skills/webhook-handler-patterns/references/error-handling.md)':849 '/hookdeck/webhook-skills/blob/main/skills/webhook-handler-patterns/references/handler-sequence.md)':830 '/hookdeck/webhook-skills/blob/main/skills/webhook-handler-patterns/references/idempotency.md)':841 '/hookdeck/webhook-skills/blob/main/skills/webhook-handler-patterns/references/retry-logic.md)':860 '/hookdeck/webhook-skills/tree/main/skills/clerk-webhooks)':915 '/hookdeck/webhook-skills/tree/main/skills/elevenlabs-webhooks)':925 '/hookdeck/webhook-skills/tree/main/skills/github-webhooks)':895 '/hookdeck/webhook-skills/tree/main/skills/hookdeck-event-gateway)':968 '/hookdeck/webhook-skills/tree/main/skills/openai-webhooks)':934 '/hookdeck/webhook-skills/tree/main/skills/paddle-webhooks)':943 '/hookdeck/webhook-skills/tree/main/skills/resend-webhooks)':905 '/hookdeck/webhook-skills/tree/main/skills/shopify-webhooks)':883 '/hookdeck/webhook-skills/tree/main/skills/stripe-webhooks)':873 '/hookdeck/webhook-skills/tree/main/skills/webhook-handler-patterns)':807,954 '/webhooks/chargebee':97,454,728 '/webhooks/other':225 '1':422 '200':203,331 '3000':726 '401':114,154,270,312,377,406,447 '6':124,278,384 'access':86,158,213,617,637,648 'account':602,688,730 'alongsid':809 'alway':590 'api':541,557 'apidocs.chargebee.com':544 'apidocs.chargebee.com/docs/api/events#event_types)':543 'app':239,350,779 'app.post':96,224,453 'app/webhooks/chargebee/route.ts':242 'application/json':228 'async':248,455 'attempt':665 'attent':562 'auth':18,39,74,79,103,106,109,255,258,262,355,365,462,468,697,761,917 'auth.startswith':110,263 'auth.substring':123,277 'authent':57 'author':260,356,368,383,409 'authorization.startswith':371 'automat':93,977 'await':318 'backoff':864 'base':488 'base64':129,283,347 'base64.b64decode':386 'bash':693,720 'basic':17,38,56,73,78,102,111,254,264,364,372,696,760 'bill':23,50,945 'bodi':85,212 'bool':464 'break':191,201 'brew':721 'buffer.from':127,281 'cancel':187,500,632,635,643 'case':179,182,185,192,195,609 'chang':184,498,622,630 'chargebe':2,7,13,25,34,43,54,70,76,354,362,426,432,458,467,470,540,549,588,593,694,699,705,745,756 'chargebee-webhook':1 'check':591 'clerk':911,916 'clerk-webhook':910 'cli':719 'code':53,376,405,446,851 'colon':395,411,416,420 'commerc':887 'common':520,607,748 'complet':770 'configur':550,560,753 'console.log':166,320 'const':105,121,125,133,137,142,163,231,257,275,279,287,291,296,316 'creat':181,496,611,615,675,681,685,686 'credenti':104,120,157,256,274,310,381,450,698 'custom':583,670,679,680,683 'dashboard':757 'data':690 'dead':853 'debug':16,37 'decod':117,126,271,280,380,385,388,401,415,419 'decoded.index':413 'decoded.split':136,290 'def':352,456 'deliveri':976 'depend':341,465 'detail':378,407,448,763 'develop':712 'dict':461 'direct':162 'document':542 'duplic':843 'e':886 'e-commerc':885 'e.g':214 'elevenlab':921,926 'elevenlabs-webhook':920 'elif':505 'email':620,907 'encod':122,128,276,282,382,387 'environ':691 'error':816,845,958 'essenti':52 'event':24,44,51,164,170,174,190,200,317,324,460,472,473,476,481,483,487,492,503,506,515,521,525,528,551,566,576,584,599,604,749,964 'event.event':168,177,322 'event.get':475,484 'event.id':171,325 'exact':598 'exampl':533,766,768,776,785 'examples/express':769 'examples/fastapi':786 'examples/nextjs':777 'expect':423,429,437,441 'expectedpassword':143,151,297,305 'expectedusernam':138,149,292,303 'export':247 'express':767 'express.js':67,771 'express.json':91,98 'express.raw':223,226 'extract':101,253 'f':479 'fail':197,512,573,663,666 'failur':41 'fastapi':332,336,338,351,784,788 'first':832 'flow':640 'format':410 'function':249 'gateway':965 'generat':580,672 'github':825,891,896 'github-webhook':890 'github.com':806,829,840,848,859,872,882,894,904,914,924,933,942,953,967 'github.com/hookdeck/webhook-skills/blob/main/skills/webhook-handler-patterns/references/error-handling.md)':847 'github.com/hookdeck/webhook-skills/blob/main/skills/webhook-handler-patterns/references/handler-sequence.md)':828 'github.com/hookdeck/webhook-skills/blob/main/skills/webhook-handler-patterns/references/idempotency.md)':839 'github.com/hookdeck/webhook-skills/blob/main/skills/webhook-handler-patterns/references/retry-logic.md)':858 'github.com/hookdeck/webhook-skills/tree/main/skills/clerk-webhooks)':913 'github.com/hookdeck/webhook-skills/tree/main/skills/elevenlabs-webhooks)':923 'github.com/hookdeck/webhook-skills/tree/main/skills/github-webhooks)':893 'github.com/hookdeck/webhook-skills/tree/main/skills/hookdeck-event-gateway)':966 'github.com/hookdeck/webhook-skills/tree/main/skills/openai-webhooks)':932 'github.com/hookdeck/webhook-skills/tree/main/skills/paddle-webhooks)':941 'github.com/hookdeck/webhook-skills/tree/main/skills/resend-webhooks)':903 'github.com/hookdeck/webhook-skills/tree/main/skills/shopify-webhooks)':881 'github.com/hookdeck/webhook-skills/tree/main/skills/stripe-webhooks)':871 'github.com/hookdeck/webhook-skills/tree/main/skills/webhook-handler-patterns)':805,952 'gotcha':765 'guarante':975 'handl':21,172,394,457,469,501,513,817,835,846,877,889,899,909,919,928,937,947,959 'handler':15,36,795,803,813,826,950,955,987 'header':339,359 'hmac':81,216 'hookdeck':718,724,963 'hookdeck-event-gateway':962 'hookdeck/hookdeck/hookdeck':723 'httpexcept':340,374,403,444 'id':485 'idempot':815,836,838,957 'implement':65,772,781,789 'import':243,337,344,346,348 'index':412,417,421 'infrastructur':970 'inspect':738 'instal':722,799 'invalid':156,309,408,449 'invoic':575,579,671,673,677 'javascript':68 'json':94,161 'key':821 'later':209 'letter':854 'limit':981 'listen':725 'local':711,714,733 'log':852 'logic':820,857,961 'main.py':334 'materi':741 'modifi':625 'must':535 'name':526,530,552,600 'need':210 'new':266,307,327,612,682 'next.js':238,775,778 'next/server':246 'nextrequest':244,252 'none':360 'note':75,206 'notif':650 'notifi':669 'observ':983 'ok':205,329,519 'one':811 'open':823 'openai':930,935 'openai-webhook':929 'option':345,357 'os':349 'os.getenv':425,431 'overview':742 'paddl':939,944 'paddle-webhook':938 'pars':95,160,833 'pass':504,516 'password':135,146,150,289,300,304,393,397,418,430,434,440,442,707,710 'path':727 'pattern':796,804,865,951 'payload':47 'payment':193,196,199,509,511,514,565,569,572,651,653,658,662,664,668,875 'permiss':628 'post':250 'prevent':842 'print':478 'process':48,188,198,313,486,656,844 'process.env.chargebee':139,144,293,298 'provid':221,732,861 'provis':616 'python':333,787 'queue':855,974 'rais':373,402,443 'rate':980 'raw':84,211 'rawbodi':232,237 'reactiv':642,646 'receipt':661 'receiv':4,167,321,480 'recommend':792,798 'refer':740,822 'references/overview.md':743 'references/setup.md':752 'references/verification.md':759 'relat':866 'replac':972 'replay':979 'repositori':897 'req':99,229,251 'req.body':165 'req.body.tostring':233 'req.headers.authorization':107 'req.headers.get':259 'req.json':319 'request':739 'requir':89,563,731 'res':100,230 'res.status':113,153,202 'resend':901,906 'resend-webhook':900 'respons':267,308,328 'restor':647 'retent':639 'retri':667,819,856,862,960,978 'return':112,152,265,306,326,451,517,850 'revok':636 'router':240,780 'schedul':863 'second':834 'send':115,155,204,618,649,660,676 'sequenc':814,827,956 'set':11,32,595 'setup':589,751 'shopifi':879,884 'shopify-webhook':878 'shown':567,577 'signatur':82,217,235 'signific':555 'skill':31,808,867 'skill-chargebee-webhooks' 'source-hookdeck' 'special':561 'specif':173,548,585 'split':391 'status':269,311,330,375,404,445,518,659 'str':358 'stripe':869,874 'stripe-webhook':868 'subscript':22,49,180,183,186,189,495,497,499,502,610,613,621,623,631,633,641,644 'succeed':194,510,570,652 'success':655 'switch':176 'sync':629,689 'test':716,774,783,791 'third':837 'topic-agent-skills' 'topic-ai-coding' 'topic-api-integrations' 'topic-event-driven' 'topic-github-webhooks' 'topic-llm-tools' 'topic-shopify-webhooks' 'topic-stripe-webhooks' 'topic-webhook-security' 'topic-webhook-signatures' 'topic-webhooks' 'tostr':130,284 'trigger':605,638 'true':452 'tunnel':734 'type':45,169,175,178,227,323,343,474,477,482,490,493,507,522,529,750 'typescript':241 'ui':736 'unauthor':116,268,379 'understand':42 'updat':626,657 'use':9,29,55,77,90,222,236,603,608,717 'user':627,687 'usernam':134,141,148,288,295,302,392,414,424,428,436,438,701,704 'utf':131,285,389 'valid':463 'vari':554 'variabl':692 'verif':19,40,60,218,758,762 'verifi':6,69,119,234,273,353,361,466,524,537,831 'version':558 'warn':523 'web':735 'webhook':3,8,14,26,35,59,71,140,145,294,299,315,363,427,433,459,471,594,695,700,703,706,709,715,746,754,794,802,870,876,880,888,892,898,902,908,912,918,922,927,931,936,940,946,949,969,986 'webhook-handler-pattern':793,801,948 'welcom':619","prices":[{"id":"ef7ef60c-f7d4-4796-8a3b-08990d28bd75","listingId":"b204565a-fb10-4811-a933-d5d54c6a3eb4","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"hookdeck","category":"webhook-skills","install_from":"skills.sh"},"createdAt":"2026-04-18T22:13:48.426Z"}],"sources":[{"listingId":"b204565a-fb10-4811-a933-d5d54c6a3eb4","source":"github","sourceId":"hookdeck/webhook-skills/chargebee-webhooks","sourceUrl":"https://github.com/hookdeck/webhook-skills/tree/main/skills/chargebee-webhooks","isPrimary":false,"firstSeenAt":"2026-04-18T22:13:48.426Z","lastSeenAt":"2026-05-02T06:55:45.990Z"}],"details":{"listingId":"b204565a-fb10-4811-a933-d5d54c6a3eb4","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"hookdeck","slug":"chargebee-webhooks","github":{"repo":"hookdeck/webhook-skills","stars":69,"topics":["agent-skills","ai-coding","api-integrations","event-driven","github-webhooks","llm-tools","shopify-webhooks","stripe-webhooks","webhook-security","webhook-signatures","webhooks"],"license":"mit","html_url":"https://github.com/hookdeck/webhook-skills","pushed_at":"2026-02-25T14:00:40Z","description":"Webhook integration skills for AI coding agents (Claude Code, Cursor, Copilot). Step-by-step guidance for setting up webhook receivers, signature verification, and event handling for Stripe, Shopify, GitHub, and more. Built on the Agent Skills specification.","skill_md_sha":"9182da3dc6345283dfe034903965a7fce02585b5","skill_md_path":"skills/chargebee-webhooks/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/hookdeck/webhook-skills/tree/main/skills/chargebee-webhooks"},"layout":"multi","source":"github","category":"webhook-skills","frontmatter":{"name":"chargebee-webhooks","license":"MIT","description":"Receive and verify Chargebee webhooks. Use when setting up Chargebee webhook handlers, debugging Basic Auth verification, or handling subscription billing events."},"skills_sh_url":"https://skills.sh/hookdeck/webhook-skills/chargebee-webhooks"},"updatedAt":"2026-05-02T06:55:45.990Z"}}