Статьи

Решение для системы реферального маркетинга

Чтобы привлечь пользователей, сервисы иногда используют партнерские программы. Эта идея проста: попросите подписавшихся пользователей пригласить своих друзей присоединиться к системе и начать использовать ваш сервис. Для каждого пользователя есть несколько бонусов, которые приносят вам новых пользователей (пополнение счета, повышение функциональности, продление и т. Д.).

Вот наш технический опыт того, как мы реализовали эти функции в  нашем сервисе :

логика

1) Пользователь зарегистрирован в нашем сервисе и ему присвоен случайный реферальный код. Этот код вставляется в ссылку для приглашения, например » http://example.com «.

2) Пользователь A отправляет ссылку пользователю B (отправляет личное сообщение, делится в социальных сетях и т. Д.)

3) Когда пользователь B заходит на сайт по ссылке, этот код запоминается в браузере локального хранилища. Теперь, даже если пользователь B закроет вкладку и перейдет к нашему сервису по ссылке « http://example.com », мы все равно узнаем, кто его пригласил.

4) При регистрации этот код отправляется на сервер. В соответствии с этим, пользователь A находится в базе данных, а новый объект создается в отдельной таблице «Affiliate».

5) Пользователь А получает некоторый бонус.

Техническая часть

В качестве бэкенда в нашем проекте BitCalm мы использовали Django. С помощью этой структуры очень легко реализовать то, что нам нужно.

Создание поля с реферальным кодом в User

class User(AbstractUser):
...
     affiliate_code = models.CharField(_('Affiliate code'), max_length=16, 
                                                            unique=False, 
                                                            default=generate_key)
...

Когда вы создаете нового пользователя, это поле заполняется кодом, сгенерированным функцией generate_key.

Записать реферальный код в Local Storage

В сценарии на первой странице мы проверяем, нужен ли нам ключ в URL-адресе. Если он существует, то запишите его в локальное хранилище.

(function () {
    var getParameterByName = function (name) {
            name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]");
            var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"),
                results = regex.exec(location.search);
            return results === null ? null : decodeURIComponent(results[1].replace(/\+/g, " "));
        },
        affiliateCode = getParameterByName('ref');
    if (!('affiliateCode' in localStorage)) {
        if (affiliateCode && affiliateCode.length) {
            localStorage['affiliateCode'] = affiliateCode;
        } else {
            localStorage['affiliateCode'] = null;
        }
    }
})();

Отправка кода данных при регистрации

Когда пользователь регистрируется, кроме логина и пароля мы также отправляем данные о реферальном коде на сервер.

Auth.signup({
    name: $scope.user.name || '',
    login: $scope.user.login,
    password: $scope.user.password,
    affiliateCode: localStorage.affiliateCode ? localStorage.affiliateCode : ''
})

Узнайте больше о том, как работает наша система авторизации, в  нашем блоге.

Обработка данных на сервере

Для удобной работы с механизмом партнерских программ мы создали модель Affiliate:

class Affiliate(models.Model):
    date = models.DateTimeField(default=timezone.now)
    owner = models.ForeignKey(User, related_name='owned_affiliates')
    member = models.ForeignKey(User, related_name='participating_affiliates')

Эта модель связывает двух пользователей и добавляет дату создания. Поле владельца представляет собой ссылку на пользователя, чтобы пригласить друга, и размещается у текущего пользователя, который был зарегистрирован по этой ссылке.

Когда вы регистрируете нового пользователя с непустым полем affiliateCode, мы проверяем базу данных для пользователя, которому принадлежит код:

def signup(request):
    data = json.loads(request.body)

    ...

    try:
        affiliate_code = data['affiliateCode']
        owner = User.objects.get(affiliate_code__iexact=affiliate_code)
        Affiliate.objects.create(owner=owner, member=user)
    except (KeyError, User.DoesNotExist) as e:
        pass

Теперь мы можем получить информацию обо всех приглашенных пользователях конкретного пользователя, обратившись к полю Owned_affiliates.

Благодаря Participating_affiliates мы можем понять, кто пригласил именно этого пользователя.

Для расчета какого-либо бонуса или других действий мы можем использовать приемник для модели Affiliate:

@receiver(post_save, sender=Affiliate)
def client_receiver(sender, instance, created, **kwargs):
    if created:
        ...

Вывод

Внедрение такой простой системы заняло много времени, но она прекрасно работает и решает все необходимые задачи. Кроме того, его достаточно легко расширить и внедрить новые функции, как в  нашем проекте.