Skip to main content
instantly-multi-env-setup Configure Instantly.ai across development, staging, and production environments.
Use when setting up multi-workspace deployments, isolating test from production,
or managing per-environment API keys and webhook endpoints.
Trigger with phrases like "instantly environments", "instantly staging",
"instantly dev prod", "instantly multi-env", "instantly workspace isolation".
Ir a la instalación Skills Marketplace Descubre y explora habilidades de IA creadas por la comunidad.
Instalar con Codex o Claude Copia este prompt, pégalo en Codex, Claude u otro asistente, y deja que revise la página de la skill y la instale por ti.
Copiar promptMostrar detalles del prompt Un comando directo omite el prompt de revisión. Revisa el origen antes de ejecutarlo.
npx skills add https://github.com/jeremylongshore/claude-code-plugins-plus-skills --skill instantly-multi-env-setupEl comando permanece en una sola línea. Desplázate horizontalmente para revisarlo antes de copiarlo.
¿Prefieres una copia local? Descarga los archivos que SkillsMP tiene disponibles ahora.
Descargar Zip Descargando... Más de este repositorio Implement user sign-up and sign-in flows with Clerk.
Use when building authentication UI, customizing sign-in experience,
or implementing OAuth social login.
Trigger with phrases like "clerk sign-in", "clerk sign-up",
"clerk login flow", "clerk OAuth", "clerk social login".
Implement session management and middleware with Clerk.
Use when managing user sessions, configuring route protection,
or implementing token refresh and custom JWT templates.
Trigger with phrases like "clerk session", "clerk middleware",
"clerk route protection", "clerk token", "clerk JWT".
Configure enterprise SSO, role-based access control, and organization management.
Use when implementing SSO integration, configuring role-based permissions,
or setting up organization-level controls.
Trigger with phrases like "clerk SSO", "clerk RBAC",
"clerk enterprise", "clerk roles", "clerk permissions", "clerk organizations".
Ocupaciones relacionadas SOC
Basado en la clasificación ocupacional SOC
name instantly-multi-env-setup description Configure Instantly.ai across development, staging, and production environments.
Use when setting up multi-workspace deployments, isolating test from production,
or managing per-environment API keys and webhook endpoints.
Trigger with phrases like "instantly environments", "instantly staging",
"instantly dev prod", "instantly multi-env", "instantly workspace isolation".
allowed-tools Read, Write, Edit, Bash(npm:*), Grep version 1.12.0 license MIT author Jeremy Longshore <jeremy@intentsolutions.io> tags ["saas","instantly","multi-environment","configuration"] compatibility Designed for Claude Code, also compatible with Codex and OpenClaw
Instantly Multi-Environment Setup
Overview
Configure Instantly API v2 integrations across development, staging, and production environments. Instantly uses workspace-level isolation — each workspace has its own accounts, campaigns, leads, and API keys. This skill covers workspace separation, environment-specific configuration, mock server for dev, and safe promotion workflows.
Environment Strategy
Environment Instantly Backend API Keys Webhooks Purpose Development Mock server mock-keylocalhost:3000 Code iteration Staging Separate workspace Staging key staging.yourapp.com Integration testing Production Production workspace Prod key prod.yourapp.com Live outreach
Instructions
Step 1: Environment Configuration
import "dotenv/config" ;
type Env = "development" | "staging" | "production" ;
interface InstantlyConfig {
env : Env ;
apiKey : string ;
baseUrl : string ;
webhookSecret : string ;
useMock : boolean ;
dailyLimitCap : number ;
enableRealSending : boolean ;
}
export function getConfig ( ): InstantlyConfig {
const env = (process. . || ) ;
: < , > = {
: {
: ,
: process. . || ,
: ,
: ,
: ,
: ,
: ,
},
: {
: ,
: process. . || ,
: ,
: process. . || ,
: ,
: ,
: ,
},
: {
: ,
: process. . || ,
: ,
: process. . || ,
: ,
: ,
: ,
},
};
config = configs[env];
(!config. && !config. ) {
( );
}
config;
}
env
NODE_ENV
"development"
as
Env
const
configs
Record
Env
InstantlyConfig
development
env
"development"
apiKey
env
INSTANTLY_API_KEY_DEV
"mock-key"
baseUrl
"https://developer.instantly.ai/_mock/api/v2"
webhookSecret
"dev-secret"
useMock
true
dailyLimitCap
5
enableRealSending
false
staging
env
"staging"
apiKey
env
INSTANTLY_API_KEY_STAGING
""
baseUrl
"https://api.instantly.ai/api/v2"
webhookSecret
env
INSTANTLY_WEBHOOK_SECRET_STAGING
""
useMock
false
dailyLimitCap
10
enableRealSending
true
production
env
"production"
apiKey
env
INSTANTLY_API_KEY_PROD
""
baseUrl
"https://api.instantly.ai/api/v2"
webhookSecret
env
INSTANTLY_WEBHOOK_SECRET_PROD
""
useMock
false
dailyLimitCap
100
enableRealSending
true
const
if
useMock
apiKey
throw
new
Error
`INSTANTLY_API_KEY_${env.toUpperCase()} is required for ${env} `
return
Step 2: Environment-Specific .env Files
NODE_ENV=development
INSTANTLY_API_KEY_DEV=mock-key
INSTANTLY_BASE_URL=https://developer.instantly.ai/_mock/api/v2
INSTANTLY_WEBHOOK_SECRET=dev-secret-123
NODE_ENV=staging
INSTANTLY_API_KEY_STAGING=your-staging-workspace-key
INSTANTLY_BASE_URL=https://api.instantly.ai/api/v2
INSTANTLY_WEBHOOK_SECRET_STAGING=staging-secret-456
NODE_ENV=production
INSTANTLY_API_KEY_PROD=your-production-workspace-key
INSTANTLY_BASE_URL=https://api.instantly.ai/api/v2
INSTANTLY_WEBHOOK_SECRET_PROD=prod-secret-789
Step 3: Safe Campaign Creation with Environment Guards import { getConfig } from "./config" ;
import { InstantlyClient } from "./instantly/client" ;
const config = getConfig ();
const client = new InstantlyClient (config.apiKey , config.baseUrl );
async function createCampaignSafe (name : string , sequences : any [] ) {
const envPrefix = config.env === "production" ? "" : `[${config.env.toUpperCase()} ] ` ;
const safeName = `${envPrefix} ${name} ` ;
const campaign = await client.campaigns .create ({
name : safeName,
daily_limit : Math .min (50 , config.dailyLimitCap ),
sequences,
campaign_schedule : {
start_date : new Date ().toISOString ().split ("T" )[0 ],
schedules : [{
name : "Business Hours" ,
timing : { from : "09:00" , to : "17:00" },
days : { "1" : true , "2" : true , "3" : true , "4" : true , "5" : true , "0" : false , "6" : false },
timezone : "America/New_York" ,
}],
},
stop_on_reply : true ,
});
console .log (`[${config.env} ] Campaign created: ${campaign.name} (${campaign.id} )` );
if (config.env !== "production" ) {
await client.campaigns .activate (campaign.id );
console .log (`[${config.env} ] Campaign auto-activated (non-prod)` );
} else {
console .log (`[production] Campaign created in DRAFT — manual activation required` );
}
return campaign;
}
Step 4: Workspace Isolation Verification async function verifyWorkspaceIsolation ( ) {
const config = getConfig ();
const workspace = await client.request <{
id : string ; name : string ;
}>("/workspaces/current" );
console .log (`Environment: ${config.env} ` );
console .log (`Workspace: ${workspace.name} (${workspace.id} )` );
const expectedWorkspaceNames : Record <string , string []> = {
development : ["dev" , "test" , "mock" ],
staging : ["staging" , "stage" , "qa" ],
production : ["prod" , "production" , "live" ],
};
const expected = expectedWorkspaceNames[config.env ] || [];
const nameMatch = expected.some ((n ) =>
workspace.name .toLowerCase ().includes (n)
);
if (!nameMatch && config.env !== "development" ) {
console .warn (`WARNING: Workspace name "${workspace.name} " doesn't match expected ${config.env} pattern` );
console .warn ("Verify you're using the correct API key for this environment" );
}
const accounts = await client.accounts .list (5 );
console .log (`Accounts in workspace: ${accounts.length} ` );
}
Step 5: Webhook Registration Per Environment async function setupWebhooksForEnv ( ) {
const config = getConfig ();
const webhookBaseUrls : Record <string , string > = {
development : "http://localhost:3000" ,
staging : "https://staging-webhooks.yourapp.com" ,
production : "https://webhooks.yourapp.com" ,
};
const baseUrl = webhookBaseUrls[config.env ];
const existing = await client.webhooks .list ();
for (const w of existing) {
if (w.name .startsWith (`[${config.env} ]` )) {
await client.webhooks .delete (w.id );
}
}
const events = ["reply_received" , "email_bounced" , "lead_interested" , "lead_meeting_booked" ];
for (const event of events) {
await client.webhooks .create ({
name : `[${config.env} ] ${event} ` ,
target_hook_url : `${baseUrl} /webhooks/instantly` ,
event_type : event,
headers : { "X-Webhook-Secret" : config.webhookSecret },
});
}
console .log (`[${config.env} ] Registered ${events.length} webhooks -> ${baseUrl} ` );
}
Promotion Workflow Development (mock) → Staging (real API, test data) → Production (live)
| | |
| Code changes | Integration test | Manual activation
| Unit tests | Small lead list (10) | Full lead list
| Mock server | Staging workspace | Production workspace
| | Webhook verification | Monitoring + alerts
Error Handling Error Cause Solution Wrong workspace API key mismatch Run verifyWorkspaceIsolation() Prod campaign auto-launched Missing environment guard Add if (env !== "production") check Webhook pointing to wrong env Stale webhook registration Re-run setupWebhooksForEnv() Staging data in production Cross-env contamination Use separate workspaces with separate API keys
Resources
Next Steps For observability and monitoring, see instantly-observability.