From hootsuite-pack
Implements Hootsuite event handling via API polling, custom Express webhooks for scheduled posts, and App Directory webhook endpoints.
npx claudepluginhub jeremylongshore/claude-code-plugins-plus-skills --plugin hootsuite-packThis skill is limited to using the following tools:
Hootsuite provides webhook notifications for social stream events when building Hootsuite App Directory integrations. For API-only integrations, you poll for message state changes or implement your own scheduling system with callbacks.
Generates minimal Hootsuite API examples to list social profiles, schedule posts, and query scheduled messages using TypeScript or curl.
Implements Klaviyo webhooks with HMAC-SHA256 signature verification, event handling, idempotency, and API subscriptions for profile/list/segment/campaign/flow events.
Implements HubSpot webhook endpoints for CRM events like contact/deal changes, with v3 signature verification and idempotent handling in Express.
Share bugs, ideas, or general feedback.
Hootsuite provides webhook notifications for social stream events when building Hootsuite App Directory integrations. For API-only integrations, you poll for message state changes or implement your own scheduling system with callbacks.
// Since Hootsuite REST API doesn't push webhooks for message status,
// poll for changes to scheduled messages
async function pollMessageStatus(messageId: string, intervalMs = 30000) {
const check = async () => {
const response = await fetch(`https://platform.hootsuite.com/v1/messages/${messageId}`, {
headers: { 'Authorization': `Bearer ${await getStoredToken()}` },
});
const { data } = await response.json();
if (data.state === 'SENT') {
console.log(`Message ${messageId} sent at ${data.sentAt}`);
return data;
} else if (data.state === 'FAILED' || data.state === 'REJECTED') {
console.error(`Message ${messageId} failed: ${data.state}`);
return data;
}
console.log(`Message ${messageId}: ${data.state}, checking again...`);
await new Promise(r => setTimeout(r, intervalMs));
return check();
};
return check();
}
// Your own webhook system to track scheduled post status
import express from 'express';
const app = express();
app.use(express.json());
// Cron job checks scheduled posts and fires webhooks
async function checkScheduledPosts() {
const response = await fetch('https://platform.hootsuite.com/v1/messages?state=SENT&limit=50', {
headers: { 'Authorization': `Bearer ${await getStoredToken()}` },
});
const { data } = await response.json();
for (const msg of data) {
// Notify your systems about sent posts
await fetch(process.env.INTERNAL_WEBHOOK_URL!, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ event: 'post.sent', messageId: msg.id, sentAt: msg.sentAt, text: msg.text }),
});
}
}
For apps listed in the Hootsuite App Directory, you receive stream events:
// Webhook handler for Hootsuite App Directory integration
app.post('/webhooks/hootsuite', async (req, res) => {
const { type, data } = req.body;
switch (type) {
case 'message.sent': console.log('Post sent:', data); break;
case 'message.failed': console.error('Post failed:', data); break;
case 'stream.message': console.log('New social message:', data); break;
}
res.status(200).json({ received: true });
});
For performance, see hootsuite-performance-tuning.