Aller au contenu
NouveauDécouvrir comment

Utiliser FirstSales en CI/CD & scripts

Exécutez la CLI FirstSales dans vos pipelines — secrets masqués, authentification fail-fast, dry-run sur les PR et apply sur main, étapes idempotentes et actions destructrices protégées.

  1. Privilégiez le CLI dans les pipelines

    Pour les jobs CI/CD et les scripts locaux, la documentation recommande le CLI plutôt que le HTTP brut : il centralise la gestion des identifiants, produit un JSON stable que vos étapes peuvent parser, et conserve les garde-fous sur les opérations destructrices dont vous avez besoin en automatisation. Un seul outil, un seul chemin d'authentification, une sortie cohérente.

  2. Injectez la clé comme secret masqué

    Stockez votre clé Developer API dans le gestionnaire de secrets de votre fournisseur CI (GitHub Actions secrets, variables GitLab CI, etc.) et exposez-la sous FIRSTSALES_API_KEY. Ne la codez jamais en dur dans le fichier de workflow. La plupart des systèmes CI masquent automatiquement les valeurs secrètes dans les logs : préservez cela en ne faisant jamais d'echo de la clé.

    # 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. Échouez rapidement en cas de mauvaise clé

    Démarrez chaque job avec whoami afin que le pipeline s'arrête immédiatement si la clé est incorrecte ou révoquée, plutôt que d'exécuter une synchronisation à moitié :

    firstsales whoami --json > /dev/null || {
      echo "FirstSales auth failed"; exit 1;
    }
  4. Planifiez avec --dry-run, puis appliquez

    En automatisation, vous voulez une prévisualisation avant d'écrire. Bloquez les mutations réelles derrière une étape de planification avec --dry-run (par exemple sur les pull requests), et n'appliquez que sur la branche principale :

    # 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. Rendez les étapes réessayables idempotentes

    Les étapes CI sont retentées : par des runners instables, par des humains qui relancent un job. Dérivez une --idempotency-key à partir de quelque chose de stable (un SHA de commit, un ID de ligne, un numéro de run) pour qu'une relance ne crée pas de doublon :

    firstsales contact-imports create --org "$ORG" --workspace "$WS" \
      --data-file ./import.json \
      --idempotency-key "import-${CI_PIPELINE_ID}"
  6. Protégez les étapes destructrices

    Les suppressions exigent --confirm, ce qui est exactement ce que vous voulez dans un pipeline : un job de nettoyage ne peut supprimer des données que si le flag est explicitement présent. Gardez --confirm hors de toute étape qui ne devrait pas supprimer, et parsez la sortie --json pour vérifier le résultat :

    firstsales connectors delete --org "$ORG" --workspace "$WS" \
      --connector "$STALE_ID" --confirm --json | jq -e '.deleted == true'
  7. Parsez le JSON, ne faites pas de scraping

    Toute la sortie est en JSON par défaut : passez-la à jq pour prendre des décisions, définir des outputs de job, ou conditionner des étapes suivantes. Ne faites jamais de scraping de l'interface de l'app ni d'appel aux endpoints privés depuis la CI ; si une commande renvoie unsupported_operation, faites échouer l'étape et remontez l'erreur plutôt que de la contourner.

Astuces de pro

  • whoami comme première étape du job

    Une vérification d'authentification d'une ligne en tête de job transforme une clé mauvaise/expirée en échec instantané et explicite plutôt qu'en résultat partiel et confus.

  • Dérivez les clés d'idempotence des variables CI

    SHA de commit, ID de pipeline, numéro de run : toute valeur stable propre à chaque run rend une étape retentée sûre et sans effet de bord. N'utilisez jamais un horodatage ou une valeur aléatoire : cela va à l'encontre de l'objectif.

  • Deux phases : dry-run sur les PR, apply sur main

    Reproduisez le modèle infra-as-code. --dry-run sur les pull requests montre le diff pour revue ; l'écriture réelle ne s'exécute qu'après le merge. Une protection peu coûteuse pour des actions irréversibles.

  • Vérifiez la sortie JSON par assertion

    Passez --json à jq -e afin que l'étape échoue réellement quand le résultat n'est pas celui attendu, plutôt que de sortir en code 0 sur une erreur silencieuse.

Questions fréquentes

La CI doit-elle utiliser le CLI ou l'API ?

Le CLI. Pour la CI/CD et les scripts, il est recommandé au HTTP brut car il standardise la gestion des identifiants et de la sortie, et conserve les garde-fous intégrés sur les opérations destructrices.

Comment gérer la clé API en CI ?

Placez-la dans le gestionnaire de secrets de votre fournisseur CI et exposez-la sous FIRSTSALES_API_KEY. Ne la codez pas en dur dans le workflow, et ne faites jamais d'echo dessus : la plupart des systèmes CI ne masquent les secrets dans les logs que si vous ne les affichez pas vous-même.

Comment prévisualiser un changement avant qu'il ne s'exécute ?

Utilisez --dry-run pour afficher la requête sans l'envoyer. Un pattern courant est un dry-run sur les pull requests et l'écriture réelle uniquement sur la branche principale.

Comment rendre une étape sûre à relancer ?

Passez --idempotency-key dérivée d'une valeur stable comme le SHA de commit ou l'ID de pipeline. Une étape retentée avec la même clé devient un no-op plutôt qu'une écriture en double.

Comment empêcher un job de nettoyage de trop supprimer ?

Les suppressions exigent --confirm, si bien qu'une étape ne peut supprimer des données que si le flag est explicitement présent. Ne l'ajoutez pas aux étapes non destructrices, et vérifiez le résultat --json avec jq -e.

Puis-je prendre des décisions à partir de la sortie ?

Oui : la sortie est en JSON par défaut. Passez-la à jq pour conditionner des étapes suivantes ou définir des outputs de job. Ne faites pas de scraping de l'interface ; sur unsupported_operation, faites échouer l'étape et signalez-le.

Développeur & CLI

Une prospection qui continue quand vous vous déconnectez.Leads, emails, relances et réponses, gérés.

Connectez des boîtes illimitées et laissez les agents IA trouver les leads, écrire chaque email et relancer. Ou envoyez vos propres modèles en mode manuel. À partir de $29/mois.

$1 pour 3 jours · Annulez quand vous voulez · Sans engagement

Installer avec l'IA

Votre agent de code installe la CLI et les skills FirstSales pour vous.

Prompt pour 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.