agentsclimarketplace

Salesloft deploy integration

Skill jeremylongshore/claude-code-plugins-plus-skills/plugins/saas-packs/salesloft-pack/skills/salesloft-deploy-integration

425 plugins, 2,810 skills, 200 agents for Claude Code. Open-source marketplace at tonsofskills.com with the ccpi CLI package manager.

Install
npx -y skills add jeremylongshore/claude-code-plugins-plus-skills --skill salesloft-deploy-integration

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

What its author says it does

Copied from the file, not written here

'Deploy SalesLoft integrations to Vercel, Fly.io, and Cloud Run.

The file declares its own license as MIT. That is the author’s claim about this one file, and it is not the same thing as the license GitHub reports for the repository, which is listed with the other numbers below.

SKILL.md

3.9 KB, 874 tokens by cl100k_base, as published. Nobody here has run it

SalesLoft Deploy Integration

Overview

Deploy SalesLoft-powered applications to cloud platforms with proper secrets management, webhook endpoint configuration, and health checks. SalesLoft requires HTTPS webhook endpoints and OAuth tokens stored securely.

Instructions

Vercel Deployment

# Set secrets
vercel env add SALESLOFT_CLIENT_ID production
vercel env add SALESLOFT_CLIENT_SECRET production
vercel env add SALESLOFT_WEBHOOK_SECRET production

# Deploy
vercel --prod
// api/webhooks/salesloft.ts (Vercel serverless function)
import { verifyWebhookSignature } from '../../lib/salesloft';

export const config = { api: { bodyParser: false } }; // Raw body for HMAC

export default async function handler(req: Request) {
  const body = await req.text();
  const sig = req.headers.get('x-salesloft-signature')!;
  const ts = req.headers.get('x-salesloft-timestamp')!;

  if (!verifyWebhookSignature(Buffer.from(body), sig, ts, process.env.SALESLOFT_WEBHOOK_SECRET!)) {
    return new Response('Invalid signature', { status: 401 });
  }

  const event = JSON.parse(body);
  // Process event...
  return new Response(JSON.stringify({ received: true }), { status: 200 });
}

Fly.io Deployment

# fly.toml
app = "salesloft-sync"
primary_region = "iad"

[env]
  NODE_ENV = "production"

[http_service]
  internal_port = 3000
  force_https = true
  auto_stop_machines = true
  auto_start_machines = true

[[services.http_checks]]
  interval = "30s"
  timeout = "5s"
  path = "/health"
fly secrets set SALESLOFT_CLIENT_ID=xxx SALESLOFT_CLIENT_SECRET=xxx
fly secrets set SALESLOFT_WEBHOOK_SECRET=xxx
fly deploy

Cloud Run Deployment

# Store secrets in Secret Manager
echo -n "client-id" | gcloud secrets create salesloft-client-id --data-file=-
echo -n "client-secret" | gcloud secrets create salesloft-client-secret --data-file=-

# Deploy with secret mounts
gcloud run deploy salesloft-sync \
  --image gcr.io/$PROJECT_ID/salesloft-sync \
  --region us-central1 \
  --set-secrets=SALESLOFT_CLIENT_ID=salesloft-client-id:latest \
  --set-secrets=SALESLOFT_CLIENT_SECRET=salesloft-client-secret:latest \
  --allow-unauthenticated

Health Check (All Platforms)

app.get('/health', async (req, res) => {
  const start = Date.now();
  try {
    const { data } = await api.get('/me.json');
    res.json({
      status: 'healthy',
      salesloft: { user: data.data.email, latencyMs: Date.now() - start },
    });
  } catch (err: any) {
    res.status(503).json({
      status: 'degraded',
      salesloft: { error: err.message, latencyMs: Date.now() - start },
    });
  }
});

Error Handling

IssueCauseSolution
Webhook 401Wrong signing secretVerify secret matches SalesLoft config
Cold start timeoutWebhook response > 30sProcess async, respond 200 immediately
Secret not foundMissing env varCheck platform secret configuration
Health check failsToken expiredEnsure token refresh is automated

Resources

Next Steps

For webhook handling, see salesloft-webhooks-events.

What ships with it

Read from the repository

Just SKILL.md. No reference files, no scripts.

Keep looking

Skills are one crate of 327,167. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.