Créer une pub avec l'IA sans texte déformé : brief JSON, rendu local en 1:1, 4:5 et 9:16, relecture mot à mot, import Meta en pause. Commandes et seuils.
Couverture swanbase du tuto : créer une pub avec l'IA pour votre SaaS, avec les logos Meta et Claude

Pour créer une pub avec l'IA sans texte déformé, confiez à l'IA la stratégie et la rédaction, et laissez le texte de l'image à du code. Vous choisissez un angle par publicité, écrivez le brief de chaque pub dans un fichier JSON, rendez ce fichier en HTML sur votre machine aux formats 1:1, 4:5 et 9:16, faites relire chaque mot affiché par un relecteur extérieur au brief, puis importez le tout dans Meta Ads Manager avec des publicités en pause.

Le rendu local coûte 0 $. Le 12 octobre 2026, notre exemple public de trois pubs déclinées en trois formats a donné 9 visuels en 12,4 secondes, 0 erreur de contrôle et 9 relectures sur 9 sans faute. Un modèle d'image n'intervient que pour un fond photographique sans texte, après deux validations humaines.

Ce tuto suit l'agent open source static-ads-builder du stack fog, que vous lancez dans Claude Code. Commandes et seuils viennent de nos runs.

Les cinq étapes pour créer une pub avec l'IA, précédées de la lecture des résultats : angle, brief JSON, rendu 1:1, 4:5 et 9:16, relecture, import Meta en pause

Créer une pub avec l'IA : qui fait quoi

La plupart des générateurs de publicité IA demandent à un modèle d'image de produire le visuel entier, texte compris. Sur une pub, c'est la première source de fautes.

Le texte ne passe jamais par le modèle d'image

Un modèle d'image dessine les lettres comme une texture et les approxime. Sur un lot rendu ainsi, un visuel est sorti avec « DÉLICESSE » à la place de « DÉLICATESSE ». Le contrôle de l'époque ne relisait pas le texte dessiné sur le produit : la faute est passée.

D'où la règle centrale. Claude écrit une spec, le fichier ads.json. Vos scripts rendent cette spec en HTML et CSS dans Chromium, puis mesurent le résultat. Titres, chiffres et boutons sortent exactement comme vous les avez écrits, accents compris.

Tâche Qui la fait
Lire les résultats, choisir les angles, rédiger la copie L'IA (Claude Code)
Mettre en page, dimensionner le texte, exporter les PNG Scripts locaux (HTML, Playwright)
Vérifier débordements, zones sûres, contraste Scripts locaux
Relire chaque mot affiché Un relecteur extérieur au brief
Fond photo sans texte, faute de photo réelle Modèle d'image, après deux validations
Activer les pubs Vous

Comparatif sur une marque fictive : texte dessiné par un modèle d'image avec fautes, contre texte rendu en HTML identique au brief

Le coût d'un lot

Le rendu local tourne avec Python, Pillow et Playwright pour Python sur Chromium, sans frais. Vous payez seulement l'abonnement de votre assistant de code. Un fond généré coûte, selon le barème du script au 12 octobre 2026, entre 0,05 $ et 0,21 $ l'image en 1K suivant le modèle et la qualité. Sur un SaaS, la plupart des lots se passent de fond généré : l'interface et le logo suffisent.

Avant de créer : lire les résultats du mois dernier

Des visuels neufs ne règlent qu'un problème : les gens ne cliquent pas. Quand ils cliquent sans s'inscrire, de nouvelles pubs brûlent le budget plus vite.

Exporter les résultats au niveau de la pub

Dans Ads Manager, exportez en CSV un rapport ventilé par publicité (dépense, impressions, clics sur un lien, vues de la page de destination, conversion optimisée), pour la période écoulée et la précédente. Puis lancez :

python3 scripts/perf.py exports/meta-2026-10.csv \
  --previous exports/meta-2026-09.csv \
  --target-cpa 20 \
  --out ads-performance-20261012.json --md ads-performance-20261012.md

Sans CPA cible, le script retient le CPA médian du compte et le signale dans le rapport.

Problème créatif ou problème après le clic

La comparaison des deux périodes donne un diagnostic de compte :

  • Après le clic : le taux de clic tient (variation supérieure à -15 %) mais le taux de conversion chute. Travaillez la page, l'offre, le formulaire d'inscription ou le reciblage des cliqueurs.
  • Créatif : le taux de clic baisse de plus de 15 %. Les visuels s'usent, un nouveau lot se justifie.
  • Enchères : le CPM monte de plus de 25 % à taux de clic et conversion stables. Les visuels ne sont pas le levier.

Sous 15 conversions sur la période, chaque classement reste un indice.

Nous avons vécu ce piège fin septembre 2026 sur un compte publicitaire que nous suivons : le taux de clic tenait pendant que la part des clics finis en achat reculait de près de moitié en une semaine. Le diagnostic est sorti avant les visuels, et les corrections ont d'abord porté sur le site.

Capture de la sortie de perf.py sur un compte fictif : diagnostic après le clic, pubs gagnantes et perdantes selon le CPA cible

Étape 1 : choisir un angle par publicité

Meta trouve l'audience à partir du visuel lui-même : dix variantes d'une même idée touchent le même public, dix angles différents en touchent dix.

Les 20 angles, rangés par étape du funnel

La bibliothèque de l'agent nomme 20 angles : 8 pour la découverte (l'anti-catégorie, le chiffre d'origine, la confession…), 6 pour la considération (le process révélé, le sceptique désarmé, la comparaison sans concurrent…) et 6 pour la conversion (le premier pas facile, le coût recadré, la garantie en titre…).

Deux règles tiennent le lot :

  1. Un angle par concept, jamais deux fois dans le même lot.
  2. Un même style visuel au plus deux fois sur six concepts.

Le lot par défaut compte 6 concepts, 15 au maximum. Chaque ligne du plan indique l'étape, l'angle, le style, les formats, le matériau réel et si le concept prolonge un gagnant.

Le test de surprise

Avant toute copie, l'agent soumet le lot à une question : si quelqu'un qui a vu 1 000 pubs de votre catégorie faisait défiler ces concepts, combien le feraient s'arrêter. Moins d'un tiers, et le lot est trop sage : les concepts les plus convenus repartent en réécriture.

Pour un SaaS, montrer l'interface

Un SaaS a une interface et un logo à montrer. Au moins la moitié des concepts d'un lot SaaS affichent la capture réelle de l'interface, presque tous portent le logo. Une pub SaaS sans interface ni logo passe pour celle d'un concurrent.

Étape 2 : écrire le brief de chaque pub en JSON

Tout part du fichier ads.json : chaque mot de chaque visuel, chaque ligne du fichier d'import et chaque nom dans l'export du mois suivant en sortent. Le HTML se reconstruit depuis lui, vous ne le retouchez jamais.

Les champs du fichier

Chaque pub porte un identifiant, une étape (tofu, mofu, bofu), un angle, un style, ses formats, la copie (titre, sous-titre ou puces, bouton), ses preuves, ses médias réels et le texte Meta. Extrait de notre exemple public :

{
  "id": "deck-reading-time", "n": 1,
  "stage": "tofu", "angle": "origin-number", "style": "bold-statement",
  "formats": ["1:1", "4:5", "9:16"],
  "copy": {
    "headline": "A VC gives your seed deck *3 min 44 s*.",
    "cta": "Read the 14-slide guide"
  },
  "claims": [{ "text": "A VC spends 3 min 44 s on a seed deck, on average",
               "source": "docsend", "verified_at": "2026-10-10" }],
  "meta_ad": { "headline": "The 14-slide deck guide", "cta": "LEARN_MORE",
               "ad_set": "tofu-founders-broad" }
}

L'astérisque marque le seul groupe de mots que le style passe en couleur d'accent. Le bouton du visuel tient en 1 à 4 mots. Le type de bouton Meta va dans meta_ad.cta : LEARN_MORE en découverte, jamais SHOP_NOW à ce stade.

Capture d'un extrait du fichier ads.json de l'exemple public swanbase : angle, formats, copie, source du chiffre et texte Meta

Une source par chiffre

Tout nombre affiché doit figurer dans un claims[] relié à une source avec URL, ou à une preuve déclarée dans le contexte du projet. Sinon, le script de construction refuse le fichier avec l'erreur unsourced-number. Pour une photo réelle, le champ visible_text liste chaque mot imprimé dessus (t-shirt, écran, panneau) : la relecture attendra exactement ces mots.

python3 scripts/build.py campagne-20261012/ads.json

Relancez jusqu'à zéro erreur ; chaque erreur donne son chemin JSON.

Écrire la copie en français

La règle de la bibliothèque : pensez en français, écrivez une phrase. Un titre français porte un verbe et un point de vue. Les fragments séparés par des points (« Simple. Rapide. Puissant. ») sonnent comme un slogan anglais traduit. Gardez tous les accents, majuscules comprises : un accent perdu dans le JSON s'imprime tel quel sur la pub.

Étape 3 : rendre la pub en 1:1, 4:5 et 9:16

Installer et lancer le rendu

Installez une fois les dépendances, puis lancez une commande par lot :

pip install -r scripts/requirements.txt
playwright install chromium

python3 scripts/pipeline.py campagne-20261012/ads.json --package

Vous obtenez des PNG et JPEG exacts en 1080x1080, 1080x1350 et 1080x1920, un fichier qa.json et une planche contact. Avec --width 1440, vous passez à la largeur que le guide des formats de Meta pour le fil recommande pour le 4:5.

Capture du terminal : 9 rendus en 12,4 secondes, contrôle qualité sans erreur, relecture 9 sur 9 et fichier d'import Meta en statut PAUSED

La zone sûre du 9:16

En Reels et en Stories, l'interface d'Instagram recouvre le haut et le bas de l'écran. Le guide Meta pour les publicités Reels demande de laisser environ 14 % en haut, 35 % en bas et 6 % sur chaque côté sans texte, logo ni élément clé. Sur un canevas de 1080 px de large, notre script en tire 269 px en haut, 672 px en bas et 72 px sur les côtés. En fil, 72 px de marge partout.

Un 4:5 étiré en 9:16 laisse un grand vide. Sur nos rendus, la photo ou un panneau de couleur traverse la bande du bas, et le bouton se place juste au-dessus.

La même pub rendue en 1:1, 4:5 et 9:16, avec la zone sûre des Reels hachurée : 14 % en haut et 35 % en bas

Les contrôles automatiques

qa.json liste, pour chaque rendu, les erreurs bloquantes :

  • texte trop long ou qui déborde de son bloc ;
  • texte hors zone sûre ;
  • texte sous 28 px (22 px pour une source ou une étiquette) ;
  • contraste sous les seuils WCAG ;
  • marques de design généré : ombre floue autour du texte, flou d'arrière-plan, texte en dégradé.

Corrigez dans ads.json (copie plus courte, autre style, format plus haut), jamais dans le HTML ni dans le PNG. Relisez ensuite la planche contact à taille de fil : l'accroche se lit en premier, le bouton en dernier, et les trois formats d'un concept ressemblent à une seule pub. Comptez trois tours de revue au plus ; un défaut restant part au rapport.

Quand faut-il générer une image avec l'IA ?

Rarement, sur un SaaS : une capture d'écran ou une photo de l'équipe font presque toujours l'affaire.

Un fond sans texte, sans logo, sans produit

Le modèle d'image produit seulement un fond photographique, que l'agent appelle « plate ». Le prompt se termine toujours par la même exclusion : aucun texte, aucune lettre, aucun logo, aucun produit. Le HTML pose ensuite tout le reste par-dessus.

Deux validations avant de payer

python3 scripts/plates.py prepare campagne-20261012/ads.json
python3 scripts/render_ads.py --estimate --provider fal --count 2 \
  --model fal-ai/nano-banana-2 --resolution 1K

À la première validation, vous choisissez quels fonds générer, en face de l'alternative avec un média réel. À la seconde, vous confirmez le modèle et le montant total en une réponse explicite ; le « oui » de la première ne vaut pas pour la seconde. Chaque fond a droit à une tentative : un nouvel essai est une nouvelle dépense et repasse par la seconde validation. L'option --provider manual écrit les prompts pour votre propre outil, à 0 $.

Étape 4 : relire chaque mot de chaque visuel

Le contrôle du HTML ignore ce que montrent les pixels : un glyphe absent de la police, un mot caché par une forme, une étiquette sur une photo.

Un relecteur qui n'a jamais vu ads.json ouvre chaque PNG en taille réelle et recopie tous les mots visibles, logo compris. Dans Claude Code, un sous-agent neuf fait l'affaire ; un second modèle ou vous-même aussi. Le relecteur signale un mot illisible (unreadable: true) au lieu de le deviner. Puis :

python3 scripts/proofread.py check campagne-20261012/html \
  campagne-20261012/proofread/transcript.json

La comparaison garde casse et accents et ignore l'ordre des mots. Chaque rendu reçoit un verdict : TEXT_OK, TEXT_MISMATCH (mot faux, manquant ou en trop), ASSET_TEXT_MISMATCH (mot d'une photo différent du réel), TEXT_UNREADABLE ou NOT_PROOFREAD. Tout verdict autre que TEXT_OK bloque la livraison.

Étape 5 : importer les pubs dans Meta, en pause

Le fichier d'import

package_meta.py écrit un CSV d'import en masse pour Ads Manager, une ligne par pub et par format, chaque pub en statut PAUSED. Les liens UTM portent le nom de la pub dans utm_content.

Les noms suivent le format <projet>_<NN>_<étape>_<angle>_<style>_<ratio>, par exemple swanbase_01_tofu_origin-number_bold-statement_4x5. Grâce à eux, l'export du mois suivant se relie aux angles testés.

Une alerte sort quand le texte principal quitte la plage de 50 à 150 caractères ou quand le titre dépasse 27 caractères. Avant le premier import, exportez un modèle vierge depuis Ads Manager pour aligner les en-têtes : Meta renomme ses colonnes au fil du temps.

Comparer chaque pub à sa page

Avant d'importer, mettez chaque promesse face à la page de destination : prix, offre, durée d'essai, dates. Corrigez toute contradiction avant l'import, dans la pub ou sur la page. Pour aller plus loin sur la page, suivez notre audit de landing page SaaS avec Claude. Ensuite seulement, activez les pubs.

Comment reconnaître une pub gagnante ?

Le mois suivant, perf.py applique des règles écrites à l'avance :

  • Gagnante : 3 conversions ou plus, à un CPA inférieur ou égal au CPA cible.
  • Perdante : aucune conversion après deux CPA cibles dépensés, ou un CPA d'au moins 1,5 fois la cible après trois CPA cibles dépensés.
  • Non conclusive : entre les deux. Sous un CPA cible dépensé, la pub reste hors jugement.

Le lot suivant consacre 60 % des concepts aux gagnants (même angle, nouvelle exécution : autre style, autre format, accroche plus nette) et 40 % à des angles jamais testés. Les couples angle et style perdants sortent du plan.

Règles pour classer une pub gagnante, perdante ou non conclusive selon le CPA cible et la dépense

Pour lire les chiffres du compte directement dans Claude, branchez le connecteur Meta Ads MCP à la place de l'export CSV.

Générateur de publicité IA ou méthode locale : que choisir ?

Les générateurs en ligne conviennent pour tester une idée isolée en quelques clics. Pour un fondateur SaaS qui suit ses lots mois après mois, la méthode locale apporte un texte exact, une preuve pour chaque chiffre, des noms de pubs qui relient l'export aux angles, et un rendu gratuit.

Elle demande en échange un environnement Python et Claude Code (ou Cursor, Codex CLI, Gemini CLI). Pour situer cet agent parmi les autres outils, voyez notre sélection d'outils IA pour startup et le fonctionnement du stack fog d'agents IA marketing. L'agent static-ads-builder est open source sous licence Apache 2.0, sur fog-agents.com.

FAQ

Peut-on créer une pub avec l'IA gratuitement ?

Oui pour le rendu : la mise en page HTML, l'export en PNG avec Playwright et les contrôles tournent sur votre machine à 0 $. Seul l'abonnement à votre assistant IA reste payant. Un fond photo généré coûte de 0,05 $ à 0,21 $ en 1K selon le modèle, et l'option manuelle vous laisse le produire dans votre propre outil.

Combien de publicités produire par lot ?

Six concepts par défaut, quinze au maximum, chacun décliné dans ses formats. Chaque concept porte un angle différent : un petit lot varié touche plus de publics qu'un grand lot de variantes d'une même idée.

Pourquoi ne pas laisser l'IA écrire le texte dans l'image ?

Un modèle d'image approxime les lettres (« DÉLICESSE » pour « DÉLICATESSE » sur l'un de nos lots). En HTML, le texte affiché reprend la spec, accents compris, et une relecture mot à mot le vérifie.

Quels formats d'image pour une pub Meta ?

Le 1:1 (1080x1080) et le 4:5 (1080x1350, ou 1440x1800 selon le guide de Meta) pour le fil, le 9:16 (1080x1920) pour les Stories et les Reels. En 9:16, gardez environ 14 % du haut, 35 % du bas et 6 % des côtés libres de texte.

Quand une publicité est-elle gagnante ?

Quand elle obtient au moins 3 conversions à un CPA inférieur ou égal à votre CPA cible. Sous 15 conversions sur la période, traitez tout classement comme un indice.

Faut-il de nouvelles pubs quand les inscriptions baissent ?

Seulement si le taux de clic baisse aussi. Si les clics tiennent et que les conversions chutent, le problème se situe après le clic : page, offre, formulaire. De nouveaux visuels n'y changeront rien.