gora.
Last-mile Delivery Platform

Verslo logika

Kaip sukūriau ir prižiūriu pristatymo platformą: duomenų perkėlimas, tūkstantis užsakymų per mėnesį, augimas Google, trys sandėliai ir avarija.

~8 min skaityti · 1698 žodžių

TL;DR

Last-mile Delivery Platform — tai pristatymo į namus paslauga vietinei parduotuvei: svetainė su katalogu ir užsakymo forma, Telegram programėlės dispečeriams ir vairuotojams, administravimo skydelis ir pranešimai pirkėjams. Pradėjau ją 2026 m. sausio 4 d., sausio 25 d. ji priėmė pirmąjį užsakymą, ir nuo tada ją kuriu ir prižiūriu vienas, padedamas AI agentų. Nuo sausio 25 d. iki spalio 18 d. platforma pristatė 5 834 užsakymus už 660 tūkst. $. Rugsėjį buvo 1 035 užsakymai už 124,9 tūkst. $, iš Google atėjo 1 985 paspaudimai (sausį — 77), o keturis užsakymus iš penkių pateikė žmonės, kurie jau buvo užsisakę anksčiau.

Kaip viskas prasidėjo

Iki manęs parduotuvė veikė kito rangovo platformoje, ir 2025 m. gruodį per ją buvo pristatyti 24 užsakymai. Savo platformą pradėjau rašyti 2026 m. sausio 4 d., o pirmąjį užsakymą ji priėmė sausio 25 d., po trijų savaičių. Tą dieną joje jau veikė vitrina su krepšeliu ir užsakymo forma, pristatymo zonos, administravimo skydelis užsakymams, prekėms, likučiams, pirkėjams ir vairuotojams, Telegram botai ir mini programėlės dispečeriams ir vairuotojams.

Atskirų mobiliųjų programėlių platforma neturi. Personalas dirba Telegram: paskyrą ten turi kiekvienas, pranešimai ateina kaip įprastos žinutės, o nauja programėlės versija pasiekia visus su kitu diegimu, be patikros programėlių parduotuvėje.

Perkėlimas nuo ankstesnės platformos

Ankstesnis rangovas projekto atiduoti nenorėjo: kartu su projektu jis prarastų mokestį už priežiūrą. Todėl parduotuvės duomenis pasiėmiau pats, per jos administravimo skydelio API. Surinkiklis kas valandą kopijavo juos į mano duomenų bazę, o perkėlimas vyko dalimis, prieš kiekvieną žingsnį darant atsarginę kopiją. Senoji platforma paskutinį užsakymą priėmė sausio 24 d., o 25 d. užsakymai jau ėjo į naująją. Kaip tai veikė, aprašyta atskirame puslapyje.

Kaip dirbu

Esu vienintelis projekto kūrėjas. Kodą rašau kartu su AI agentais: Claude Code ruošia pakeitimus ir testus, Codex atskirai tikrina didesnių pakeitimų planus ir patį kodą. Architektūra, duomenų schema, duomenų bazės pakeitimai gyvoje sistemoje, sprendimas, ką ir kada diegti, ir atsakomybė už tai, kad parduotuvė veiktų, lieka man.

Per 288 dienas nuo pirmojo commit'o susidarė 1 689 commit'ai, darbas vyko 232 iš tų dienų.

Kaip vienas žmogus spėja tiek padaryti?

Rutiną atlieka agentai, o mano laikas skiriamas sprendimams ir patikrai. Kiekvienas pakeitimas praeina automatinius testus, vien API jų turi 4 037. Didesnis pakeitimas pirmiausia aprašomas planu, planą perskaito antrasis agentas, ir tik tada rašomas kodas. Iš parduotuvės pusės darbe dalyvauja savininkas ir darbuotojai: jie kelia užduotis ir pirmieji išbando naujoves su tikrais užsakymais.

Augimas pagal mėnesius

Skaičiai paimti 2026 m. spalio 19 d. iš užsakymų duomenų bazės ir Google Search Console. Skaičiuojami tik pristatyti užsakymai, apyvarta — jų suma, pirkėjai — kiek skirtingų žmonių tą mėnesį gavo užsakymą.

2026 m. mėnuoUžsakymaiApyvartaPirkėjaiPaspaudimai iš GoogleParodymai Google
Sausis¹669 331 $4377901
Vasaris14817 194 $971631 672
Kovas29530 275 $1734135 823
Balandis40641 254 $2236228 044
Gegužė62863 043 $3121 10024 907
Birželis74079 460 $3641 94753 424
Liepa933108 897 $4291 49230 356
Rugpjūtis917106 477 $4271 51632 331
Rugsėjis1 035124 937 $5061 98557 616
Spalis, 1–18 d.²70685 205 $44695118 462

¹ Į sausį įeina ankstesnės platformos užsakymai, perkelti į naują duomenų bazę: savo platforma užsakymus priima nuo sausio 25 d. ² Google duomenys už spalį — iki 16 d.: Search Console juos pateikia su vėlavimu.

Kol kas daugiausia darbo buvo spalio 17 d.: 55 pristatymai. Vidutinis užsakymas nuo kovo laikosi tarp 100 ir 121 $.

Per visą laiką užsakymą gavo 1 479 žmonės. 716 iš jų užsisakė daugiau nei kartą, 326 — penkis kartus ir daugiau, 160 — dešimt ir daugiau. Tiems, kurie grįžo bent kartą, tenka 87 % visų pristatytų užsakymų.

Kaip svetainė augo Google

Sausį svetainė iš paieškos gavo 77 paspaudimus per mėnesį. Užklausose be parduotuvės pavadinimo, t. y. iš žmonių, kurie ieškojo pačios paslaugos, paspaudimų buvo 13, o vidutinė pozicija — 49. Rugsėjį tokių paspaudimų buvo 703, vidutinė pozicija — 11. Dar 582 paspaudimai rugsėjį atėjo pagal parduotuvės pavadinimą. Maždaug trečdalio paspaudimų Search Console neišskaido pagal užklausas, todėl šių dviejų skaičių suma mažesnė nei 1 985.

Ką dariau, pagal datas:

  • Sausio 28 d. — svetainės žemėlapis, meta žymos, struktūrizuoti duomenys apie parduotuvę, prekes ir straipsnius.
  • Vasario 7 d. — straipsnių skyrius, pirmieji 20 tekstų.
  • Vasario 17 d. — antroji ir trečioji svetainės kalba.
  • Vasario 23 d. — greitis: suspausti vaizdai, maketas be poslinkių kraunantis, puslapių podėlis.
  • Balandžio 9 d. — auditas: peradresavimai, antraštės, žymėjimas, tekstai, kuriuos patogu cituoti AI paieškos sistemoms.
  • Gegužės 29 d. — svetainės žemėlapis tiesiai iš duomenų bazės, įskaitant prekes, išimtas iš prekybos: jų puslapiai toliau atsidaro, kad Google neprarastų jų pozicijų. 104 prekių puslapių dublikatai sujungti į kanoninius adresus, klausimai ir atsakymai, straipsniai ir pristatymo rajonų puslapiai išversti į visas tris kalbas.
  • Liepa — pagal Search Console duomenis perrašiau dalį straipsnių ir atsakymų: sutrumpinau puslapius, kurie neatsakė į užklausą, ir pertaikiau tuos, kurie rinko parodymus pagal svetimas užklausas.

Per 90 dienų iki spalio 16 d. Google paieškoje rodė 798 svetainės puslapius trimis kalbomis.

Kas iš to suveikė

Gegužės pabaigoje parodymai per dvi dienas išaugo nuo 830 iki 2 748 per dieną ir į ankstesnį lygį nebegrįžo. Gegužės 29 d. pakeitimai sutapo būtent su tomis dienomis, bet augimas prasidėjo parą prieš diegimą, todėl atskirti, kur suveikė mano darbas, o kur perskaičiavimas Google pusėje, negaliu.

Vasarą parodymai sumažėjo 40 %, vidutinė pozicija nukrito nuo 10 iki 17–18. Po liepos tekstų perdirbimo rugpjūtis praėjo beveik be pokyčių, o rugsėjį parodymai grįžo ir pasiekė naują rekordą: 57,6 tūkst. per mėnesį, vidutinė pozicija vėl 10. Čia ryšys dar silpnesnis, todėl tai užrašau kaip faktą, be nuopelno sau.

Pačių pirkėjų teigimu, Google parduotuvei yra antras pagal svarbą šaltinis. Iš 1 342 žmonių, atsakiusių į klausimą „iš kur apie mus sužinojote“, 49 % nurodė pažįstamus, 21 % — Google, 13 % — socialinius tinklus.

Trys sandėliai viename tinkle

Rugpjūtį parduotuvės sandėliai pradėjo veikti kaip vienas tinklas. Katalogą ir kainas tvarko pagrindinis sandėlis, du kiti gauna prekes iš jo. Pirkėjas mato to sandėlio, kuris aptarnauja jo adresą, likučius, ir užsakymas patenka ten pat. Taisyklė, kuris sandėlis aptarnauja adresą, iškelta į atskirą paketą, ir ją vienu metu naudoja serveris ir svetainė. Todėl vitrina negali parodyti vieno sandėlio likučių, o serveris užregistruoti užsakymo kitam.

Jei sandėlis dienai užsidaro, darbuotojas paspaudžia vieną mygtuką, ir tą dieną jo zonos užsakymus priima kaimyninis sandėlis. Ekspreso pristatymo mediana spalį — 67 minutės nuo užsakymo pateikimo iki durų.

Be svetainės, per tą patį API veikia dar du pardavimo kanalai: parduotuvė Telegram viduje, kur katalogas ir užsakymo forma atsidaro tiesiai žinutėse (162 pristatyti užsakymai), ir dvi vitrinos kitais prekių ženklais (79). Pagalbos pokalbių robotas žinutėse taip pat kreipiasi į platformą per API: mato pirkėjo užsakymus, o nuo rugsėjo pabaigos gali pats pakeisti užsakymo adresą, pristatymo laiką ar sudėtį.

Ką mato pirkėjas, vairuotojas ir dispečeris

Pateikęs užsakymą, pirkėjas mato jo būseną, vairuotoją žemėlapyje ir numatomą atvykimo laiką. Žinutės apie patvirtinimą, išvykimą ir atšaukimą ateina į WhatsApp, o jei numerio ten nėra — SMS žinute. Vairuotojas ir pirkėjas skambina vienas kitam per maskuotą numerį ir nemato tikrų vienas kito numerių. Už užsakymus pirkėjui į vidinę piniginę grįžta dalis pinigų, o už pakviestus draugus skiriama premija pagal rekomendacijų programą.

Vairuotojas dirba Telegram mini programėlėje: mato savo užsakymus ir adresus, susirašinėja su pirkėju, žymi pristatymo etapus. Savo vietą jis transliuoja per patį Telegram. Telefone naršyklės fono kortelė užmiega, o Telegram transliacija toliau siunčia tašką kas kelias sekundes.

Dispečeris mato savo sandėlio užsakymus ir skiria vairuotojus, o budinčiajam apie kiekvieną naują užsakymą telefone suskamba garsus įspėjimas.

Vakaras, kai dingo pagrindinis serveris

Spalio 12 d. pagrindinis serveris nustojo atsakinėti. Pas talpinimo paslaugų teikėją sugedo fizinė mašina, kurioje jis veikė, o talpinimo valdymo skydelis tuo metu rodė, kad viskas tvarkoje. Paskutinį užsakymą senasis serveris priėmė maždaug šešios minutės prieš nutrūkimą.

Dvi savaites prieš tai įrengiau rezervinį serverį: duomenų bazė į jį buvo kopijuojama nuolat, nustatymai ir failai — pagal tvarkaraštį. Perjungimas užtruko 52 minutes. Pirmiausia reikėjo įsitikinti, kad senasis serveris neatgis darbo viduryje ir nepradės priimti užsakymų kartu su naujuoju. Tada pakelti paslaugas rezerviniame serveryje ir perkelti į jį domenus. Viskas, ką senasis serveris spėjo įrašyti, atsidūrė rezerve: paskutinė transakcija pasiekė kopiją kelios sekundės prieš nutrūkimą.

Po dviejų dienų senasis serveris atgijo. Jis pats patikrino, kuris serveris dabar pagrindinis, pamatė, kad ne jis, ir paslaugų nepaleido. Paskutinių įrašų sutikrinimas parodė, kad suvesti nėra ko. O naujasis pagrindinis serveris savo rezervą gavo dar avarijos dieną.

Ką išmokau per šiuos mėnesius

Pirma duomenys, paskui taisyklė

Spalį dispečerio žemėlapyje vieno vairuotojo automobilis retkarčiais pradėjo šokinėti į sandėlį. Sugretinau jo taškus su serverio užklausų žurnalu ir radau šaltinį: sandėlyje gulėjo planšetė, prisijungusi prie Telegram ta pačia paskyra, ir kas 30 sekundžių siuntė sandėlio koordinates. Prieš diegdamas filtrą, paleidau jį su trijų dienų tikrais taškais. Jis atmetė 1 480 klaidingų taškų ir praleido 39 abejotinus: tai buvo minutės, kai transliacija iš vairuotojo telefono tylėjo ilgiau nei tris minutes.

Tie patys žmonės dviem vaidmenimis

Platforma turėjo atskiras programėles dispečeriui ir vairuotojui, kol iš duomenų paaiškėjo, kad sandėliuose tai tie patys žmonės: nuo 80 iki 98 % užsakymų jie paskiria patys sau. Pirkėjų klausimai jiems ateidavo į dvi skirtingas vietas. Spalį sujungiau juos į vieną srautą bendroje programėlėje ir perkeliu ten visus.

Ko platforma nedaro

  • Nėra programėlių App Store ir Google Play: pirkėjai užsisako svetainėje ir Telegram, personalas dirba Telegram.
  • Nejungia trečiųjų šalių kurjerių: veža parduotuvės vairuotojai.
  • Pati nesudaro maršruto per kelis adresus: važiavimo tvarką pasirenka vairuotojas.

Nuorodos