SnapReceipt: как касовата бележка на кирилица става разход
Следенето на разходите се проваля на едно и също място за всички: въвеждането. Приложението ви кара да записвате всяка покупка, правите го четири дни и спирате.
SnapReceipt тръгна от идеята, че снимката на касовата бележка вече съдържа всичко необходимо. Трябва само да бъде прочетена. Това е какво се оказа, че включва тази идея, какво сбъркахме по пътя и къде е продуктът днес.
Защо българските бележки са трудният случай
Разчитането на касова бележка звучи като решен проблем, докато бележката не е на кирилица. Българските бележки съкращават имената на продуктите агресивно и непоследователно, често дотолкова, че човек трябва да спре и да мисли какво е купил. „КР. МЛЯКО ВЕРЕЯ 3% 1Л“ е литър мляко; „КРЕНВ. СВ. КФ“ е пакет кренвирши. Всяка верига съкращава различно, а една и съща верига съкращава един и същ продукт различно на различни каси.
Така че това не е класически OCR, който превръща пиксели в текст. Ползваме Google Gemini, за да стигнем до смисъла: не просто кой низ е отпечатан на реда, а кой продукт е това, в коя категория попада и в коя група ДДС стои. Разликата е между „ЛУК ЖЪЛТ 1КГ“ като текст и „зеленчуци, 1,12 €“ като запис, който може да се сумира.
Няколко детайла в тази средна стъпка отнеха повече време от самото разчитане. Моделът се учи от поправките: ако преместите „Верея“ от „млечни“ в своя категория, следващата бележка попада там, без да пита. Ред, отпечатан два пъти на една бележка – което се случва по-често, отколкото очаквате – се слива в един. А от 1 януари 2026 г. бележките са в евро. Всичко се съхранява в евро; левовете се появяват само като второстепенно число на екрана, преизчислено по фиксирания курс, докато хората още мислят в тях.
Два начина моделът да работи
Всеки, който е ценообразувал AI продукт, знае неудобната част: всяко сканиране струва пари, а безплатен план с неограничено сканиране е сметка, която расте с успеха.
SnapReceipt пуска модела на две места. В безплатния план малкият бърз модел работи в браузъра на самия потребител, срещу безплатния лимит на Google, така че безплатен потребител не ни струва нищо на сканиране. Това е, което прави възможен безплатен план без реклами, и е записано като правило в продукта, а не като маркетингов ред. В платените планове сканирането минава през нашия сървър в Google Cloud, с по-големия модел и с втори прочит на бележките, за които първият не е бил сигурен. Сървърът проверява кой пита и на какъв план е, преди да похарчи каквото и да е, а правилата на базата данни забраняват на самото приложение да пише каквото и да е за плановете. Може само сървърът.
Цените в реално време работят по същия начин: когато приложението проверява колко струва продукт в големите вериги тази седмица, отговорът е стъпил на живо търсене в интернет и се кешира за 24 часа, така че сто семейства, задали един и същ въпрос, струват едно търсене.
Домакинството е единицата, а не потребителят
Личните финанси рядко са лични. Семейният бюджет се харчи от няколко души, често в едно и също време и в различни магазини.
Затова семейството е нещо от първи ред: някой го създава, останалите се присъединяват с код от шест знака, а ролите решават кой може да променя бюджета. Оттам нататък всяка бележка, която някой сканира, попада в един и същ месечен бюджет, а списъкът за пазаруване е един списък. Двама души в два различни магазина виждат едно и също състояние, включително малката подсказка, че яйцата са били по-евтини в другия магазин на последните три бележки.
Това променя модела на данните из основи и е едно от онези решения, които почти не могат да се добавят по-късно, ако сте започнали с един потребител. Знаем го, защото наполовина започнахме с един потребител: списъкът за пазаруване първоначално живееше само в телефона, което работеше, докато не поискахме сървърът да изпраща напомняния и не открихме, че сървър не може да чете локалната памет на телефон. Списъкът се премести в споделената база, където е трябвало да бъде от началото.
Същите бележки захранват и останалото: рецепти, предложени от реално купеното през последните две седмици, карти за лоялност, пазени като сканируеми баркодове, и гаранции, заведени към покупката, за която се отнасят – защото бележката е и документ за покупка.
Първо уеб приложение, магазините – после
SnapReceipt работи в браузъра и се инсталира на телефона директно оттам. За домакинско приложение, което се разпространява от уста на уста, всяка стъпка между „чух за това“ и „ползвам го“ отсява хора, а линк, който се отваря веднага, преодолява тази бариера по-лесно от инсталация от магазин.
Това беше решението при пускането и беше правилно. Не е цялата история. Същият код е пакетиран за Android и iOS, а листинг в Google Play се подготвя. Магазинът носи разпространение и носи правила: плащанията трябва да минават през билинга на самия магазин, изтриването на акаунт трябва да работи от уеб страница без приложението, а формуляр за безопасност на данните трябва честно да описва до какво се докосва приложението. Минаването през този списък подобри продукта и за уеб потребителите. Изтриването на акаунт, например, сега премахва всичко на сървъра, а не приблизително третината, до която стигаше първата версия.
Какво сбъркахме
Две неща заслужават признание. Списъкът за пазаруване, по-горе. И ранна версия на текста за поверителност, която твърдеше, че данните от бележките стигат до модела в анонимен вид – вярно за имена и полета на акаунта и невярно за самата снимка: бележка може да носи името на картодържателя или данъчния номер на фирма. Формулировката беше смекчена, за да отговаря на реалността. Политика за поверителност, която обещава повече, е задължение, а не успокоение.
Статус
Продуктът е на живо на snapreceipt.net, изцяло на български, с безплатен план без реклами. Платени планове има; самообслужващото плащане в уеб версията е частта, която се довършва, а версиите за магазините ще ползват билинга на магазините, когато излязат. Отделна секция за следене на цени е в плана. Казваме го изрично, защото разстоянието между пуснато и планирано е точно това, което обикновено се замазва.