Saltar al contenido
NuevoVer cómo

Usar FirstSales en CI/CD y scripts

Ejecuta la CLI de FirstSales en pipelines — secretos enmascarados, autenticación fail-fast, dry-run en PRs y apply en main, pasos idempotentes, y acciones destructivas protegidas.

  1. Prioriza la CLI en los pipelines

    Para trabajos de CI/CD y scripts locales, la documentación recomienda la CLI por encima de HTTP en crudo: centraliza el manejo de credenciales, emite JSON estable que tus pasos pueden analizar, y mantiene las salvaguardas de operaciones destructivas que quieres en la automatización. Una sola herramienta, un solo camino de autenticación, salida consistente.

  2. Inyecta la clave como secreto enmascarado

    Guarda tu Developer API key en el almacén de secretos de tu proveedor de CI (GitHub Actions secrets, GitLab CI variables, etc.) y expónla como FIRSTSALES_API_KEY. Nunca la codifiques directamente en el archivo de workflow. La mayoría de los sistemas de CI enmascaran los valores secretos en los logs automáticamente: mantenlo así no haciendo nunca echo de la clave.

    # GitHub Actions job step
    - name: FirstSales sync
      env:
        FIRSTSALES_API_KEY: ${{ secrets.FIRSTSALES_API_KEY }}
      run: |
        npm install -g @firstsales.io/cli
        firstsales whoami --json
  3. Falla rápido ante una clave incorrecta

    Empieza cada trabajo con whoami para que el pipeline se detenga de inmediato si la clave es incorrecta o fue revocada, en lugar de ejecutar una sincronización a medias:

    firstsales whoami --json > /dev/null || {
      echo "FirstSales auth failed"; exit 1;
    }
  4. Planifica con --dry-run, luego aplica

    En automatización quieres una vista previa antes de escribir. Condiciona las mutaciones reales a un paso de plan usando --dry-run (por ejemplo, en pull requests), y solo aplica en la rama principal:

    # PR / plan: preview only
    firstsales contacts create --org "$ORG" --workspace "$WS" \
      --data-file ./new-lead.json --dry-run
    
    # main / apply: real write, idempotent
    firstsales contacts create --org "$ORG" --workspace "$WS" \
      --data-file ./new-lead.json \
      --idempotency-key "lead-${GITHUB_SHA}"
  5. Haz que los pasos reintentables sean idempotentes

    Los pasos de CI se reintentan: por runners inestables, por humanos que vuelven a ejecutar un trabajo. Deriva una --idempotency-key de algo estable (un commit SHA, un ID de fila, un número de ejecución) para que una reejecución no cree duplicados:

    firstsales contact-imports create --org "$ORG" --workspace "$WS" \
      --data-file ./import.json \
      --idempotency-key "import-${CI_PIPELINE_ID}"
  6. Protege los pasos destructivos

    Los deletes requieren --confirm, que es exactamente lo que quieres en un pipeline: un trabajo de limpieza solo puede eliminar datos cuando la flag está explícitamente presente. Mantén --confirm fuera de cualquier paso que no deba eliminar, y analiza la salida --json para verificar el resultado:

    firstsales connectors delete --org "$ORG" --workspace "$WS" \
      --connector "$STALE_ID" --confirm --json | jq -e '.deleted == true'
  7. Analiza JSON, no hagas scraping

    Toda la salida es JSON por defecto: pásala por jq para tomar decisiones, establecer outputs del job, o condicionar pasos posteriores. Nunca hagas scraping de la interfaz de la app ni llames a endpoints privados desde CI; si un comando devuelve unsupported_operation, haz que el paso falle y repórtalo en lugar de buscar una alternativa.

Consejos de experto

  • whoami como el primer paso del job

    Una verificación de autenticación de una línea al principio del job convierte una clave mala o expirada en un fallo instantáneo y obvio en lugar de uno parcial y confuso.

  • Deriva las idempotency keys de variables de CI

    Commit SHA, pipeline ID, número de ejecución: cualquier valor estable por ejecución convierte un paso reintentado en un no-op seguro. Nunca uses un timestamp o un valor aleatorio; eso anula el propósito.

  • Dos fases: dry-run en PRs, apply en main

    Refleja infraestructura como código. --dry-run en pull requests muestra el diff para revisión; la escritura real solo se ejecuta después del merge. Seguridad barata para acciones irreversibles.

  • Verifica sobre la salida JSON

    Pasa --json por jq -e para que el paso realmente falle cuando el resultado no es el esperado, en lugar de salir con código 0 ante un error silencioso.

Preguntas frecuentes

¿Debería CI usar la CLI o la API?

La CLI. Para CI/CD y scripts se recomienda por encima de HTTP en crudo porque estandariza el manejo de credenciales y la salida, y mantiene incorporadas las salvaguardas de operaciones destructivas.

¿Cómo manejo la clave de la API en CI?

Colócala en el almacén de secretos de tu proveedor de CI y expónla como FIRSTSALES_API_KEY. No la codifiques directamente en el workflow, y nunca hagas echo de ella: la mayoría de los sistemas de CI enmascaran los secretos en los logs solo si tú no los imprimes.

¿Cómo previsualizo un cambio antes de que se ejecute?

Usa --dry-run para imprimir la solicitud sin enviarla. Un patrón común es dry-run en pull requests y la escritura real solo en la rama principal.

¿Cómo hago que un paso sea seguro de reintentar?

Pasa --idempotency-key derivada de un valor estable como el commit SHA o el pipeline ID. Un paso reintentado con la misma clave es un no-op en lugar de una escritura duplicada.

¿Cómo evito que un job de limpieza elimine de más?

Los deletes requieren --confirm, así que un paso solo puede eliminar datos cuando la flag está explícitamente presente. Mantenla fuera de los pasos no destructivos, y verifica el resultado de --json con jq -e.

¿Puedo tomar decisiones a partir de la salida?

Sí: la salida es JSON por defecto. Pásala por jq para condicionar pasos posteriores o establecer outputs del job. No hagas scraping de la interfaz; ante unsupported_operation, haz que el paso falle y repórtalo.

Desarrollador y CLI

Prospección que sigue cuando te desconectas.Leads, emails, seguimientos y respuestas, resueltos.

Conecta buzones ilimitados y deja que los agentes de IA busquen leads, escriban cada email y hagan seguimiento. O envía tus propias plantillas en modo manual. Desde $29/mes.

$1 por 3 días · Cancela cuando quieras · Sin contrato

Instalar con IA

Tu agente de código configura la CLI y las skills de FirstSales por ti.

Prompt para Claude Code

I'm setting up FirstSales (https://firstsales.io), an AI outbound sales platform: campaigns, contacts, a reply inbox, deliverability and lead signals. Help me get my workspace sending real, good emails end to end, from Claude Code.

Read these first so you know how FirstSales works:
- Developer docs and API: https://developer.firstsales.io
- CLI: https://www.npmjs.com/package/@firstsales.io/cli
- Skills for coding agents: https://github.com/firstsalesio/firstsales-skills (read README.md and GUIDE.md)

Setup
1. Install the CLI: npm install -g @firstsales.io/cli
2. Install the FirstSales skills:
   claude plugin marketplace add firstsalesio/firstsales-skills
   claude plugin install firstsales@firstsales
3. Ask me if I already have a FirstSales account. If not, send me to https://app.firstsales.io to sign up.
4. Ask me to create an API key under Settings → API → API Keys, with only the scopes we need.
   Never ask me to paste the key into this chat. Tell me to run this in my own terminal, so the key stays hidden:
   read -rs FS_KEY && firstsales auth login --api-key "$FS_KEY"; unset FS_KEY
5. Run `firstsales whoami` and tell me which workspace and organisation we are connected to.

Then ask me about my business: what I sell, who I sell to (roles, company size, countries), my best customers, and what I use today for outbound (tools, lists, mailboxes). Walk me through:
1. Teaching FirstSales my business: website, offer, proof points and case studies in the knowledge base, so the AI writes like someone who knows the product.
2. Connecting my sending mailboxes and checking my sending domain: SPF, DKIM, DMARC and warm-up. If anything is unhealthy, tell me the exact DNS record to add.
3. Bringing in contacts: import my CSV or CRM export into a clean list, remove duplicates and bad emails, and block domains I must never email (customers, competitors, my own).
4. Building my first campaign: the right list, senders, steps and timing. Write the sequence with me, show me the drafts, and do not launch until I say yes.
5. Setting up Signals if it fits: find people engaging with LinkedIn posts about topics my buyers care about, and turn them into leads.
6. Inviting my team and giving each person the right access.

Once campaigns run, show me how to work the reply inbox from here: which replies need an answer, draft responses in my voice, and move good conversations into deals. If I use Cal.com, connect it so follow-ups can offer my booking link (not the first email).

Throughout, as you learn about my business, proactively suggest and help create:
- Reply templates for the questions and objections my prospects are likely to raise, based on my product, site and codebase if you can see them.
- Campaign ideas and segments worth testing, with the reason for each.

Safety rules:
- Show every change as a dry run (--dry-run) first and wait for my yes. Never send emails, launch campaigns or delete anything without my yes.
- Tell me before anything that spends credits, and how many.

Be opinionated. If the docs give a sensible default, just use it. Don't make me choose between five options.