From salesloft-pack
Tracks SalesLoft emails, calls, and engagement analytics via REST API v2. Lists activities with metrics, logs dispositions, aggregates stats for sales dashboards.
npx claudepluginhub jeremylongshore/claude-code-plugins-plus-skills --plugin salesloft-packThis skill is limited to using the following tools:
Track and analyze sales activities: emails sent/opened/clicked/replied, calls logged, and engagement metrics. Uses REST API v2 endpoints: `/activities/emails.json`, `/activities/calls.json`, `/action_details/sent_emails.json`.
Manages SalesLoft people, cadences, and enrollments via REST API v2. For prospect management, cadence building, and outbound sales sequence automation.
Guides Next.js Cache Components and Partial Prerendering (PPR): 'use cache' directives, cacheLife(), cacheTag(), revalidateTag() for caching, invalidation, static/dynamic optimization. Auto-activates on cacheComponents: true.
Guides building MCP servers enabling LLMs to interact with external services via tools. Covers best practices, TypeScript/Node (MCP SDK), Python (FastMCP).
Share bugs, ideas, or general feedback.
Track and analyze sales activities: emails sent/opened/clicked/replied, calls logged, and engagement metrics. Uses REST API v2 endpoints: /activities/emails.json, /activities/calls.json, /action_details/sent_emails.json.
salesloft-core-workflow-aimport axios from 'axios';
const api = axios.create({
baseURL: 'https://api.salesloft.com/v2',
headers: { Authorization: `Bearer ${process.env.SALESLOFT_API_KEY}` },
});
// Get email activities for a specific person
const { data: emails } = await api.get('/activities/emails.json', {
params: {
person_id: 1234,
per_page: 50,
sort_by: 'updated_at',
sort_direction: 'DESC',
},
});
emails.data.forEach((email: any) => {
console.log(`${email.subject} | Status: ${email.status}`);
console.log(` Opens: ${email.counts.opens}, Clicks: ${email.counts.clicks}`);
console.log(` Replied: ${email.counts.replies > 0 ? 'Yes' : 'No'}`);
});
// List calls with disposition data
const { data: calls } = await api.get('/activities/calls.json', {
params: { per_page: 50, sort_by: 'created_at', sort_direction: 'DESC' },
});
calls.data.forEach((call: any) => {
console.log(`${call.to} | Duration: ${call.duration}s`);
console.log(` Disposition: ${call.disposition}`);
console.log(` Sentiment: ${call.sentiment}`);
console.log(` Notes: ${call.notes || '(none)'}`);
});
// Aggregate email engagement metrics across a cadence
async function cadenceEngagement(cadenceId: number) {
let page = 1;
const stats = { sent: 0, opened: 0, clicked: 0, replied: 0 };
while (true) {
const { data } = await api.get('/activities/emails.json', {
params: { cadence_id: cadenceId, per_page: 100, page },
});
for (const email of data.data) {
stats.sent++;
if (email.counts.opens > 0) stats.opened++;
if (email.counts.clicks > 0) stats.clicked++;
if (email.counts.replies > 0) stats.replied++;
}
if (page >= data.metadata.paging.total_pages) break;
page++;
}
return {
...stats,
openRate: ((stats.opened / stats.sent) * 100).toFixed(1) + '%',
clickRate: ((stats.clicked / stats.sent) * 100).toFixed(1) + '%',
replyRate: ((stats.replied / stats.sent) * 100).toFixed(1) + '%',
};
}
const metrics = await cadenceEngagement(500);
// { sent: 247, opened: 148, clicked: 32, replied: 19,
// openRate: '59.9%', clickRate: '13.0%', replyRate: '7.7%' }
// Get steps for a cadence to see per-step analytics
const { data: steps } = await api.get('/steps.json', {
params: { cadence_id: 500 },
});
steps.data.forEach((step: any) => {
console.log(`Step ${step.day}: ${step.step_type} (${step.name})`);
// step_type: 'email', 'phone', 'other', 'integration'
});
Q1 Outbound Intro | Status: sent
Opens: 3, Clicks: 1
Replied: No
Cadence 500 Engagement:
Sent: 247, Open: 59.9%, Click: 13.0%, Reply: 7.7%
| Error | Cause | Solution |
|---|---|---|
Empty activities/emails | No emails sent yet | Verify cadence is active with enrolled people |
422 filter error | Invalid filter param | Check supported filter params in API docs |
| Slow pagination | Large activity history | Narrow date range with updated_at[gt] |
For common errors, see salesloft-common-errors.