Један производ, много добављача, много канала
Ниједна табела није повређена. Неколико их је пензионисано.
Скоро сваки систем за е-трговину претпоставља да производ има цену. То је толико разумна претпоставка да и не приметите да сте је направили док не наиђете на посао у коме не важи.
Дистрибуција је један од таквих послова. Исти артикал купујете од неколико дистрибутера, а сваки нуди другачију набавну цену и другачије стање залиха. Продајете га кроз туђе продавнице, а свака хоће другачију цену и узима другачију провизију. Производ у средини је један производ. Скоро ништа везано за њега није у једнини.
Ову годину смо провели градећи систем за такав облик посла, за Inovio doo. Ево шта бисмо понели у следећи.
Оба смера су адаптери
Увоз од добављача и извоз ка каналу изгледају као различити проблеми. Улаз је XML од једног дистрибутера, CSV фајл од другог, REST API од трећег. Излаз су маркетплејсови од којих сваки хоће сопствени формат фида.
Структурно су идентични: нешто спољашње и променљиво, с једне стране границе коју ви контролишете. Зато је сваки добављач адаптер који производи понуде у једном интерном облику, а сваки канал адаптер који конзумира каталог у једном интерном облику. Оно што се мења стоји у адаптеру, а оно што је битно у средини.
Елеганција је успутна; права добит је у томе колико кошта следећи. Додати добављача значи написати адаптер. Не значи дирати цене, ни залихе, ни било који други канал.
Једно правило је рано зарадило своје место: ништа се не одбацује тихо на граници. Ред који не можемо да упаримо не нестаје у једној линији лога. Ако је активан и има назив, постаје нацрт производа који чека на човека, означен разлогом због ког није могао да се смести, и на сваком следећем пролазу упарује се по својој шифри уместо да се поново креира као дупликат. Улазни фидови стоје и иза заштитног прекидача (circuit breaker), па добављач коме је кренуло лоше јутро добија паузу и пријаву, уместо да га покушавамо изнова до бесвести.
Израчунајте цену једном
Правило које бисмо највише желели да задржимо: ништа не прерачунава цену у тренутку извоза.
Нисмо то наследили. Неки канали су на излазу примењивали сопствену формулу марже, па су цена у систему и цена на маркетплејсу биле различити бројеви, а она права постојала је само унутар кода који је генерисао баш тај фид. Питајте зашто је артикал јефтинији на једном маркетплејсу и нико не уме да одговори а да не прочита два генератора фида.
Сада је формирање цена један мотор који зна за услове по каналу и производи број који се заиста објављује. Извоз форматира. Не рачуна. Залихе раде исто, изведене у тачно једној функцији из интерне доступности и доступности код добављача. Друга имплементација се третира као баг, јер је друга увек она која одлута.
Ваши идентификатори припадају другима
Ово је оно што је коштало највише размишљања, и оно на шта бисмо скренули пажњу свакоме ко мења каталог.
Када мигрирате, природно желите чисте нове интерне идентификаторе. Проблем је што сваки маркетплејс кроз који продајете већ познаје ваше производе по идентификатору који је генерисао стари систем. Та шифра живи у њиховој бази, везана за историју вашег огласа и његово рангирање. Промените је и више не мигрирате, већ оглашавате од нуле и бацате све што су ти огласи зарадили.
Зато мигрирани производ и даље одговара на своју стару шифру на каналима који су га већ знали, а за све остало носи нови интерни идентификатор. Моделовање без имало гламура, а од њега зависи да ли миграцију ван фирме нико неће ни приметити или ће коштати четвртину учинка на маркетплејсовима.
Општа верзија: када мењате систем, његови идентификатори могу бити баш онај део од ког други зависе, а они нису пристали на вашу миграцију.
Бек-офис није веб-сајт
Прилично рано смо престали да се према администраторском интерфејсу односимо као према веб-сајту.
Оператери овде већи део дана раде једну ствар: прелазе дугачке табеле производа, понуда и цена у потрази за редом који је погрешан. Сваки инстинкт који сте покупили градећи маркетиншке сајтове ради против вас. Великодушан празан простор значи мање редова на екрану. Удобних 16px за основни текст значи мање редова на екрану. Сваки милиметар ваздуха који додате кошта корисника управо оно због чега је дошао.
Зато је основни текст 12px, размаци су намерно збијени, а број редова по екрану је величина коју оптимизујемо. Отишли смо дотле да укључимо алтернативни сет глифова фонта за l, 1 и I, јер се у уској колони SKU шифри на 12px та три знака заиста тешко разликују, а погрешно прочитана шифра некога кошта десет минута и једну погрешну измену.
На дизајн ревизији делује скучено, и тај разговор смо водили више пута, углавном међусобно. Нико ко га користи по цео дан није тражио да га раширимо.
AI предлаже, човек одлучује
Каталог састављен од много дистрибутера је по природи неуједначен. Један добављач шаље пун опис и уредне атрибуте. Следећи шаље назив, цену и фотографију. Оба морају бити довољно добра за маркетплејс који одбија оглас због једне димензије која недостаје.
Ту рупу су некада затварали људи, па је квалитет каталога зависио од тога колико сати сте могли да уложите у њега. Зато AI третирамо као сервис за обогаћивање над подацима, из исте породице као и сваки други провајдер података које платформа позива: узме производ који имамо, попуни поља која фидови нису доставили и врати их назад. Предлаже категорију са оценом поузданости, допуњује атрибуте који недостају, изводи логистичка поља и чита слике производа када сам текст није довољан да се закључи.
Свако може да позове AI endpoint. Занимљиво је где сме да заврши оно што врати.
Ништа што сервис врати не уписује се на производ. Чува се поред њега као предлог на чекању, а оператер га прихвата или одбија у поређењу са тренутном вредношћу. Прихватање се бележи, па годину дана касније и даље можете да кажете која поља је човек унео, а која је човек одобрио.
То својство је важније него што звучи. Очигледну глупост неко увек ухвати. Опасна је уверљива али погрешна вредност тихо уписана у запис, која се шири на сваки канал и не разликује се од података које је унео човек. Кад више не можете да разликујете једно од другог, не можете ни да ревидирате, ни да очистите а да не проверите све изнова.
Дозволили смо један изузетак: физичке димензије директно попуњавају празна логистичка поља, јер у ширини кутије нема уредничке процене, а порекло се и даље бележи.
Искрено, цена свега овога је ред за преглед. Неко мора да седи над њим, и у лошој недељи то је озбиљан део оператеровог дана. Може се рећи да смо превише опрезни, и многи тимови би просто уписали вредности и поправљали притужбе касније. Радије ћемо имати ред него каталог за који не можемо да гарантујемо, али то јесте компромис и направили смо га намерно.
Шта важи и шире
Према свакој спољној страни односите се као према адаптеру, и улазној и излазној. Сваки битан број изводите на тачно једном месту. Пре него што било шта мигрирате, запитајте се које су ваше идентификаторе други већ записали.
А тамо где AI обогаћује ваше податке: држите оно што сервис предлаже одвојено од онога у шта ваш систем верује, уз забележен прелаз између њих, иначе завршите са скупом података који никада не можете да ревидирате.
Ништа од овога није паметно, али баш од тога зависи да ли вас додавање следећег добављача кошта једно поподне или један квартал, и да ли вам AI обогаћивање оставља бољи скуп података или проблем са квалитетом података који месецима тиња.
Много канала. Један мотор за цене. И сервис за обогаћивање који никад нема последњу реч.


