Pular para o conteúdo
NovoVeja como

Usando o FirstSales em CI/CD e Scripts

Execute a CLI do FirstSales em pipelines — segredos mascarados, autenticação fail-fast, dry-run em PRs e apply na main, etapas idempotentes e ações destrutivas protegidas.

  1. Prefira a CLI em pipelines

    Para jobs de CI/CD e scripts locais, a documentação recomenda a CLI em vez de HTTP puro: ela centraliza o gerenciamento de credenciais, emite JSON estável que suas etapas conseguem parsear, e mantém as proteções contra operações destrutivas que você quer em automação. Uma ferramenta, um caminho de autenticação, saída consistente.

  2. Injete a chave como um secret mascarado

    Guarde sua chave de API de desenvolvedor no cofre de secrets do seu provedor de CI (GitHub Actions secrets, variáveis do GitLab CI, etc.) e exponha-a como FIRSTSALES_API_KEY. Nunca fixe (hardcode) a chave no arquivo de workflow. A maioria dos sistemas de CI mascara valores secretos nos logs automaticamente: mantenha assim nunca dando echo na chave.

    # Etapa de job do GitHub Actions
    - name: FirstSales sync
      env:
        FIRSTSALES_API_KEY: ${{ secrets.FIRSTSALES_API_KEY }}
      run: |
        npm install -g @firstsales.io/cli
        firstsales whoami --json
  3. Falhe rápido em uma chave ruim

    Comece todo job com whoami para que o pipeline pare imediatamente se a chave estiver errada ou revogada, em vez de rodar uma sincronização pela metade:

    firstsales whoami --json > /dev/null || {
      echo "FirstSales auth failed"; exit 1;
    }
  4. Planeje com --dry-run, depois aplique

    Em automação você quer uma prévia antes de escrever. Coloque as mutações reais atrás de uma etapa de plano usando --dry-run (por exemplo, em pull requests), e só aplique na branch principal:

    # PR / plano: apenas pré-visualização
    firstsales contacts create --org "$ORG" --workspace "$WS" \
      --data-file ./new-lead.json --dry-run
    
    # main / aplicar: escrita real, idempotente
    firstsales contacts create --org "$ORG" --workspace "$WS" \
      --data-file ./new-lead.json \
      --idempotency-key "lead-${GITHUB_SHA}"
  5. Torne etapas retentáveis idempotentes

    Etapas de CI são reexecutadas: por runners instáveis, por humanos re-rodando um job. Derive um --idempotency-key de algo estável (um commit SHA, um ID de linha, um número de execução) para que uma reexecução não crie tudo em dobro:

    firstsales contact-imports create --org "$ORG" --workspace "$WS" \
      --data-file ./import.json \
      --idempotency-key "import-${CI_PIPELINE_ID}"
  6. Proteja etapas destrutivas

    Exclusões exigem --confirm, que é exatamente o que você quer em um pipeline: um job de limpeza só pode remover dados quando a flag está explicitamente presente. Mantenha --confirm fora de qualquer etapa que não deveria excluir, e faça parse da saída --json para validar o resultado:

    firstsales connectors delete --org "$ORG" --workspace "$WS" \
      --connector "$STALE_ID" --confirm --json | jq -e '.deleted == true'
  7. Faça parse do JSON, não faça scraping

    Toda a saída é JSON por padrão: encaminhe para jq para tomar decisões, definir outputs do job ou controlar etapas seguintes. Nunca raspe a interface do app ou acesse endpoints privados a partir do CI; se um comando retornar unsupported_operation, falhe a etapa e reporte o problema em vez de contorná-lo.

Dicas de especialista

  • whoami como a primeira etapa do job

    Uma verificação de autenticação de uma linha no topo do job transforma uma chave ruim/expirada em uma falha instantânea e óbvia, em vez de uma execução parcial e confusa.

  • Derive chaves de idempotência de variáveis de CI

    Commit SHA, ID do pipeline, número da execução: qualquer valor estável por execução torna uma etapa repetida um no-op seguro. Nunca use um timestamp ou valor aleatório; eles anulam o propósito.

  • Duas fases: dry-run em PRs, apply na main

    Espelha infraestrutura como código. --dry-run em pull requests mostra o diff para revisão; a escrita real só roda depois do merge. Segurança barata para ações irreversíveis.

  • Valide a saída JSON

    Encaminhe --json para jq -e para que a etapa realmente falhe quando o resultado não é o esperado, em vez de sair com código 0 num erro silencioso.

Perguntas frequentes

O CI deve usar a CLI ou a API?

A CLI. Para CI/CD e scripts, ela é recomendada em vez de HTTP puro porque padroniza o gerenciamento de credenciais e a saída, e mantém as proteções contra operações destrutivas já embutidas.

Como lido com a chave de API no CI?

Coloque-a no cofre de secrets do seu provedor de CI e exponha-a como FIRSTSALES_API_KEY. Não a fixe (hardcode) no workflow, e nunca dê echo nela: a maioria dos sistemas de CI só mascara secrets nos logs se você não os imprimir você mesmo.

Como pré-visualizo uma mudança antes de ela rodar?

Use --dry-run para imprimir a requisição sem enviá-la. Um padrão comum é dry-run em pull requests e a escrita real só na branch principal.

Como torno uma etapa segura para reexecução?

Passe --idempotency-key derivada de um valor estável, como o commit SHA ou o ID do pipeline. Uma etapa reexecutada com a mesma chave vira um no-op em vez de uma escrita duplicada.

Como evito que um job de limpeza exclua demais?

Exclusões exigem --confirm, então uma etapa só consegue remover dados quando a flag está explicitamente presente. Mantenha-a fora de etapas não destrutivas, e valide o resultado --json com jq -e.

Posso tomar decisões a partir da saída?

Sim: a saída é JSON por padrão. Encaminhe para jq para controlar etapas seguintes ou definir outputs do job. Não raspe a interface do app; em unsupported_operation, falhe a etapa e reporte.

Desenvolvedor e CLI

Prospecção que continua quando você desconecta.Leads, emails, follow-ups e respostas, resolvidos.

Conecte caixas ilimitadas e deixe os agentes de IA encontrarem leads, escreverem cada email e fazerem follow-up. Ou envie seus próprios modelos no modo manual. A partir de $29/mês.

$1 por 3 dias · Cancele quando quiser · Sem contrato

Instalar com IA

Seu agente de código configura a CLI e as skills do FirstSales para você.

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.