ADRADR-0015 · Deux audiences, un seul jeu de conditions

ADR-0015 — Les deux programmes qui paient sont deux audiences sur un seul jeu de conditions

Moitie PAYANTE de billing/0369. La moitie agence est tranchee separement par l'ADR 0014, 0014-le-programme-partenaire-echange-de-la-distribution-pas-une-commission.md, qui arrive avec la PR #1137 (pas encore sur main…

Statut

Remplacé par ADR-0041 · 2026-09-12

Piliers : billing, growth-web

Titre court d’origine : Deux audiences, un seul jeu de conditions

Moitie PAYANTE de billing/0369. La moitie agence est tranchee separement par l'ADR 0014, 0014-le-programme-partenaire-echange-de-la-distribution-pas-une-commission.md, qui arrive avec la PR #1137 (pas encore sur main, donc cite ici sans lien) : le programme partenaire ne verse aucune commission. Les deux ADR se repondent, ils ne se contredisent pas — c'est justement parce que le partenaire ne touche rien qu'il ne reste que deux portes a aligner ici.

Contexte

Trois pages publiques indexees vendaient trois jeux de conditions pour un seul ledger. Ce que le code fait, et lui seul (src/config/affiliate.ts, affiliate-commission.ts) :

  • 30 % du net de taxe, plafond dur (Math.min(asked, 30) dans commissionForInvoice) ;
  • 12 factures payees, jamais des mois calendaires, et accrueCommissionForInvoice s'arrete la pour toute redemption : il n'existe aucun champ qui distinguerait un affilie d'un parrain ;
  • un code par affilie (AffiliateCode.code @unique) ;
  • AffiliateRedemption enregistre une redemption, jamais un clic.

Ce que /network/affiliate vendait a cote de ça : 20 % a vie, des liens par asset, un dashboard de clics et de conversions, une bibliotheque d'assets, et une revue manuelle « en cinq jours ouvres ». Aucun de ces cinq elements n'a de chemin de code, et la revue ne gardait rien : ensureReferralCode mint un code au premier affichage de la page, pour tout compte y compris Free.

/network/referral etait la plus juste des trois et publiait quand meme trois affirmations fausses — « no clawback after month one » (une reprise suit la facture sans mois butoir), « 38 pays », « formulaires 1099-NEC emis automatiquement » (1099 n'apparait nulle part dans le depot) — tout en taisant deux faits materiels : un versement exige un compte Stripe Connect active, et chaque commission attend 30 jours.

src/test/affiliate-terms-match-the-ledger.test.ts tenait ces chaines en quarantaine dans PENDING_OWNER_DECISION. La dette etait comptee ; elle ne pouvait pas se solder sans une reponse commerciale, et aucun agent n'avait le droit de la donner.

Décision

Deux audiences, un seul jeu de conditions. /network/referral et /network/affiliate restent — ce sont deux funnels deja construits et indexes — et publient les memes conditions, derivees de config/affiliate.ts : 30 %, 12 factures payees, 60 jours d'attribution, 30 jours de retention.

Ce qui les differencie n'est plus l'argent mais le public et la porte d'entree : l'affiliation est ecrite pour une audience existante et n'a aucune candidature ; le parrainage pour l'intro en direct. L'outillage qui compte a l'echelle d'un createur — le detail par filleul — reste gate par le plan (admitsAffiliateDashboard, Max 5x), pas par le programme.

Tranche le 12 septembre 2026, et a confirme que personne n'avait ete recrute sous les anciennes conditions : aucune clause de reprise a ecrire. Aucun AffiliateCode n'existait a 20 %, et les candidatures partent par e-mail (/api/network/applications) sans rien stocker.

Alternatives écartées

OptionPourquoi non
Un seul programme : /network/affiliate redirige en 308 vers /network/referralHonnete en quelques heures, mais supprime un funnel d'acquisition indexe et le positionnement createur, qui ne se recree pas en une redirection
Deux programmes, deux ledgers : liens par asset, comptage de clics, taux propreCe n'est pas une correction de page, c'est une feature : une table de clics, une ingestion, une attribution par asset, des payouts distincts. Et « 20 % a vie » rouvre le calcul de liability que config/affiliate.ts documente — 30 % pour toujours sur un Max 20x, c'est 90 $/mois indefiniment pour une acquisition faite une fois, soit plus, sur trois ans, que la premiere annee de revenu du client
Garder « a vie » et l'implementerMeme liability, sans meme le benefice d'un tracking. Le chiffre de 12 mois a ete tranche le 30 aout 2026 sur un modele financier ; le rouvrir demande un nouveau modele, pas une reecriture de page
Aligner aussi le programme agence sur ces conditionsC'etait la forme initiale de cette decision. L'ADR 0014 (PR #1137) la remplace pour cette page : payer 30 % a un partenaire qui facture deja le meme client le fait payer deux fois. Le partenaire echange de la distribution, pas une commission

Conséquences

Ce que ça coute. /network/affiliate perd son argument de vente le plus simple, un taux different. Sa proposition repose desormais sur ce qui existe vraiment : le lien immediat sans candidature, le ledger de gains, et le detail par filleul a partir de Max 5x.

La dette qu'on accepte. Les deux pages se ressemblent davantage sur l'argent. C'est le prix de l'honnetete : la seule facon de les differencier la-dessus serait de payer deux choses differentes, ce que l'alternative 2 chiffre.

Le signal qui indiquerait de revisiter. Un volume d'affilies createurs suffisant pour que le comptage de clics change une decision de contenu, ou une demande recurrente de liens par asset. A ce moment-la, la sortie « deux ledgers » devient une feature a instruire, pas une correction.

Comment c'est appliqué

  • Les deux pages rendent leurs chiffres depuis un seul composant, src/app/(marketing)/network/_components/program-terms.tsx, qui lit config/affiliate.ts. Une page ne peut pas publier un chiffre qu'elle ne rend pas.
  • Le comparatif (marketingPages.network.doors) ne compare que les deux portes qui paient. Le programme partenaire y est une phrase : une colonne dont chaque ligne d'argent serait vide n'est pas une comparaison.
  • Le catalogue ne porte plus que des formes ("{pct}%", "{days} days"), pas des nombres. C'est ce qui a fait disparaitre le 60 j francais qui s'affichait sur la page anglaise.
  • src/test/affiliate-terms-match-the-ledger.test.ts : PENDING_OWNER_DECISION passe de six a deux entrees, les deux restantes appartenant a l'ADR 0014, et la liste ne peut plus grandir. La garde refuse en plus les mecanismes fantomes (lien par asset, taux de clic) dans les six locales.
  • src/test/network-pages-render-one-set-of-terms.test.ts : aucune des deux pages ne peut ecrire un chiffre dans son propre source. C'est le trou que la garde du catalogue ne voyait pas, et c'est exactement la que vivait le "20 %".