customerio-webhooks-events
Facilitates handling of Customer.io webhooks for processing delivery events and callbacks, enhancing email marketing automation.
Install this skill
Security score
The customerio-webhooks-events skill was audited on May 12, 2026 and we found 58 security issues across 4 threat categories. Review the findings below before installing.
Categories Tested
Security Issues
Template literal with variable interpolation in command context
| 198 | console.log(`CIO webhook: ${event.metric} for ${event.customer_id}`); |
Template literal with variable interpolation in command context
| 203 | console.warn(`BOUNCE: ${event.email_address} (user: ${event.customer_id})`); |
Template literal with variable interpolation in command context
| 217 | console.error(`SPAM COMPLAINT: ${event.email_address}`); |
Template literal with variable interpolation in command context
| 246 | `${event.metric}: ${event.delivery_id} to ${event.customer_id}` |
Webhook reference - potential data exfiltration
| 2 | name: customerio-webhooks-events |
Webhook reference - potential data exfiltration
| 3 | description: 'Implement Customer.io webhook and reporting event handling. |
Webhook reference - potential data exfiltration
| 9 | Trigger: "customer.io webhook", "customer.io events", |
Webhook reference - potential data exfiltration
| 21 | - webhooks |
Webhook reference - potential data exfiltration
| 26 | # Customer.io Webhooks & Events |
Webhook reference - potential data exfiltration
| 30 | Implement Customer.io reporting webhook handling: receive real-time delivery events (sent, delivered, opened, clicked, bounced, complained, unsubscribed), verify HMAC-SHA256 signatures, process events |
Webhook reference - potential data exfiltration
| 32 | ## How Reporting Webhooks Work |
Webhook reference - potential data exfiltration
| 37 | Email sent → POST /webhooks/cio → Verify signature |
Webhook reference - potential data exfiltration
| 38 | Email opened → POST /webhooks/cio → Parse event type |
Webhook reference - potential data exfiltration
| 39 | Link clicked → POST /webhooks/cio → Route to handler → INSERT INTO events |
Webhook reference - potential data exfiltration
| 40 | Email bounced → POST /webhooks/cio → Suppress user |
Webhook reference - potential data exfiltration
| 43 | Configure at: Data & Integrations > Integrations > Reporting Webhooks |
Webhook reference - potential data exfiltration
| 47 | - Public HTTPS endpoint for webhook receiver |
Webhook reference - potential data exfiltration
| 48 | - Webhook signing key from Customer.io dashboard |
Webhook reference - potential data exfiltration
| 53 | ### Step 1: Define Webhook Event Types |
Webhook reference - potential data exfiltration
| 56 | // types/customerio-webhooks.ts |
Webhook reference - potential data exfiltration
| 58 | // Customer.io reporting webhook event metrics |
Webhook reference - potential data exfiltration
| 72 | interface CioWebhookEvent { |
Webhook reference - potential data exfiltration
| 98 | ### Step 2: Webhook Handler with Signature Verification |
Webhook reference - potential data exfiltration
| 101 | // routes/webhooks/customerio.ts |
Webhook reference - potential data exfiltration
| 105 | const WEBHOOK_SECRET = process.env.CUSTOMERIO_WEBHOOK_SECRET!; |
Webhook reference - potential data exfiltration
| 108 | const expected = createHmac("sha256", WEBHOOK_SECRET) |
Webhook reference - potential data exfiltration
| 125 | router.post("/webhooks/customerio", (req: Request, res: Response) => { |
Webhook reference - potential data exfiltration
| 135 | console.error("CIO webhook: invalid signature"); |
Webhook reference - potential data exfiltration
| 140 | const event: CioWebhookEvent = JSON.parse(rawBody.toString()); |
Webhook reference - potential data exfiltration
| 146 | handleWebhookEvent(event).catch((err) => |
Webhook reference - potential data exfiltration
| 147 | console.error("Webhook processing failed:", err) |
Webhook reference - potential data exfiltration
| 155 | // services/customerio-webhook-handler.ts |
Webhook reference - potential data exfiltration
| 167 | async function handleWebhookEvent(event: CioWebhookEvent): Promise<void> { |
Webhook reference - potential data exfiltration
| 198 | console.log(`CIO webhook: ${event.metric} for ${event.customer_id}`); |
Webhook reference - potential data exfiltration
| 202 | async function handleBounce(event: CioWebhookEvent): Promise<void> { |
Webhook reference - potential data exfiltration
| 216 | async function handleSpamComplaint(event: CioWebhookEvent): Promise<void> { |
Webhook reference - potential data exfiltration
| 229 | async function handleUnsubscribe(event: CioWebhookEvent): Promise<void> { |
Webhook reference - potential data exfiltration
| 236 | async function handleEngagement(event: CioWebhookEvent): Promise<void> { |
Webhook reference - potential data exfiltration
| 243 | async function handleDelivery(event: CioWebhookEvent): Promise<void> { |
Webhook reference - potential data exfiltration
| 256 | import webhookRouter from "./routes/webhooks/customerio"; |
Webhook reference - potential data exfiltration
| 260 | // Raw body parser for webhook signature verification |
Webhook reference - potential data exfiltration
| 263 | "/webhooks/customerio", |
Webhook reference - potential data exfiltration
| 275 | app.use(webhookRouter); |
Webhook reference - potential data exfiltration
| 277 | app.listen(3000, () => console.log("Webhook server on :3000")); |
Webhook reference - potential data exfiltration
| 290 | async function streamToWarehouse(event: CioWebhookEvent): Promise<void> { |
Webhook reference - potential data exfiltration
| 308 | 1. Go to **Data & Integrations** > **Integrations** > **Reporting Webhooks** |
Webhook reference - potential data exfiltration
| 309 | 2. Click **Add Reporting Webhook** |
Webhook reference - potential data exfiltration
| 310 | 3. Enter your endpoint URL: `https://your-domain.com/webhooks/customerio` |
Webhook reference - potential data exfiltration
| 312 | 5. Copy the webhook signing key to `CUSTOMERIO_WEBHOOK_SECRET` |
Webhook reference - potential data exfiltration
| 318 | | Invalid signature | Verify webhook secret matches dashboard value | |
Webhook reference - potential data exfiltration
| 325 | - [Reporting Webhooks](https://docs.customer.io/integrations/data-out/connections/webhooks/) |
Webhook reference - potential data exfiltration
| 326 | - [Webhooks Reference](https://docs.customer.io/integrations/api/webhooks/) |
Webhook reference - potential data exfiltration
| 327 | - [Webhook Action in Campaigns](https://docs.customer.io/journeys/webhooks-action/) |
Webhook reference - potential data exfiltration
| 331 | After webhook setup, proceed to `customerio-performance-tuning` for optimization. |
Access to .env file
| 105 | const WEBHOOK_SECRET = process.env.CUSTOMERIO_WEBHOOK_SECRET!; |
Access to .env file
| 159 | process.env.CUSTOMERIO_SITE_ID!, |
Access to .env file
| 160 | process.env.CUSTOMERIO_TRACK_API_KEY!, |
External URL reference
| 310 | 3. Enter your endpoint URL: `https://your-domain.com/webhooks/customerio` |