Kiindulás
Egy affiliate-hálózat három szereplő között áll. Az affiliate-ek, vagyis kiadók, tartalomgyártók és hirdetési szakemberek, ügyfeleket hoznak. A hirdetők, vagyis a márkák, fizetnek értük. A hálózat a kettő között méri a forgalmat, kiszámolja a jutalékot, és kifizeti. Ennek a hálózatnak addig egyetlen, sablonból épített bemutatkozó oldala volt. Erre építettük rá a teljes rendszert 2026 júniusa és októbere között, körülbelül 16 hét alatt, 170 commitban.
A rendszer két részből áll. A nyilvános oldal affiliate-eket toboroz, és egy külön oldal szól a hirdetőknek. A háttérben fut a kattintáskövetés, a konverziók fogadása, a jutalék-főkönyv, a havi elszámolás, az affiliate-portál és egy többszintű adminkonzol. Öt szerepkör van, egymásba ágyazva: affiliate, külső partnermenedzser, munkatárs, admin és tulajdonos. A külső menedzser csak azokat az affiliate-eket látja, akiket ő hozott.
A hálózat a saját oldalán is pontos. A nyilvános számok programmaximumok, és mind egyetlen konstansfájlból jönnek. Márkánkénti díjat a hálózat nem tesz közzé. A tervezés előtt több mint 30 affiliate-programot és hálózatot néztünk végig, hogy lássuk, mit ígérnek a versenytársak, és mit tudnak valóban megmutatni.
A kattintás útja
Egy kattintásból később pénz lesz, ezért a kattintás nem veszhet el, és nem lehet hamisítani.
- Minden kattintás HMAC-aláírt azonosítót kap, amelyet a hirdető visszaküld a konverzióval.
- A link célját egy Redis-gyorsítótár adja, amely egyszerre csak egy lekérdezést enged az adatbázishoz, így egy népszerű link sem terheli túl.
- A kattintás egy tartós sorba íródik, és ha a sor nem érhető el, közvetlenül az adatbázisba.
- A hirdető soha nem kap olyan aláírt azonosítót, amelyhez nincs kattintássor. Egy dupla koppintásnál és a levelezők linkellenőrzőinél a duplikációszűrés korábban megsértette ezt a szabályt. A javításban az azonosítót előbb lefoglaljuk, és csak utána építjük meg a linket.
A hirdetőnként eltérő paraméternevet és helyőrzőt a konzolban lehet beállítani. Ugyanaz a függvény állítja elő a konzol előnézetét és az élő átirányítást, ezért a menedzser pontosan azt a linket látja, amely élesben fut.
Konverzió a hirdetőtől
A hirdetők szerverről jelzik a konverziót (S2S postback), mindegyik a maga módján. Egy adapter fordítja le őket a hálózat nyelvére.
| Hitelesítés | Hogyan működik |
|---|---|
| Időbélyeges HMAC | aláírt kérés, 300 másodpercig a múltba, 60 másodpercig a jövőbe tűrve |
| Megosztott token | egy titkos kulcs a kérésben |
| IP-cím | szerkeszthető engedélylista |
Hirdetőnként saját paraméter- és eseménytérkép mondja meg, melyik esemény számít konverziónak. A visszavont státuszok, például a visszaterhelés és az érvénytelenítés, visszafordítják a konverziót. A hirdetők titkai AES-256-GCM-mel titkosítva, a márka azonosítójához kötve tárolódnak, és ha a visszafejtés nem sikerül, a rendszer elutasítja a kérést. A forgalmat hitelesítés előtt IP-címenként, utána hirdetőnként korlátozzuk. Azoktól a hirdetőktől, akik nem küldenek jelzést, a rendszer JSON- vagy CSV-riportot húz be.
A főkönyv
A pénz egy csak bővíthető főkönyvben él, és a szabályait maga az adatbázis őrzi.
- A jóváírás nem lehet negatív, a kifizetés és a visszavonás nem lehet pozitív. Ezt egy adatbázis-megkötés ellenőrzi, és a szabálytalan tétel be sem kerül.
- A javítás mindig ellentétel. Egy tételt soha nem írunk át.
- A regisztrációért nem jár jutalék. Egy adatbázis-trigger minden ilyen jóváírást visszautasít, akkor is, ha a kód hibázna.
- Az egyeztetés bármikor újrafuttatható. Részleges egyedi indexek gondoskodnak róla, hogy egy tétel kétszer ne kerüljön be.
- A kiadás pillanata sem okozhat dupla könyvelést. A bevételmegosztásos tételekhez kötelező az elszámolási időszak, így a régi verzió egy átfedő kiadás alatt nem tud könyvelni.
- A pénz egész mikroegységekben számol, lebegőpontos kerekítés nélkül, nyolc devizában.
A tulajdonos konzolján egy próbamérleg hét invariánst ellenőriz: a jóváírások lefedettségét és eredetét, a kifizetések egyezését, a visszavonások épségét, és a menedzseri, az alpartneri és a bevételmegosztásos tételeket.
A jutalékmotor
A díj három szintről jöhet, és a rendszer azt is megmondja, melyikről jött: az affiliate és az ajánlat saját megállapodásából, a hálózati szintű megállapodásból vagy az ajánlat alapértékéből. A motor CPA-, bevételmegosztásos és vegyes modellt is kezel.
A bevételmegosztás havonta számol. A kifizethető összeg a nettó bevétel és a díj szorzata, és soha nem negatív, így egy rossz hónap nem visz át tartozást a következőre. A díj hónapra rögzül, és egy hónap csak a lezárása után könyvelődik. Az elszámolás tranzakciós zárat vesz, és csak a különbözetet írja be, így bármikor újrafuttatható. Az alpartneri jutalék az alpartner keresetének egy százaléka, egész mikroegységekben, felső határral.
Októbertől egyetlen konverziót sem hagy jóvá időzítő. A menedzser havonta átnézi a sorokat, kiveszi az elutasítottakat, és jóváhagyja a többit. A jóváírás egyetlen kódúton történik.
Jogosultság egyetlen SQL-utasításban
A konzol három egymásba ágyazott gyűrű: munkatárs, admin, tulajdonos. A hatókör feltételei a módosító utasítás WHERE részébe kerülnek, így a jogosultság ellenőrzése és a versenyhelyzet elleni védelem ugyanaz az atomi lépés, és egy kétszeres jóváhagyás szerkezetileg lehetetlen. A NULL-értékek csapdáit külön kezeltük. A menedzser a saját ügyletét nem hagyhatja jóvá, és senki nem lát a saját szintje fölé. A menedzseri árrés és a tulajdonosi bevétel tételtípus-szűrőkkel minden olvasóban rejtve marad.
A hiba, amelyet hetekig kerestünk
A partnerportál néha nem töltött be, és egy általános hibaüzenetet mutatott. Több elmélet bukott el egymás után: egy IPv6-os útvonal, a kapcsolatkezelő sorba rendezése, egy újracsatlakozási vihar, amely a közös kapcsolatkészletet tette tönkre, és egy adatbázis-kliens, amely két különböző hibatípusnál is leállította a folyamatot. Mindegyiket javítottuk, a hiba mégis maradt.
Végül mérés mutatta meg az okot. Egy tranzakciós kapcsolatkezelőn az a lekérdezés, amely a készlet maximumán túl áll sorba, örökre vár. Öt kapcsolatnál hat párhuzamos kérés lefagyott, tizenöt kapcsolatnál tizenöt kérés 593 ezredmásodperc alatt visszatért.
A javítás minden időkorlátot egy modulba gyűjtött, amelyet tesztek rögzítenek. Minden próbálkozásnak saját határideje van, a kapcsolatkészlet rendben ürül le, és egy kérésenkénti gyorsítótár a hibát nem jegyzi meg. Az ellenőrző mérésben 30 párhuzamos szálon mind a 120 kérés sikeres volt, 180–280 ezredmásodperces mediánnal.
Üzemeltetés saját szerveren
2026 augusztusában a rendszer a Vercelről saját szerverre költözött. Egyetlen Node-folyamat fut systemd alatt, a Caddy mögött, automatikus TLS-sel, Docker nélkül. A négy ütemezett feladat (az egyeztetés negyedóránként, az adatmegőrzés és a riportimport naponta, a hírlevél negyedóránként) systemd-időzítőként fut, átfedés elleni zárral. A levelezés is saját, Postfixszel, OpenDKIM-mel, Dovecottal és Rspamddel.
A kiadás egy tizenkét lépéses szkript. A fontosabb lépései ezek.
- Nem épít, ha egy környezeti fájl van a mappában.
- Lefut a típusellenőrzés, a lint és az összes teszt.
- Lefutnak az adatbázis-migrációk.
- A build 5 GB-os memóriakeretben fut, hogy ne vehesse el az élő szerver memóriáját.
- Ellenőrzi a kész csomagot, a képfeldolgozó natív binárisát, a nyilvános fájlokat, és hogy titok ne kerüljön bele.
- Egy szimbolikus link cseréjével atomian vált, és újraindít.
- 60 másodpercig figyeli az állapotjelzőt, és ha az új verzió nem egészséges, magától visszaáll.
- Öt korábbi kiadást megtart.
A kézi visszaállás körülbelül 3 másodperc. Legalább húsz kiadás ment ki így, és mindegyik zöld állapotjelzővel, újraindulás nélkül állt fel. A szerver megtagadja az indulást, ha hiányzik a titkosító kulcs, a Redis vagy a botvédelem. A tulajdonos konzolja mutatja az ütemezett feladatok frissességét, a próbamérleget és az elakadt konverziókat.
A nyilvános oldal mint toborzó
A regisztráció minősít. Az affiliate a regisztrációkor kiválasztja a forgalma forrását egy 26 csatornás listából, és sávban megadja a havi forgalmát. Utána jóváhagyásra vár. A beindulás négy lépés: jóváhagyás, hozzáférés egy márkához, megállapodás és link, és a portál mutatja, melyiknél tart.
A toborzás is mérhető. Az alpartneri ajánló és a menedzseri toborzólink saját paramétert visz. A blogról, az útmutatókból, az eszközökből és a keresőből érkező regisztrálók 30 napos, saját sütis jelzést kapnak, és a tulajdonos saját sorába kerülnek. A tulajdonos levélben kapja meg, melyik oldal hozta a regisztrációt.
A riport a döntéshez kell. A teljesítménygrafikon órás, 7, 30 és 90 napos nézetet ad. A tölcsértáblázat naponként vagy márkánként mutatja a kattintást, a regisztrációt, a konverziót, az arányokat és a jutalékot, és CSV-be menthető, képletbefecskendezés elleni védelemmel. A grafikonokat könyvtár nélkül, SVG-ben rajzoltuk, billentyűzettel kezelhető célkereszttel és képernyőolvasós bemondással.
A kifizetés bizalmat épít. A kifizetés havonta fut, devizánként minimummal. A tranzakció azonosítója kötelező, és az affiliate maga igazolja a beérkezést. A „függőben” felirat soha nem ígér jóváhagyást.
A tartalom keresésre épül. A piacok és csatornák szerinti lefedettségi oldalak egyetlen adatkészletből készülnek, 19 piacra és 12 csatornára. A közzétételi határt a kód típusa rögzíti, így márkaazonosító vagy díj soha nem juthat el az oldalig. Egy oldal legalább három programot mutat, ami egyszerre véd a vékony tartalom és a beazonosíthatóság ellen. Egy 48 kérdéscsoportos szándéktérkép 15 ellenőrzéssel fut, és mindegyikről bebizonyítottuk, hogy elbukik, ha valaki elrontja. A közel azonos oldalak hasonlóságát piaconkénti és csatornánkénti leírásokkal 97–98 százalékról nagyjából 80 százalékra vittük le. Mellettük 11 útmutató, egy 29 szavas szójegyzék és 4 kalkulátor áll, és a sitemap 15-ről 69 címre nőtt.
A hozzájárulás valódi. A Google hozzájárulási módja alapból tilt, és az elfogadó és az elutasító gomb egyforma súlyú. A hírlevél kettős megerősítéssel megy, és a megerősítő link egy egyszerű megnyitásra semmit nem tesz, így egy levelezőprogram linkellenőrzője nem tud hozzájárulást gyártani. A leiratkozó link HMAC-aláírású, és két év múlva is működik.
Mért sebesség
- július 5-én a nyitóoldal teljes blokkolási ideje 2060 ezredmásodperc volt. Az okát egyetlen, korán betöltött komponensben találtuk meg, amely a teljes tartalmi csomagot behúzta. Augusztus 29-én egy saját, függőség nélküli méréssel, lassított telefonos hálózaton és négy-hatszoros processzorlassítással végigmentünk a mobil oldalon.
| Mérés | Előtte | Utána |
|---|---|---|
| Kezdeti JavaScript | 1 106 649 bájt | 631 755 bájt |
| Kérések | 35 | 26 |
| Külső kérés interakció előtt | 3 | 0 |
| CLS lassú betűkkel | 0,0773 | 0,0099 |
A partnerportál műszerfalának kezdeti csomagja 1165 kB-ról 851 kB-ra csökkent. A content-visibility beállítást megépítettük, megmértük, és elvetettük. Egy modális párbeszédablakot nem modálisra cseréltünk, mert a mérés ezt mutatta jobbnak.
Egy affiliate-hálózatban a partner akkor marad, ha a riport minden száma visszavezethető egy kattintásra és egy főkönyvi tételre.
Amit ebből Önnek érdemes tudni
Ha saját affiliate-programot indítana, a kattintás és a jutalék közötti lánc, a főkönyv és a kifizetés a legfontosabb rész, mert ezeken múlik, hogy a partnerek megbíznak-e a számokban. Az affiliate-platformról külön oldalon írunk, a munka menetéről pedig az Így dolgozunk oldalon.