Возможно, есть решения для фреймворков, предоставляющие базовые возможности.
Технически, это можно реализовать так:
Для каждого пользователя хранить реферальный код ($ref_code) и id пользователя ($ref_user_id), через чей реферальный код выполнялась регистрация.
При get запросе в браузере с реферальным кодом сохранять его в сессии и использовать потом при регистрации нового пользователя. По реф. коду ищется его владелец и сохраняется в атрибуте нового пользователя как $ref_user_id.
Далее используешь эти данные при наступлении нужного события, например, оплаты. Зачисляешь какой-то процент пользователю с id равным $ref_user_id текущего пользователя, если он есть.