Skip to content
Back to skills

Salesloft Ci Integration

ASecurity

Set up CI/CD pipelines for SalesLoft integrations with GitHub Actions. Use when automating SalesLoft integration tests, validating OAuth tokens, or running cadence sync validation in CI. Trigger: "salesloft CI", "salesloft GitHub Actions", "salesloft automated tests".

  • 4 stars
  • 0 votes
  • 0 copies
  • 3 views
  • Added September 12, 2026
testingtypescriptbashnodetestinggitapici/cd

Works with

  • cli
  • api

Security analysis

A100/100

Pro scans all 2 files and shows the line behind each finding

Scanned September 12, 2026

npx -y skills add aibot88/sec_skill_store --skill salesloft-ci-integration --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Salesloft Ci Integration?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Salesloft Ci Integration
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/aibot88-salesloft-ci-integration/badge)](https://www.skillsdirectory.com/skills/aibot88-salesloft-ci-integration)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: salesloft-ci-integration
description: |
  Set up CI/CD pipelines for SalesLoft integrations with GitHub Actions.
  Use when automating SalesLoft integration tests, validating OAuth tokens,
  or running cadence sync validation in CI.
  Trigger: "salesloft CI", "salesloft GitHub Actions", "salesloft automated tests".
allowed-tools: Read, Write, Edit, Bash(gh:*)
version: 1.0.0
license: MIT
author: Jeremy Longshore <jeremy@intentsolutions.io>
tags: [saas, sales, outreach, salesloft]
compatible-with: claude-code
---

# SalesLoft CI Integration

## Overview

GitHub Actions workflows for testing SalesLoft API integrations: unit tests with mocked responses, integration tests against the live API, and OAuth token validation.

## Instructions

### Step 1: GitHub Actions Workflow

```yaml
# .github/workflows/salesloft-ci.yml
name: SalesLoft Integration
on:
  push:
    branches: [main]
  pull_request:

jobs:
  unit-tests:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with: { node-version: '20', cache: 'npm' }
      - run: npm ci
      - run: npm test -- --coverage
      - uses: actions/upload-artifact@v4
        with: { name: coverage, path: coverage/ }

  integration-tests:
    runs-on: ubuntu-latest
    if: github.event_name == 'push' && github.ref == 'refs/heads/main'
    env:
      SALESLOFT_API_KEY: ${{ secrets.SALESLOFT_TEST_API_KEY }}
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with: { node-version: '20', cache: 'npm' }
      - run: npm ci
      - name: Verify SalesLoft connectivity
        run: |
          curl -sf -H "Authorization: Bearer $SALESLOFT_API_KEY" \
            https://api.salesloft.com/v2/me.json | jq '.data.email'
      - run: npm run test:integration
```

### Step 2: Configure Secrets

```bash
# Store test API key (read-only scoped)
gh secret set SALESLOFT_TEST_API_KEY --body "your-test-token"

# For webhook testing
gh secret set SALESLOFT_WEBHOOK_SECRET --body "your-webhook-secret"
```

### Step 3: Integration Test Structure

```typescript
// tests/integration/salesloft.test.ts
import { describe, it, expect } from 'vitest';
import { createClient } from '../../src/salesloft/client';

const SKIP = !process.env.SALESLOFT_API_KEY;

describe.skipIf(SKIP)('SalesLoft Integration', () => {
  const api = createClient();

  it('authenticates and returns user', async () => {
    const { data } = await api.get('/me.json');
    expect(data.data.email).toBeTruthy();
  });

  it('lists people with pagination', async () => {
    const { data } = await api.get('/people.json', {
      params: { per_page: 5 },
    });
    expect(data.metadata.paging).toHaveProperty('total_count');
    expect(data.data.length).toBeLessThanOrEqual(5);
  });

  it('lists cadences', async () => {
    const { data } = await api.get('/cadences.json', {
      params: { per_page: 5 },
    });
    expect(Array.isArray(data.data)).toBe(true);
  });

  it('handles rate limit headers', async () => {
    const resp = await api.get('/people.json', { params: { per_page: 1 } });
    expect(resp.headers).toHaveProperty('x-ratelimit-limit-per-minute');
  });
});
```

### Step 4: Pre-merge Validation

```yaml
# Branch protection: require these checks
required_status_checks:
  strict: true
  contexts:
    - "unit-tests"
```

## Error Handling

| CI Issue | Cause | Solution |
|----------|-------|----------|
| Secret not found | Missing `SALESLOFT_TEST_API_KEY` | `gh secret set` |
| Integration test 401 | Token expired | Refresh and update secret |
| Rate limit in CI | Parallel runs | Use separate test API keys per branch |
| Flaky integration tests | SalesLoft maintenance | Add retry and skip conditions |

## Resources

- [GitHub Actions Docs](https://docs.github.com/en/actions)
- [SalesLoft API Logs](https://developers.salesloft.com/docs/platform/guides/api-logs/)

## Next Steps

For deployment patterns, see `salesloft-deploy-integration`.

Files in this skill

  • SKILL.md3.9 KB
  • source.json834 B

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.