jeremylongshore/claude-code-plugins-plus-skills
apollo-pack
plugins/saas-packs/apollo-pack/skills/apollo-webhooks-events/SKILL.md
January 22, 2026
Select agents to install to:
npx add-skill https://github.com/jeremylongshore/claude-code-plugins-plus-skills/blob/main/plugins/saas-packs/apollo-pack/skills/apollo-webhooks-events/SKILL.md -a claude-code --skill apollo-webhooks-eventsInstallation paths:
.claude/skills/apollo-webhooks-events/# Apollo Webhooks Events
## Overview
Implement webhook handlers for Apollo.io to receive real-time notifications about contact updates, sequence events, and engagement activities.
## Apollo Webhook Events
| Event Type | Description | Payload Contains |
|------------|-------------|------------------|
| `contact.created` | New contact added | Contact data |
| `contact.updated` | Contact info changed | Updated fields |
| `sequence.started` | Contact added to sequence | Sequence & contact IDs |
| `sequence.completed` | Sequence finished | Completion status |
| `email.sent` | Email delivered | Email & contact info |
| `email.opened` | Email was opened | Open timestamp |
| `email.clicked` | Link clicked | Click details |
| `email.replied` | Reply received | Reply content |
| `email.bounced` | Email bounced | Bounce reason |
## Webhook Handler Implementation
### Express Handler
```typescript
// src/routes/webhooks/apollo.ts
import { Router } from 'express';
import crypto from 'crypto';
import { z } from 'zod';
const router = Router();
// Webhook payload schemas
const ContactEventSchema = z.object({
event: z.enum(['contact.created', 'contact.updated']),
timestamp: z.string(),
data: z.object({
contact: z.object({
id: z.string(),
email: z.string().optional(),
name: z.string().optional(),
title: z.string().optional(),
organization: z.object({
name: z.string(),
}).optional(),
}),
changes: z.record(z.any()).optional(),
}),
});
const SequenceEventSchema = z.object({
event: z.enum(['sequence.started', 'sequence.completed', 'sequence.paused']),
timestamp: z.string(),
data: z.object({
sequence_id: z.string(),
contact_id: z.string(),
status: z.string().optional(),
}),
});
const EmailEventSchema = z.object({
event: z.enum(['email.sent', 'email.opened', 'email.clicked', 'email.replied', 'email.bounced']),
timestamp: z.string(),
data: z.object({
email_id: z.string(),
contact_id: z.