From hubspot-pack
Deploys HubSpot-powered apps to Vercel, Fly.io, and Cloud Run with secret management for access tokens, health checks, and platform configs.
npx claudepluginhub jeremylongshore/claude-code-plugins-plus-skills --plugin hubspot-packThis skill is limited to using the following tools:
Deploy HubSpot-powered applications to Vercel, Fly.io, or Google Cloud Run with proper secret management and health checks.
Executes HubSpot production deployment checklist for CRM integrations, including verifications, TypeScript health check endpoint, and monitoring setup.
Deploys Intercom apps to Vercel, Fly.io, and Cloud Run with secrets, webhook handlers, and health checks.
Deploys Hootsuite integrations to Vercel, Fly.io, and Cloud Run with OAuth token persistence using KV stores or databases.
Share bugs, ideas, or general feedback.
Deploy HubSpot-powered applications to Vercel, Fly.io, or Google Cloud Run with proper secret management and health checks.
# Add HubSpot secrets to Vercel
vercel env add HUBSPOT_ACCESS_TOKEN production
# Paste: pat-na1-xxxxx
# Optional webhook secret
vercel env add HUBSPOT_WEBHOOK_SECRET production
// vercel.json
{
"env": {
"HUBSPOT_ACCESS_TOKEN": "@hubspot-access-token"
},
"functions": {
"api/**/*.ts": {
"maxDuration": 30
}
}
}
// api/hubspot/contacts.ts (Vercel serverless function)
import * as hubspot from '@hubspot/api-client';
const client = new hubspot.Client({
accessToken: process.env.HUBSPOT_ACCESS_TOKEN!,
numberOfApiCallRetries: 3,
});
export default async function handler(req: Request) {
if (req.method === 'GET') {
const contacts = await client.crm.contacts.basicApi.getPage(
10, undefined, ['firstname', 'lastname', 'email']
);
return Response.json(contacts.results);
}
if (req.method === 'POST') {
const body = await req.json();
const contact = await client.crm.contacts.basicApi.create({
properties: body,
associations: [],
});
return Response.json(contact, { status: 201 });
}
}
# Deploy
vercel --prod
# fly.toml
app = "my-hubspot-app"
primary_region = "iad"
[env]
NODE_ENV = "production"
[http_service]
internal_port = 3000
force_https = true
auto_stop_machines = true
auto_start_machines = true
[[http_service.checks]]
grace_period = "10s"
interval = "30s"
method = "GET"
path = "/health"
timeout = "5s"
# Set HubSpot secrets
fly secrets set HUBSPOT_ACCESS_TOKEN=pat-na1-xxxxx
fly secrets set HUBSPOT_WEBHOOK_SECRET=your-secret
# Deploy
fly deploy
# Verify health
fly status
curl https://my-hubspot-app.fly.dev/health
#!/bin/bash
# deploy-cloud-run.sh
PROJECT_ID="${GOOGLE_CLOUD_PROJECT}"
SERVICE_NAME="hubspot-service"
REGION="us-central1"
# Store token in Secret Manager
echo -n "pat-na1-xxxxx" | gcloud secrets create hubspot-access-token \
--data-file=- --replication-policy="automatic"
# Grant Cloud Run access to the secret
gcloud secrets add-iam-policy-binding hubspot-access-token \
--member="serviceAccount:${PROJECT_ID}-compute@developer.gserviceaccount.com" \
--role="roles/secretmanager.secretAccessor"
# Build and deploy
gcloud builds submit --tag gcr.io/$PROJECT_ID/$SERVICE_NAME
gcloud run deploy $SERVICE_NAME \
--image gcr.io/$PROJECT_ID/$SERVICE_NAME \
--region $REGION \
--platform managed \
--set-secrets=HUBSPOT_ACCESS_TOKEN=hubspot-access-token:latest \
--min-instances=1 \
--max-instances=10 \
--memory=512Mi \
--timeout=30s
// src/health.ts
import * as hubspot from '@hubspot/api-client';
export async function healthCheck(): Promise<{
status: string;
services: Record<string, any>;
timestamp: string;
}> {
const client = new hubspot.Client({
accessToken: process.env.HUBSPOT_ACCESS_TOKEN!,
});
let hubspotStatus = { connected: false, latencyMs: 0 };
const start = Date.now();
try {
await client.crm.contacts.basicApi.getPage(1);
hubspotStatus = { connected: true, latencyMs: Date.now() - start };
} catch {
hubspotStatus = { connected: false, latencyMs: Date.now() - start };
}
return {
status: hubspotStatus.connected ? 'healthy' : 'degraded',
services: { hubspot: hubspotStatus },
timestamp: new Date().toISOString(),
};
}
| Issue | Cause | Solution |
|---|---|---|
| Secret not found at runtime | Wrong env var name | Check platform secret config |
| Deploy timeout | Large build | Increase build timeout |
| Health check fails | Wrong token for environment | Verify production token |
| Cold start latency | Serverless function | Set min-instances=1 or use warm-up |
For webhook handling, see hubspot-webhooks-events.