Killa × Pablo — N.G.P Europe
Road to 1M
Code System
Thank you — the factory’s answer makes this considerably simpler. Because codes can be exported per production run, no real-time integration with the factory is needed at all. Batch import is the right call, and it means the campaign can launch without generating a million codes up front.
The short answer to your fourteen questions is yes to all of them. Details follow, then five points that were not in your brief but need deciding before we build.
The fourteen points
Numbered as in your email.
- 01Database of 1,000,000+ eligible codes Yes
We will use dedicated database tables rather than WordPress’s standard content storage. At a million rows that distinction is the difference between instant lookups and an unusable system.
- 02Regular batch imports during the campaign Yes
An upload screen in the admin for normal files, plus a command-line route for very large batches.
- 03Automatic duplicate detection Yes
Handled by the database itself: a uniqueness rule on the code column means a duplicate physically cannot be inserted. Every import returns a report — new codes added, duplicates skipped, invalid rows rejected.
- 04Check whether a code is eligible and used or unused Yes
- 05One use per code Yes
Enforced in the database, not in application code. This matters more than it sounds: if two people submit the same code in the same second, a check written in code can let both through. A database-level rule cannot.
- 06Bind a used code to the account and a Promotion Entry ID Yes
Every entry carries its own ID, timestamp, user and code.
- 07My Entries total and entry history Yes
The site already has customer accounts through the shop, so this becomes a tab inside the existing account area. Customers keep one login, not two.
- 08Successful product entry adds +1 to the live counter Yes
- 09Approved Free Entry adds +1 to the same counter Yes
Both routes write to the same entries table, marked either
codeorfree, so the counter and all reporting stay consistent. - 10Road to 1M live counter, Prize Road and milestones Yes
The counter will be cached rather than recalculated on every page view. We are deciding this now rather than treating it as a later optimisation, because milestone reveals and draw days are precisely when traffic spikes.
- 11Admin view Yes
Free Entry requests, milestones, prize reveals, entries, winners and import logs.
- 12Hashed code database Yes One change
We recommend it, but a plain hash will not be enough here. See the first point below.
- 13Export format CSV
CSV, UTF-8, one code per row, with the code column treated as text. Please avoid Excel — the reason is below.
- 14Other technical concerns Five
Set out in the next section.
Five points to settle before we build
1. A plain hash is not enough — it needs a secret key
Part of the code appears to be publicly derivable. In your own example the ITEM ends in 013039, and the PROD NO. printed on the same verification page is 013039. When a meaningful portion of a code is predictable, a plain hashed list can be attacked simply by hashing guesses until they match.
The fix is to hash with a secret key held only on our server, so that a leaked list is worthless without the key. The simplest arrangement is that the factory sends raw codes over a secure channel and we apply the key on import — less work for the factory than hashing on their side, and it keeps the key with us.
2. The code contains characters people will mistype — your email already shows it
The screenshot and the text of your email do not match, and the difference is exactly the classic confusion between lowercase L and capital i, and between the letter O and the digit zero:
The same code, two readings
If the code was miscopied while writing the brief, customers will miscopy it too — and every miscopy becomes either a support email or an abandoned entry.
The best fix removes typing altogether: ask the factory to carry the code inside the ENTER PRIZE DRAW link, for example …/register?code=8Vls…, alongside the COPY CODE button. The code then travels by click and manual entry becomes a fallback rather than the normal path. If manual entry must also work reliably, we need the factory to confirm the exact character set they use, so we can correct predictable mistakes safely.
3. Excel will corrupt the codes
If the export passes through Excel, codes are silently converted to scientific notation and leading zeros are dropped. Please agree CSV with the factory, with the code column treated as text.
4. Transfer channel
Not email. Either SFTP, or a password-protected download with the password sent through a separate channel.
5. Protection against automated guessing
A public code field invites people to try codes at scale. We will add rate limiting per IP address and per account, logging of failed attempts, and a challenge after a number of failures.
Outside our scope, but it needs an owner
Prize-draw and lottery rules in Estonia and in each target market, the campaign terms and conditions, the 18+ requirement, and GDPR treatment of winners’ details. The presence of a Free Entry route suggests you are already across the no-purchase-necessary requirement.
What we would build
A self-contained module with its own database tables for codes and entries, using the existing shop accounts for login and for My Entries, with an administration area inside WordPress. Keeping it separate from the shop means campaign traffic and shop traffic do not interfere with one another.
Questions for the factory
- Can the ENTER PRIZE DRAW link carry the code as a URL parameter?
- Raw codes over a secure channel with hashing on our side, or hashing on theirs with a shared secret key?
- What exact character set do the codes use?
- Confirmation of CSV, UTF-8, code column as text.
- Expected volume and frequency of each production export.
Happy to walk through any of this on a call.
Aitäh — tehase vastus lihtsustab asja oluliselt. Kuna koode saab eksportida tootmispartii kaupa, ei ole reaalajas liidestust tehasega üldse vaja. Batch-import on õige valik ja see tähendab, et kampaania saab käivitada ilma miljonit koodi ette genereerimata.
Lühike vastus teie neljateistkümnele küsimusele on jah kõigile. Allpool on täpsustused ning seejärel viis punkti, mida teie kirjas ei olnud, aga mis tuleb enne ehitamist ära otsustada.
Neliteist punkti
Nummerdatud nii nagu teie kirjas.
- 011 000 000+ koodiga andmebaas Jah
Kasutame selleks eraldi andmebaasitabeleid, mitte WordPressi tavalist sisusalvestust. Miljoni rea juures on see vahe otsustav — hetkeline päring versus kasutuskõlbmatu süsteem.
- 02Regulaarsed koodipartiide import’id kampaania jooksul Jah
Tavaliste failide jaoks üleslaadimisvaade admin’is, väga suurte partiide jaoks lisaks käsurea variant.
- 03Duplikaatide automaatne tuvastamine Jah
Selle eest hoolitseb andmebaas ise: unikaalsuse reegel koodiveerul tähendab, et duplikaati ei ole füüsiliselt võimalik sisse kanda. Iga import annab aruande — mitu uut koodi lisati, mitu duplikaati vahele jäeti, mitu vigast rida tagasi lükati.
- 04Kontroll, kas kood on eligible ning kasutatud või kasutamata Jah
- 05Üks kood, üks kasutuskord Jah
Reegel on andmebaasi tasemel, mitte rakenduse koodis. See on olulisem kui esmapilgul paistab: kui kaks inimest sisestavad sama koodi samal sekundil, võib koodis kirjutatud kontroll mõlemad läbi lasta. Andmebaasi reegel ei saa seda teha.
- 06Kasutatud koodi sidumine konto ja Promotion Entry ID-ga Jah
Igal entry’l on oma ID, ajatempel, kasutaja ja kood.
- 07My Entries koguarv ja sissekannete ajalugu Jah
Lehel on juba poe kaudu kliendikontod olemas, seega tuleb see olemasoleva konto alla eraldi vahelehena. Kliendil jääb üks konto, mitte kaks.
- 08Õnnestunud sissekanne lisab +1 live counter’ile Jah
- 09Kinnitatud Free Entry lisab +1 samale counter’ile Jah
Mõlemad teed kirjutavad samasse entries-tabelisse, märgistatuna kas
codevõifree, nii et counter ja kogu aruandlus jäävad omavahel kooskõlla. - 10Road to 1M live counter, Prize Road ja milestone’id Jah
Counter hakkab tööle vahemälust, mitte ei arvutata seda iga lehevaatamise peale uuesti. Otsustame selle kohe, mitte ei jäta hilisemaks optimeerimiseks — just milestone’ide avalikustamine ja loosipäevad on need hetked, mil koormus järsult kasvab.
- 11Admin-vaade Jah
Free Entry taotlused, milestone’id, auhindade avalikustamine, entries, võitjad ja impordilogid.
- 12Hashitud koodide andmebaas Jah Ühe muudatusega
Soovitame seda, aga tavalisest hash’ist siin ei piisa. Vt esimest punkti allpool.
- 13Ekspordi formaat CSV
CSV, UTF-8, üks kood real, koodiveerg tekstina. Palun vältige Excelit — põhjus on allpool.
- 14Muud tehnilised murekohad Viis
Järgmises osas.
Viis punkti, mis tuleb enne ehitamist paika panna
1. Tavalisest hash’ist ei piisa — vaja on salajast võtit
Osa koodist paistab olevat avalikult tuletatav. Teie enda näites lõpeb ITEM numbriga 013039 ja samal verifitseerimislehel olev PROD NO. on 013039. Kui märkimisväärne osa koodist on ennustatav, saab tavalist hashitud nimekirja rünnata lihtsalt nii, et hashitakse oletusi seni, kuni need kattuvad.
Lahendus on hashida salajase võtmega, mida hoiab ainult meie server — siis on lekkinud nimekiri ilma võtmeta väärtusetu. Kõige lihtsam on, kui tehas saadab toorkoodid turvalise kanali kaudu ja meie rakendame võtme importimisel. See on tehasele vähem tööd kui nende poolel hashimine ja võti jääb meie kätte.
2. Koodis on tähemärke, mille inimesed valesti sisestavad — teie kiri ise näitab seda
Ekraanipilt ja teie kirja tekst ei lange kokku ning erinevus on täpselt klassikaline segadus väikese L-i ja suure i vahel ning tähe O ja numbri null vahel:
Sama kood, kaks lugemist
Kui kood läks valesti üle juba kirja koostamisel, siis läheb see valesti ka klientidel — ja iga selline eksimus tähendab kas klienditoe kirja või pooleli jäänud registreerimist.
Parim lahendus kaotab käsitsi tippimise sootuks: paluge tehasel panna kood ENTER PRIZE DRAW lingi sisse, näiteks …/register?code=8Vls…, lisaks COPY CODE nupule. Siis liigub kood klõpsuga ja käsitsi sisestus jääb varuvariandiks, mitte tavateeks. Kui käsitsi sisestus peab samuti kindlalt toimima, on meil vaja tehaselt täpset tähemärkide loetelu, et saaksime ennustatavaid vigu turvaliselt parandada.
3. Excel rikub koodid ära
Kui eksport käib Exceli kaudu, teisendatakse koodid märkamatult teaduslikku formaati ja algusnullid kaovad. Palun leppige tehasega kokku CSV, kus koodiveerg on tekstina.
4. Edastuskanal
Mitte e-post. Kas SFTP või parooliga kaitstud allalaadimine, kusjuures parool tuleb saata eraldi kanali kaudu.
5. Kaitse automaatse äraarvamise vastu
Avalik koodiväli kutsub esile katsed koode masinaga läbi proovida. Lisame piirangu päringute arvule IP-aadressi ja konto kohta, ebaõnnestunud katsete logi ning kontrollküsimuse pärast teatud arvu vigu.
Väljaspool meie vastutust, aga vajab omanikku
Tarbijamängu ja loterii reeglid Eestis ning igal sihtturul, kampaania tingimused, 18+ nõue ja võitjate andmete avaldamine GDPR-i mõttes. Free Entry tee olemasolu viitab, et „ostukohustuseta osalemise“ nõue on teil juba teada.
Mida me ehitaksime
Iseseisev moodul oma andmebaasitabelitega koodide ja sissekannete jaoks, sisselogimiseks ja My Entries jaoks kasutame olemasolevaid poekontosid, haldusvaade tuleb WordPressi sisse. Poest eraldi hoidmine tähendab, et kampaania koormus ja poe koormus teineteist ei sega.
Küsimused tehasele
- Kas ENTER PRIZE DRAW link saab koodi URL-i parameetrina kaasa võtta?
- Kas toorkoodid turvalise kanali kaudu ja hashimine meie poolel, või hashimine nende poolel jagatud salajase võtmega?
- Milliseid tähemärke koodides täpselt kasutatakse?
- Kinnitus CSV, UTF-8 ja koodiveerg tekstina.
- Eeldatav kogus ja sagedus iga tootmise ekspordi kohta.
Räägime hea meelega kõik see telefoni teel läbi.