Реферальная программа — вид сотрудничества между клиентом и провайдером, при котором клиент получает реферальную ссылку или промокод. Такой клиент считается партнёром или реферером, а новые клиенты, которые зарегистрировались по этой ссылке (промокоду) — рефералами. Партнёр получает процент от расходов своих рефералов.
Результаты реферальной программы:
- партнёр получает прибыль за счёт привлечённых клиентов;
- провайдер получает новых клиентов и рекламу силами партнёра.
Общая логика работы
Со стороны провайдера
Администратор панели:
- Создаёт реферальную программу в меню Маркетинг → Реферальные программы → Создать.
- Указывает размер вознаграждения и URL сайта провайдера.
-
Размещает, как минимум, на одной странице сайта провайдера, следующий код:
<script language="javascript"> var counter_url = "https://billmgr.domain/mancgi/counter?rnd="+Math.random()+"&project=1&r="+escape(document.referrer)+"&p="+escape(window.location.href); document.write("<img src='" + counter_url + "' border=0 width=0 height=0 style='display: none;'>"); </script>
ПоясненияЕсли нужно, чтобы сайтом реферальной программы был BILLmanager, то разместите указанный код в настройках бренда. Для этого перейдите в Настройки → Настройка бренда → HTML-вставка → Заголовок.
Этот код нужен для учёта переходов и регистраций по реферальным ссылкам.
Со стороны клиента
Клиент переходит в Клиент → Реферальная программа и копирует там ссылку или промокод. Пользователи, который перешли по этой ссылке или при заказе первой услуги ввели скопированный промокод, становятся рефералами клиента.
Чтобы посмотреть статистику переходов по реферальной ссылке, клиент (реферер) переходит в меню Клиент → Реферальная программа → Статистика. Меню показывает сколько раз перешли по ссылке и сколько из перешедших зарегистрировались в BILLmanager и совершили оплату.
Таблицы БД
Таблица affiliate содержит общую информацию о реферальной программе:
Таблица affiliateitemtype содержит информацию о награде по конкретным настроенным типам продуктов:
Таблица account2project содержит информацию о том, к какой реферальной программе привязан клиент, чьим рефералом является и по какой реферальной программе был привлечён:
Таблица affiliateclick содержит список переходов по реферальной ссылке:
Таблица affiliatereward — список начислений за реферальную программу:
Создание реферальной программы
При создании реферальной программы BILLmanager делает запись в базу данных:
INSERT INTO affiliate (id, name_ru, project, reward, url_ru) VALUES('1', 'Пригласи друга', '1', '15', 'http://billmanager.docker:8080/?from=')
При добавлении особых правил реферальной программы в меню Маркетинг → Реферальные программы → Правила → Создать, BILLmanager делает запись в базу данных:
INSERT INTO affiliateitemtype (affiliate, id, itemtype, pricelist, reward) VALUES('1', '1', '103', '1', '50')
Переход клиента по реферальной ссылке
Учёт переходов по ссылке
При переходе по реферальной ссылке BILLmanager делает запись в базу:
INSERT INTO affiliateclick (site, account, ip, project, sesid, cdate) VALUES ('', '2', '172.30.20.1', '1', '1579183750.OC4uK2', NOW())
Привязка реферала делается в следующих случаях:
- при переходе на витрину;
- вручную в настройках клиента (BILLmanager);
- при регистрации.
Если у клиента в браузере не было сессии, реферал будет привязан, но запись в таблице не будет создана. Такое может быть, например, при режиме инкогнито или при использовании прокси.
Логи переходов по реферальной ссылке находятся в /usr/local/mgr5/var/counter.log.
Регистрация нового клиента по реферальной ссылке
-
Привязка клиента к провайдеру:
Запись в таблицу БДINSERT INTO affiliate (id, name_ru, project, reward, url_ru) VALUES('1', 'Пригласи друга', '1', '15', 'http://billmanager.docker:8080/?from=')
Пояснения к записи -
Подключение нового клиента к реферальной программе:
Запись в таблицу БДUPDATE account2project SET affiliate='1' WHERE account='3' AND project='1'
Пояснения к записи в базу -
Привязка нового клиента к рефереру в качестве реферала:
Запись в таблицу БДUPDATE account2project SET affiliateprogram='1', affiliatereferer='3' WHERE account='5' AND project='1'
Начисление вознаграждения
По умолчанию вознаграждения за реферальную программу начисляются по заданию в cron, первого числа каждого месяца в 3:10 по времени сервера:
10 3 1 * * /usr/local/mgr5/sbin/billmaintain --command affiliatemonthly >/dev/null 2>&1
При начислении вознаграждения за реферальную программу BILLmanager:
-
Делает запросы для каждого реферала:
Пример запросаJan 16 12:40:16 [12:151] core_module INFO Request [billmaintain][root] 'affiliate=1&func=affiliate.process&month=2020%2D01%2D20&out=xml&referal=6&referer=2'
-
Проверяет разрешено ли рефереру участвовать в реферальной программе:
Пример запросаSELECT Count(*) FROM affiliate a LEFT JOIN account2group a2g ON a2g.account = 2 AND a2g.accountgroup = a.account_group LEFT JOIN account2group rest ON rest.account = 2 AND rest.accountgroup = a.account_group_restrict WHERE a.id = '1' AND ( a.account_group IS NULL OR a2g.account IS NOT NULL ) AND rest.account IS NULL
В случае отрицательного ответа в логе будут отображаться ошибки вида:Пример ошибки в логеJan 10 20:11:20 [2724:1586] libmgr ERROR Error: Type: 'access' Object: 'affiliate' Value: '1'
-
Проверяет были ли уже вознаграждения за реферала за расчётный месяц:
Пример запросаselect count(*) from affiliatereward where account=2 and referal=6 and affiliate=1 and cdate='2020-02-01'
-
Считает расходы реферала запросом:
Пример запросаSELECT e.amount, s.currency, ai.reward, e.operationparams, ai.id AS rewardid FROM subaccount s join expense e ON e.subaccount = s.id left join item i ON i.id = e.item left join pricelist p ON p.id = i.pricelist left join pricelist pparent ON pparent.id = p.parent left join affiliateitemtype ai ON ai.affiliate = 1 AND ( ai.pricelist IS NULL AND ( ai.itemtype = p.itemtype OR ai.itemtype = pparent.itemtype ) OR ( ai.pricelist = p.id OR ai.pricelist = p.pricelist_group OR ai.pricelist = pparent.id OR ai.pricelist = pparent.pricelist_group ) AND ( ai.itemtype = p.itemtype OR ai.itemtype = pparent.itemtype ) ) left join pricelist aip ON aip.id = ai.pricelist WHERE s.account = 6 AND s.project = 1 AND e.realdate >= '2020-01-01' AND e.realdate < '2020-02-01' ORDER BY IF(ai.pricelist IS NULL, 0, 1) DESC, IF(aip.isgroup = 'on', 0, 1) DESC
-
Если условия выполняются и у реферала есть расходы за расчётный период, начисляет рефереру вознаграждение:
Пример записи в таблицу БДINSERT INTO affiliatereward (account, affiliate, amount, cdate, currency, id, referal, reward) VALUES('2', '1', '10.00', '2020-02-01', '126', '1', '6', '10')
-
Для каждого реферера, которому было начислено вознаграждение делает запрос:
Пример запросаJan 16 12:40:16 [12:153] core_module INFO Request [billmaintain][root] 'cdate=2020%2D02%2D01&func=affiliate.createpayment&out=xml&referer=2'
-
Создаёт и зачисляет авансовые платежи вознаграждения с номером вида PartnerPayment/ID:
Пример записей в БДINSERT INTO payment (createdate, currency, id, paymethodamount, randomnumber, status, subaccount, subaccountamount, usedamount) VALUES('2020-01-16 12:40:16', '126', '2', '10.00', 'oRBId9qgDJOr', '1', '1', '10.00', '0.0000') UPDATE payment SET number='PartnerPayment/2' WHERE id='2' UPDATE payment SET description='Авансовый платеж #2' WHERE id='2' UPDATE payment SET status='4' WHERE id='2' UPDATE payment SET description='Partner Payment - Gym' WHERE id='2' UPDATE affiliatereward SET payment='2' WHERE id='1'
Пояснения к записи в базуОбратите внимание!Платежи за награждение по реферальной программе создаются без указания плательщика и акты по таким платежам сделаны не будут.