{"id":31283063,"url":"https://github.com/gabeperez/universal-webhook-ai-router","last_synced_at":"2026-05-03T15:35:46.861Z","repository":{"id":314828121,"uuid":"1056896093","full_name":"gabeperez/universal-webhook-ai-router","owner":"gabeperez","description":"🔗 Transform webhooks from any service (Cal.com, GitHub, Stripe, Shopify, etc.) into natural language notifications for your AI assistant. Open-source with optional managed hosting.","archived":false,"fork":false,"pushed_at":"2025-09-15T04:52:37.000Z","size":25,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-09-24T04:11:42.288Z","etag":null,"topics":["ai","automation","cal-com","cloudflare","github","shopify","stripe","webhook","workers"],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/gabeperez.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-09-15T02:04:24.000Z","updated_at":"2025-09-15T04:52:40.000Z","dependencies_parsed_at":"2025-09-15T04:13:41.340Z","dependency_job_id":"3c4ccad6-47bc-4e3a-9cda-5e3d8104e0ed","html_url":"https://github.com/gabeperez/universal-webhook-ai-router","commit_stats":null,"previous_names":["gabeperez/universal-webhook-ai-router"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/gabeperez/universal-webhook-ai-router","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gabeperez%2Funiversal-webhook-ai-router","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gabeperez%2Funiversal-webhook-ai-router/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gabeperez%2Funiversal-webhook-ai-router/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gabeperez%2Funiversal-webhook-ai-router/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gabeperez","download_url":"https://codeload.github.com/gabeperez/universal-webhook-ai-router/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gabeperez%2Funiversal-webhook-ai-router/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32575113,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-03T06:36:36.687Z","status":"ssl_error","status_checked_at":"2026-05-03T06:36:09.306Z","response_time":103,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai","automation","cal-com","cloudflare","github","shopify","stripe","webhook","workers"],"created_at":"2025-09-24T04:07:33.439Z","updated_at":"2026-05-03T15:35:46.844Z","avatar_url":"https://github.com/gabeperez.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 🔗 Universal Webhook Router for AI\n\nTransform webhooks from any service (Cal.com, GitHub, Stripe, Shopify, etc.) into natural language notifications for your AI assistant.\n\n[![Deploy to Cloudflare Workers](https://deploy.workers.cloudflare.com/button)](https://deploy.workers.cloudflare.com/?url=https://github.com/gabeperez/universal-webhook-ai-router)\n\nThis CloudFlare Worker receives webhook events from Cal.com and forwards relevant booking information to your AI at poke.com.\n\n## 🚀 Quick Start\n\n### Option 1: One-Click Deploy (Recommended)\n1. Click the deploy button above\n2. Connect your Cloudflare account\n3. Set your `AI_API_KEY` environment variable\n4. Your webhook URL: `https://your-worker-name.your-subdomain.workers.dev`\n\n### Option 2: Manual Deploy\n```bash\ngit clone https://github.com/gabeperez/universal-webhook-ai-router\ncd universal-webhook-ai-router\nnpm install\nwrangler login\nwrangler secret put AI_API_KEY\nwrangler deploy\n```\n\n📋 **Next Steps**: See [CONFIG.md](CONFIG.md) for post-deployment configuration.\n\n## 📋 Features\n\n- **Secure webhook validation** using HMAC-SHA256 signatures\n- **Event filtering** for booking events: `BOOKING_CREATED`, `BOOKING_CANCELLED`, `BOOKING_RESCHEDULED`, `BOOKING_CONFIRMED`\n- **Automatic retry logic** with exponential backoff for Poke.com API calls\n- **Comprehensive error handling** and logging\n- **Health monitoring** endpoint\n\n## 🔧 Cal.com Configuration\n\n### Step 1: Access Webhook Settings\n1. Log into your Cal.com account\n2. Navigate to **Settings** → **Developer** → **Webhooks**\n\n### Step 2: Add New Webhook\n- **Webhook URL**: `https://cal-webhook.perez-jg22.workers.dev`\n- **Secret**: Use the same value as your `CAL_WEBHOOK_SECRET` environment variable\n- **Events to Subscribe**: Select the following:\n  - ✅ Booking Created\n  - ✅ Booking Confirmed  \n  - ✅ Booking Cancelled\n  - ✅ Booking Rescheduled\n\n### Step 3: Test the Integration\n1. Create a test booking in Cal.com\n2. Check the CloudFlare Workers dashboard for logs\n3. Verify your AI at poke.com receives the notification\n\n## 🔒 Security\n\n- **Signature Verification**: All incoming webhooks are verified using HMAC-SHA256\n- **Secret Management**: API keys stored securely in CloudFlare Workers secrets\n- **Rate Limiting**: CloudFlare provides built-in DDoS protection\n- **HTTPS Only**: All communication encrypted in transit\n\n## 📊 Data Flow\n\n```\nCal.com → [Webhook] → CloudFlare Worker → Poke.com AI\n```\n\n### Webhook Payload Structure\n\nThe worker transforms Cal.com webhook data into this structure for your AI:\n\n```json\n{\n  \"event\": \"BOOKING_CREATED\",\n  \"bookingId\": 123456,\n  \"bookingUid\": \"abc123\",\n  \"title\": \"30 min meeting\",\n  \"startTime\": \"2025-09-14T16:00:00.000Z\",\n  \"endTime\": \"2025-09-14T16:30:00.000Z\",\n  \"status\": \"ACCEPTED\",\n  \"attendees\": [\n    {\n      \"name\": \"John Doe\",\n      \"email\": \"john@example.com\",\n      \"timeZone\": \"America/New_York\"\n    }\n  ],\n  \"organizer\": {\n    \"name\": \"Gabe Perez\",\n    \"email\": \"gabe@example.com\"\n  },\n  \"metadata\": {\n    \"eventTypeId\": 789,\n    \"rescheduleReason\": null,\n    \"cancelReason\": null\n  },\n  \"timestamp\": \"2025-09-14T15:30:00.000Z\"\n}\n```\n\n## 🧪 Testing\n\n### Health Check\n```bash\ncurl https://cal-webhook.perez-jg22.workers.dev/health\n```\n\n### Local Development\n```bash\n# Start local development server\nwrangler dev\n\n# Test with the provided script\n./test-webhook.sh local [webhook_secret]\n```\n\n### Production Testing\n```bash\n./test-webhook.sh prod [webhook_secret]\n```\n\n## 🔧 Environment Variables\n\n| Variable | Description | Required |\n|----------|-------------|----------|\n| `AI_API_KEY` | Bearer token for Poke.com API | ✅ |\n| `CAL_WEBHOOK_SECRET` | Secret for webhook signature verification | ✅ |\n\n## 📈 Monitoring\n\n### CloudFlare Dashboard\n- **Real-time Logs**: View at Workers → cal-webhook → Logs\n- **Performance Metrics**: Request volume, response times, error rates\n- **Usage Analytics**: Bandwidth and request statistics\n\n### Common Log Messages\n- `✅ Webhook processed successfully` → Normal operation\n- `⚠️ Unsupported event ignored` → Non-booking events (expected)\n- `❌ Signature verification failed` → Invalid webhook source\n- `❌ Failed to forward to Poke.com` → API connectivity issues\n\n## 🛠️ Troubleshooting\n\n### Common Issues\n\n**1. \"Missing cal-signature header\"**\n- Ensure Cal.com webhook secret is configured\n- Verify webhook URL is exactly: `https://cal-webhook.perez-jg22.workers.dev`\n\n**2. \"Invalid signature\"**\n- Double-check `CAL_WEBHOOK_SECRET` matches Cal.com configuration\n- Ensure secret doesn't have extra whitespace\n\n**3. \"Failed to forward to Poke.com\"**\n- Verify `AI_API_KEY` is valid and active\n- Check if Poke.com API is accessible\n- Review CloudFlare Worker logs for specific error details\n\n### Debug Commands\n```bash\n# View worker logs in real-time\nwrangler tail\n\n# Check secret configuration\nwrangler secret list\n\n# Test health endpoint\ncurl https://cal-webhook.perez-jg22.workers.dev/health\n```\n\n## 📞 Support\n\nFor issues with this integration:\n1. Check CloudFlare Workers logs first\n2. Verify Cal.com webhook configuration\n3. Test with the provided test script\n4. Review this README for common solutions\n\n---\n\n**Last Updated**: September 14, 2025  \n**Worker Version**: 1.0  \n**Compatibility**: Cal.com API v1, CloudFlare Workers","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgabeperez%2Funiversal-webhook-ai-router","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgabeperez%2Funiversal-webhook-ai-router","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgabeperez%2Funiversal-webhook-ai-router/lists"}