Проблемът
Когато малки и средни брандове търсят инфлуенсъри, процесът обикновено е хаотичен. Статистиките идват като скрийншоти и не могат да бъдат проверени, преговорите се водят в Instagram съобщения, а плащането става на доверие. Ако брандът плати предварително, рискува да не получи съдържание. Ако създателят работи преди плащането, рискува да не получи пари. На българския пазар почти няма локализирана платформа, която да покрива целия процес: от откриването на създател до плащането.
Решението
Influ-Link е двустранен marketplace, който събира на едно място целия процес между бранд и създател:
- 1Откриване: брандът търси създатели по ниша, локация, език, платформа и тип съдържание.
- 2Доверие: статистиките идват директно от Instagram чрез официалния API, а не от скрийншоти.
- 3Комуникация: чат и известия в реално време, кампании и предложения, които се приемат или отхвърлят.
- 4Сигурно плащане: парите се задържат и се превеждат на създателя едва след като брандът одобри работата.
Платформата е изцяло на български и английски и е публично достъпна.
Основни функционалности
Профили на създатели и търсене
Всеки създател има публичен профил с портфолио, последователи, харесвания и пакети с фиксирани цени. Пакетите са вход към разговор в чата, а не директно плащане. Търсенето комбинира много филтри върху данни, пазени като JSON колони в MySQL. Заявките се сглобяват динамично според избраните филтри и са параметризирани, за да няма SQL injection.
Интеграция с Instagram Graph API
Създателят свързва Instagram акаунта си чрез Facebook Login for Business. Краткосрочният токен се обменя за дългосрочен (около 60 дни) и се пази криптиран с AES. Статистиките за последователи, обхват и ангажираност се синхронизират автоматично. Нощна cron задача подновява токените, които изтичат в следващите 10 дни, за да не спрат статистиките тихомълком. Изградихме и задължителните за Meta callback-и за деавторизация и изтриване на данни, които проверяват подписа на заявката (signed_request) с HMAC-SHA256.
Кампании, предложения и чат в реално време
Брандовете създават кампании, канят създатели и изпращат предложения. Платформата пази история на кампаниите и отчита импресиите. Чатът и известията работят със Socket.IO и Redis адаптер, така че сървърът може да се мащабира хоризонтално, без да се губят съобщения между инстанциите. Старите известия се почистват автоматично.
Плащания със задържане на сумата (Stripe Connect)
Брандът плаща предварително и сумата се задържа от платформата. Създателят отбелязва работата като завършена, брандът я преглежда и одобрява, и едва тогава парите се превеждат по Stripe Connect сметката на създателя. Освобождаването на средствата се изпълнява в транзакция в базата данни със заключване на записа, за да не се стигне до двойно изплащане при едновременни заявки. Създателите се регистрират за изплащания директно в Stripe.
Абонаменти за брандове (Stripe Subscriptions)
Изградихме петстепенна система от абонаменти с Checkout, Customer Portal и смяна на плана с пропорционално преизчисляване на сумата. Достъпът до функционалности зависи от плана: при недостатъчен план сървърът връща HTTP 402 и интерфейсът показва диалог за надграждане. Състоянието на абонамента се управлява изцяло чрез webhook събития от Stripe. Логиката е покрита с над 50 unit теста и е проверена end-to-end в Stripe sandbox. Засега е скрита зад feature flag, защото стартирахме първо със създателите.
Автентикация и въвеждане на нови потребители
Потребителите влизат с имейл и парола или с Google OAuth. Новите акаунти трябва да потвърдят имейла си, преди да могат да влязат. Токените за верификация се пазят само като SHA-256 хеш и изтичат след 24 часа. Повторното изпращане на имейл не разкрива дали даден имейл е регистриран. Новите създатели минават през въвеждащ диалог и интерактивна обиколка на профила, която осветява реалните бутони в интерфейса.
Технически предизвикателства
1. Одобрението от Meta
Пускането на Instagram интеграцията за публиката изискваше верификация на бизнеса, отделна верификация като Tech Provider (защото приложението чете данни от чужди бизнес акаунти), App Review за пет разширени разрешения и видео демонстрация на процеса. Дори след като всичко беше одобрено, реалните потребители виждаха грешката „Feature Unavailable“. Причината се оказа, че Facebook Login for Business изисква разрешението public_profile на ниво Advanced access, а Meta не го споменава никъде. Установихме също, че Meta вече автоматично добавя всяка връзка между Page и Instagram към бизнес портфолио. Затова без разрешението business_management страниците на създателите изобщо не се виждат през API-то.
2. Коректност на плащанията
При пари грешките са недопустими. Премахнахме race condition, при който две едновременни заявки можеха да създадат два Stripe клиента за един и същ бранд и платеният абонамент да остане без връзка с акаунта. Решението е транзакция, която заключва реда със SELECT … FOR UPDATE. Ако обработката на webhook събитие се провали, сървърът вече връща 500, за да го изпрати Stripe отново, а повторната обработка е идемпотентна. Цената винаги се изчислява на сървъра, така че клиентът не може да подаде собствена сума.
3. Неуспешни плащания по абонаментите
Вместо да прекъсваме достъпа веднага при неуспешно плащане, въведохме гратисен период от 15 дни. Той е умишлено по-дълъг от 14-дневния график, по който Stripe автоматично опитва плащането отново. Така клиент с временно проблемна карта не губи достъп, докато Stripe още се опитва да събере сумата. При всяка промяна в състоянието потребителят получава известие в приложението. По време на ревюто открихме и скрит бъг: в новите версии на Stripe API полето current_period_end е преместено на ниво subscription item и датите за подновяване се записваха като празни.
4. Промени в базата без прекъсване
Схемата на базата се мигрира автоматично при стартиране на сървъра чрез идемпотентни функции. Когато въведохме задължителната верификация на имейл, миграцията автоматично маркира всички съществуващи потребители като верифицирани, за да не заключи никого.
5. Сигурност
Направихме цялостно подсилване на бекенда: security headers с Helmet, отделни rate limit-и за автентикацията, API-то, плащанията и контактната форма, JWT в httpOnly бисквитки, bcrypt за паролите, CORS само за изрично разрешени домейни, проверка за IDOR на всеки endpoint и автоматичен ежедневен отчет за сигурността.
6. Инфраструктура и деплой
Фронтендът е статичен Vite build на споделен хостинг, а бекендът работи на DigitalOcean под pm2. Мигрирахме продукцията от поддомейн към основния домейн без прекъсване на услугата. Това включваше обновяване на OAuth адресите, Stripe return URL-ите, CORS настройките и регистрацията в Meta.
Резултати
- Платформата е публично достъпна на influ-link.com и отворена за регистрация на създатели.
- Instagram интеграцията е одобрена от Meta и работи за реални потребители.
- Задържането на плащания и изплащанията на създателите са изградени върху Stripe Connect, а абонаментите за брандове са проверени end-to-end в Stripe sandbox.
- Приложението е изцяло двуезично (BG/EN), адаптивно и SEO оптимизирано.


