🎯 Katero — suivi d'affiliation et conversions

Reliez chaque inscription et chaque dépôt réalisé sur un programme d'affiliation externe à l'utilisateur Telegram exact qui en est à l'origine — puis laissez une de vos commandes le récompenser automatiquement.

1. Le principe en trois minutes

Vous êtes affilié à une plateforme externe (1win, un casino, une boutique…). Vous voulez savoir lequel de vos utilisateurs Telegram s'est inscrit ou a déposé, pour lui verser un bonus.

1. Votre bot envoie un bouton à Marie (ID Telegram 5551234)
   → le lien contient son identifiant, signé

2. Marie tape le bouton
   → Katero enregistre le clic, puis la redirige vers 1win
   → l'URL finale devient : https://1win.com/...?sub1=5551234

3. Marie s'inscrit et dépose 50 $
   → 1win appelle votre URL de postback

4. Katero enregistre la conversion, puis :
   → incrémente la propriété que vous avez choisie
   → EXÉCUTE VOTRE COMMANDE pour Marie

5. Votre commande fait le reste — c'est vous qui codez
Pourquoi le lien doit être personnalisé — Quand Marie tape un bouton dans Telegram, c'est son navigateur qui contacte BotStrike. Telegram ne transmet aucune identité. Sans l'identifiant placé dans le lien, il serait impossible de savoir qui a cliqué. C'est pour cette raison que le lien se fabrique avec Katero.getLink() et jamais à la main.
⚠️ Deux liens à ne pas confondre
Le lien de tracking est différent pour chaque utilisateur — votre bot le génère. L'URL de postback est unique et fixe pour la campagne — elle se colle chez le partenaire.

2. Créer une campagne

Dans l'application, ouvrez votre bot, puis l'onglet Katero et touchez Nouvelle campagne.

ChampExempleÀ quoi ça sert
Nom 1win Dépôt C'est ce nom que vous utiliserez dans le code du bot
URL partenaire https://one-vv4734.life/?open=deposit&p=nwnh&sub1={user.id} Votre lien d'affiliation, avec {user.id} écrit là où le partenaire attend votre identifiant
Commande à exécuter /bonus Choisie parmi vos commandes déjà créées. Elle sera exécutée pour l'utilisateur à chaque conversion
Propriété à modifier solde_depot Le serveur l'incrémente automatiquement. Sans espace ni accent

La variable {user.id}

Elle s'écrit directement dans l'URL, à l'endroit que vous voulez, et autant de fois que nécessaire. Katero la remplace par l'identifiant Telegram au moment du clic :

Vous écrivez  https://one-vv4734.life/?open=deposit&p=nwnh&sub1={user.id}
Marie obtient https://one-vv4734.life/?open=deposit&p=nwnh&sub1=5551234
⚠️ L'URL doit contenir {user.id} — Sans elle, aucune conversion ne pourrait jamais être rattachée à quelqu'un. L'application refuse la création, plutôt que de vous laisser découvrir le problème des semaines plus tard.
Où placer la variable ? — Cherchez dans le panneau de votre partenaire la mention SubID, Sub1, ClickID ou Custom parameter. Chez 1win, c'est sub1. En cas de doute, demandez à votre gestionnaire de compte : « quel paramètre me sera retourné dans le postback ? »

3. Envoyer le lien depuis votre bot

JavaScript
Python
// Commande : /jouer
const lien = await Katero.getLink("1win Dépôt");

Bot.sendMessage("🎁 Inscris-toi et reçois ton bonus !", {
  inline_keyboard: [[
    { text: "S'inscrire maintenant", url: lien }
  ]]
});
# Commande : /jouer
lien = Katero.getLink("1win Dépôt")

bot.sendMessage("🎁 Inscris-toi et reçois ton bonus !", {
    "inline_keyboard": [[
        {"text": "S'inscrire maintenant", "url": lien}
    ]]
})
⚠️ En JavaScript, n'oubliez pas await — Sans lui, vous placeriez un objet Promise dans le bouton et Telegram refuserait le message.

4. Configurer le postback chez le partenaire

Dans l'onglet Katero, touchez URL de postback pour la copier :

https://mykatero.botstrike.net/webhook/katero/Ax7Kp2mQr9?secret=VOTRE_SECRET

Collez-la dans le panneau de votre partenaire, section Postback / S2S / Callback, en ajoutant les paramètres qu'il propose :

https://mykatero.botstrike.net/webhook/katero/Ax7Kp2mQr9?secret=VOTRE_SECRET&sub1={sub1}&amount={amount}&trans_id={transaction_id}
Les mentions entre accolades sont des macros du partenaire, qu'il remplace lui-même. Leur écriture varie : {sub1}, %sub1% ou [sub1] selon les plateformes. Reportez-vous à leur documentation.
Bonne nouvelle : souvent rien à configurer — Katero reconnaît tout seul les noms les plus répandus : sub1, sub_id, click_id, amount, sumdep, payout, trans_id, txid… Un partenaire classique fonctionne du premier coup.

5. Quand le partenaire nomme ses champs autrement

Chaque plateforme choisit ses propres noms. On ne peut pas les deviner — mais on peut regarder ce qu'elle envoie vraiment.

PartenaireIdentifiantMontantTransaction
1winsub1amounttrans_id
un autresubidsumdeptxid
un troisièmeplayer_refcash_inref_op

Le journal des postbacks

Menu de la campagne → Postbacks reçus. Tout ce qui arrive y est enregistré tel quel, même ce que Katero n'a pas su interpréter :

⚠️ non exploité                                    13/08 14:22
player_ref=6425138885   cash_in=50   ref_op=A7X92   currency=USD

Raison : aucun champ identifiant reconnu

Il ne reste qu'à désigner, dans trois menus déroulants, quel champ correspond à quoi. Les vraies valeurs sont affichées sous chacun : vous reconnaissez au lieu de deviner.

Katero a besoin de…Vous choisissezValeur vue
Qui a convertiplayer_ref6425138885
Combiencash_in50
Numéro de transactionref_opA7X92
Katero pré-remplit ces menus — L'identifiant est trouvé de façon sûre : Katero compare les valeurs reçues aux identifiants qui ont réellement cliqué sur la campagne. Une correspondance ne peut pas être un hasard. Le montant est proposé d'après sa forme et son nom.
Le numéro de transaction n'est jamais deviné — Se tromper là casserait la protection anti-doublon. Katero préfère laisser le champ vide et vous laisser choisir.

Le déroulé recommandé

Le partenaire fait toujours un test avant de tout brancher. Profitez-en :

1. Créez la campagne, copiez l'URL de postback
2. Collez-la chez le partenaire, déclenchez son test
3. Revenez dans « Postbacks reçus » → le postback est là,
   avec ses vrais noms de champs
4. Vérifiez les trois menus (souvent déjà remplis)
5. C'est opérationnel

6. Votre commande, exécutée à la conversion

C'est le cœur de Katero. Quand le partenaire confirme, le serveur incrémente la propriété puis exécute la commande que vous avez choisie, pour cet utilisateur précis — exactement comme s'il l'avait tapée lui-même.

Le vocabulaire est fixe quel que soit le partenaire. C'est la correspondance des champs qui absorbe la différence :

1win envoie      sub1        amount      trans_id
autre société    click_id    payout      conversion_id
une troisième    player_ref  cash_in     ref_op
        │            │           │            │
        └────────────┴───────────┴────────────┘
                     ▼  la correspondance traduit

Votre code voit TOUJOURS :
        Katero.id    Katero.amount   Katero.transaction
JavaScript
Python
// Commande /bonus — choisie dans la campagne
if (!Katero.isConversion()) {
  Bot.sendMessage("Cette commande est déclenchée automatiquement.");
} else {
  const solde = User.getProp(Katero.propertyName) || 0;

  Bot.sendMessage(
    `🎉 Ton dépôt de ${Katero.amount} est confirmé !\n` +
    `Solde : ${solde}`
  );

  // Un champ hors du vocabulaire fixe
  const devise = Katero.raw("currency");
  if (devise === "USD") Bot.sendMessage("Paiement en dollars 💵");
}
# Commande /bonus — choisie dans la campagne
if not Katero.isConversion():
    bot.sendMessage("Cette commande est déclenchée automatiquement.")
else:
    solde = bot.getUserProp(Katero.property_name) or 0

    bot.sendMessage(
        f"🎉 Ton dépôt de {Katero.amount} est confirmé !\n"
        f"Solde : {solde}"
    )

    # Un champ hors du vocabulaire fixe
    devise = Katero.raw("currency")
    if devise == "USD":
        bot.sendMessage("Paiement en dollars 💵")
⚠️ En JavaScript, ce sont des getters — Katero.id, .amount, .transaction, .event, .campaign, .propertyName s'écrivent sans await et sans parenthèses. Seules getLink(), getStats(), getConversions(), getCampaigns() et hasConverted() sont asynchrones.
La propriété est déjà créditée — Le serveur l'incrémente du montant reçu (ou de 1 quand le partenaire n'envoie pas de montant) avant d'exécuter votre commande. Inutile de le refaire, sauf si vous voulez appliquer votre propre règle.

7. Référence — objet Katero

Données de la conversion en cours

Propriétés — sans parenthèses, sans await.

PropriétéContenu
Katero.ididentifiant Telegram du joueur
Katero.amountmontant, 0 si absent
Katero.transactionidentifiant unique de la transaction
Katero.eventtype d'événement, nommé par le partenaire
Katero.campaignnom de la campagne
Katero.propertyName (JS)
Katero.property_name (Py)
propriété que le serveur vient d'incrémenter

Méthodes

MéthodeRetourneDescription
isConversion()booléen la commande vient-elle d'une conversion ?
raw(nom, défaut)valeur un champ brut du partenaire, sous son nom d'origine
all()objet tous les champs bruts reçus
getLink(campagne) ⏳texte lien de tracking pour l'utilisateur courant
getCampaigns() ⏳liste campagnes du bot
getStats(campagne) ⏳objet clics, conversions, taux, montant total
getConversions(campagne) ⏳liste 200 dernières conversions de l'utilisateur
hasConverted(campagne, event) ⏳booléen a-t-il déjà converti ?

⏳ = asynchrone en JavaScript, await obligatoire.

En Python, les méthodes existent aussi en snake_case : get_link(), has_converted(), is_conversion(), property_name…

8. Limites selon votre plan

PlanCampagnes Clics/mois par campagneConservation
Free3207 jours
Starter1050030 jours
Pro1030 0005 mois
Le quota n'interrompt jamais vos utilisateurs — Une fois la limite mensuelle de clics atteinte, la redirection continue de fonctionner exactement pareil : personne ne voit d'erreur. Seul l'enregistrement s'arrête, et un avertissement apparaît dans votre tableau de bord.
Conservation — Passé le délai, les clics et conversions anciens sont effacés automatiquement. Le journal des postbacks, lui, ne garde que les 50 derniers par campagne : c'est un outil de diagnostic, pas un archivage.

9. Questions de sécurité

À quoi sert le secret du postback ?

Sans lui, n'importe qui connaissant l'adresse de votre webhook pourrait déclarer de fausses conversions — et déclencher vos crédits de solde à volonté. Le secret est unique par campagne et vérifié à chaque appel, par une comparaison à temps constant qui empêche de le deviner caractère par caractère.

Mon secret a fuité, que faire ?

Menu de la campagne → Régénérer le secret. L'ancienne URL cesse aussitôt de fonctionner. Pensez à coller la nouvelle chez votre partenaire, sinon les conversions ne remonteront plus.

Quelqu'un peut-il gonfler mes statistiques ?

Non. L'identifiant Telegram placé dans le lien est accompagné d'une signature calculée par le serveur. Un lien fabriqué à la main sera bien redirigé, mais le clic ne sera pas compté.

Le secret apparaît-il dans le journal des postbacks ?

Non. Il est retiré avant l'enregistrement. Et les appels présentant un mauvais secret ne sont pas journalisés du tout : sinon n'importe qui pourrait noyer votre journal de diagnostic.

Pourquoi ne puis-je pas changer l'URL de destination dans le lien ?

L'adresse de destination est lue uniquement en base de données, jamais depuis le lien. Si elle pouvait être passée en paramètre, le domaine botstrike.net deviendrait un tremplin vers n'importe quel site — une aubaine pour l'hameçonnage, et une mise en liste noire assurée pour le domaine.

Pourquoi certaines URL sont-elles refusées à la création ?

Seules http:// et https:// sont acceptées. Les schémas javascript: et data:, ainsi que les adresses internes (127.0.0.1, 192.168.x.x…), sont bloqués. Et l'URL doit contenir {user.id}.

Le partenaire réessaie en boucle, est-ce grave ?

Non. Le numéro de transaction garantit qu'un même événement n'est enregistré qu'une seule fois. Les tentatives suivantes reçoivent 200 avec "duplicate": true, ce qui arrête proprement la boucle sans rien compter en double. La propriété n'est pas recréditée non plus.

Et si le partenaire n'envoie pas de numéro de transaction ?

Katero en fabrique un à partir du contenu du postback. Deux appels rigoureusement identiques seront donc détectés comme doublons. C'est moins fiable qu'un vrai identifiant : demandez-en un à votre partenaire si possible.