Revenue Per Qualified Referral(RPQR )
RPQR — Revenue Per Qualified Referral
১. আগে একটা Real Story দিয়ে শুরু করি
🍔 FoodBD App এর কথা ধরো
তোমার manager তোমাকে জিজ্ঞেস করলো —
"আমাদের referral program কি আসলে কাজে আসছে? আমরা referral এ যে টাকা খরচ করছি সেটা কি worth it?"
তুমি বললে —
"Sir, এই মাসে ৩৫০ টা Qualified Referral হয়েছে!"
Manager বললো —
"৩৫০ টা হয়েছে ভালো কথা। কিন্তু এই ৩৫০ জন থেকে আমরা কত টাকা আয় করলাম? প্রতিটা Qualified Referral থেকে average কত টাকা আসছে?"
তুমি চুপ। 😶
এই প্রশ্নের উত্তরই হলো RPQR।
২. RPQR কী? (Definition)
RPQR = Revenue Per Qualified Referral
প্রতিটা Qualified Referral থেকে business গড়ে কত টাকা Revenue পাচ্ছে — সেটাই RPQR।
সহজ ভাষায়:
তুমি referral program চালালে
কিছু মানুষ Qualified Referral হলো
এই Qualified মানুষগুলো মিলে যত টাকার business করলো
সেটাকে মোট Qualified Referral দিয়ে ভাগ করলে
যা পাবে — সেটাই RPQR
৩. RPQR Formula
Total Revenue from Qualified Referrals
RPQR = ─────────────────────────────────────────────
Total Qualified Referrals
সহজ Example:
এই মাসে:
Qualified Referral = ১০০ জন
এই ১০০ জন মিলে Order করলো = ৳৫০,০০০
RPQR = ৳৫০,০০০ ÷ ১০০
RPQR = ৳৫০০
মানে — প্রতিটা Qualified Referral থেকে
গড়ে ৳৫০০ Revenue আসছে।
৪. Step by Step বুঝি — কোন Revenue count হবে?
এখানে অনেকে confuse হয়। "Revenue from Qualified Referrals" মানে কী?
দুইটা পদ্ধতি আছে:
পদ্ধতি ১ — শুধু First Order এর Revenue
Qualified Referral হওয়ার সময় যে order দিয়েছে
শুধু সেই order এর revenue count করা।
Example:
করিম Qualified হলো, তার first order ছিলো ৳৩০০
শুধু এই ৳৩০০ count হবে।
কখন use করে: Referral reward calculate করার সময়।
পদ্ধতি ২ — Lifetime Revenue (LTV Based)
Qualified Referee টা পরবর্তী সব orders এ
যত টাকা spend করেছে সব count করা।
Example:
করিম Qualified হলো
জানুয়ারিতে ৳৩০০
ফেব্রুয়ারিতে ৳৫০০
মার্চে ৳৪০০
─────────────────────
Total ৳১২০০ ← এটাই করিম এর lifetime revenue
কখন use করে: Referral program এর overall value বোঝার সময়।
⚠️ Important:
তোমার company কোন পদ্ধতি use করে সেটা mentor কে জিজ্ঞেস করো। সবসময় document এ লিখে রাখো কোন পদ্ধতিতে calculate হচ্ছে।
৫. বড় Example দিয়ে পুরোটা বুঝি
FoodBD App — এই মাসের Data:
┌──────────┬─────────────┬───────────────────────────────┬──────────────┐
│ নাম │ Qualified? │ Orders │ Total Spent │
├──────────┼─────────────┼───────────────────────────────┼──────────────┤
│ করিম │ ✅ │ ৳৩০০ + ৳৫০০ + ৳৪০০ │ ৳১,২০০ │
│ সুমন │ ✅ │ ৳৬০০ + ৳৩০০ │ ৳৯০০ │
│ নাফিস │ ✅ │ ৳৪০০ + ৳৪০০ + ৳৪০০ + ৳৪০০ │ ৳১,৬০০ │
│ মিম │ ✅ │ ৳২৫০ │ ৳২৫০ │
│ রাহেলা │ ✅ │ ৳৮০০ + ৳৭০০ │ ৳১,৫০০ │
└──────────┴─────────────┴───────────────────────────────┴──────────────┘
Total Qualified Referrals = ৫ জন
Total Revenue = ৳১২০০ + ৳৯০০ + ৳১৬০০ + ৳২৫০ + ৳১৫০০
= ৳৫,৪৫০
RPQR = ৳৫,৪৫০ ÷ ৫
RPQR = ৳১,০৯০
মানে — প্রতিটা Qualified Referral থেকে গড়ে ৳১,০৯০ Revenue আসছে।
৬. RPQR দিয়ে কী কী Decision নেওয়া যায়?
Decision ১ — Reward কত দেবো?
RPQR = ৳১,০৯০
মানে প্রতিটা Qualified Referral থেকে ৳১,০৯০ আসছে।
এখন যদি referrer কে ৳১০০ reward দাও → profit আছে ✅
যদি referrer কে ৳১,২০০ reward দাও → loss হচ্ছে ❌
Decision ২ — Referral Program Worth It কিনা?
এই মাসে referral program এ খরচ হয়েছে:
Reward দিয়েছি = ৳১০,০০০
Marketing cost = ৳৫,০০০
Total Cost = ৳১৫,০০০
Qualified Referral = ১০০ জন
RPQR = ৳৫০০
Total Revenue = ১০০ × ৳৫০০ = ৳৫০,০০০
Profit = ৳৫০,০০০ - ৳১৫,০০০ = ৳৩৫,০০০ ✅
Program worth it!
Decision ৩ — কোন Source এর RPQR বেশি?
WhatsApp referrals এর RPQR = ৳৮০০
Facebook referrals এর RPQR = ৳৪০০
Email referrals এর RPQR = ৳৩০০
Decision → WhatsApp এ বেশি focus করো।
WhatsApp referrals বেশি valuable।
৭. Database Structure
-- revenue tracking এর জন্য orders table লাগবে
CREATE TABLE orders (
id SERIAL PRIMARY KEY,
user_id INT NOT NULL, -- কে order করেছে
order_amount DECIMAL(10,2) NOT NULL, -- কত টাকার order
order_status VARCHAR(20), -- 'completed', 'cancelled'
ordered_at TIMESTAMP DEFAULT NOW()
);
-- referrals table এ revenue column add করা যায়
ALTER TABLE referrals
ADD COLUMN total_revenue DECIMAL(10,2) DEFAULT 0,
ADD COLUMN total_orders INT DEFAULT 0;
৮. SQL দিয়ে RPQR Calculate করা
Query 1 — Basic RPQR
SELECT
COUNT(DISTINCT r.id) AS qualified_referrals,
SUM(o.order_amount) AS total_revenue,
ROUND(
SUM(o.order_amount) /
NULLIF(COUNT(DISTINCT r.id), 0)
, 2) AS rpqr
FROM referrals r
-- Qualified Referral এর referee দের orders join করো
JOIN orders o
ON o.user_id = r.referee_id
AND o.order_status = 'completed'
WHERE r.is_qualified = TRUE
AND r.referred_at >= NOW() - INTERVAL '30 days';
Output:
qualified_referrals | total_revenue | rpqr
--------------------|---------------|-------
350 | 192500.00 | 550.00
Query 2 — Source wise RPQR
-- কোন source থেকে আসা referral সবচেয়ে বেশি revenue আনছে?
SELECT
r.referral_source,
COUNT(DISTINCT r.id) AS qualified_count,
SUM(o.order_amount) AS total_revenue,
ROUND(
SUM(o.order_amount) /
NULLIF(COUNT(DISTINCT r.id), 0)
, 2) AS rpqr
FROM referrals r
JOIN orders o
ON o.user_id = r.referee_id
AND o.order_status = 'completed'
WHERE r.is_qualified = TRUE
AND r.referred_at >= NOW() - INTERVAL '30 days'
GROUP BY r.referral_source
ORDER BY rpqr DESC;
Output:
referral_source | qualified_count | total_revenue | rpqr
----------------|-----------------|---------------|-------
whatsapp | 150 | 120000.00 | 800.00
facebook | 100 | 40000.00 | 400.00
email | 60 | 18000.00 | 300.00
direct | 40 | 10000.00 | 250.00
Query 3 — Monthly RPQR Trend
-- প্রতি মাসে RPQR কেমন ছিলো?
SELECT
TO_CHAR(r.referred_at, 'YYYY-MM') AS month,
COUNT(DISTINCT r.id) AS qualified_referrals,
ROUND(SUM(o.order_amount), 2) AS total_revenue,
ROUND(
SUM(o.order_amount) /
NULLIF(COUNT(DISTINCT r.id), 0)
, 2) AS rpqr
FROM referrals r
JOIN orders o
ON o.user_id = r.referee_id
AND o.order_status = 'completed'
WHERE r.is_qualified = TRUE
AND r.referred_at >= NOW() - INTERVAL '6 months'
GROUP BY TO_CHAR(r.referred_at, 'YYYY-MM')
ORDER BY month;
Output:
month | qualified_referrals | total_revenue | rpqr
--------|---------------------|---------------|-------
2024-08 | 200 | 90000.00 | 450.00
2024-09 | 250 | 120000.00 | 480.00
2024-10 | 300 | 150000.00 | 500.00
2024-11 | 320 | 172800.00 | 540.00
2024-12 | 340 | 187000.00 | 550.00
2025-01 | 350 | 192500.00 | 550.00
RPQR মাসে মাসে বাড়ছে — referral program healthy! ✅
৯. Python দিয়ে RPQR Analyze করা
import pandas as pd
import psycopg2
conn = psycopg2.connect(
host="your-host",
database="your_db",
user="your_user",
password="your_password"
)
# Qualified Referrals এবং তাদের orders
query = """
SELECT
r.id AS referral_id,
r.referrer_id,
r.referee_id,
r.referral_source,
r.referred_at,
r.qualified_at,
o.order_amount,
o.ordered_at
FROM referrals r
JOIN orders o
ON o.user_id = r.referee_id
AND o.order_status = 'completed'
WHERE r.is_qualified = TRUE
AND r.referred_at >= NOW() - INTERVAL '30 days'
"""
df = pd.read_sql(query, conn)
conn.close()
# =============================================
# BASIC RPQR
# =============================================
total_revenue = df['order_amount'].sum()
qualified_referrals = df['referral_id'].nunique()
rpqr = total_revenue / qualified_referrals
print("============================================")
print(" RPQR REPORT (Last 30 Days) ")
print("============================================")
print(f"Qualified Referrals : {qualified_referrals}")
print(f"Total Revenue : ৳{total_revenue:,.2f}")
print(f"RPQR : ৳{rpqr:,.2f}")
print("============================================")
Output:
============================================
RPQR REPORT (Last 30 Days)
============================================
Qualified Referrals : 350
Total Revenue : ৳192,500.00
RPQR : ৳550.00
============================================
# =============================================
# SOURCE WISE RPQR
# =============================================
source_rpqr = df.groupby('referral_source').agg(
qualified_count = ('referral_id', 'nunique'),
total_revenue = ('order_amount', 'sum')
).reset_index()
source_rpqr['rpqr'] = (
source_rpqr['total_revenue'] /
source_rpqr['qualified_count']
).round(2)
source_rpqr = source_rpqr.sort_values('rpqr', ascending=False)
print("\n===== RPQR by Source =====")
print(source_rpqr.to_string(index=False))
# =============================================
# TOP REFERRERS BY RPQR
# =============================================
referrer_rpqr = df.groupby('referrer_id').agg(
qualified_count = ('referral_id', 'nunique'),
total_revenue = ('order_amount', 'sum')
).reset_index()
referrer_rpqr['rpqr'] = (
referrer_rpqr['total_revenue'] /
referrer_rpqr['qualified_count']
).round(2)
top_referrers = (
referrer_rpqr
.sort_values('rpqr', ascending=False)
.head(5)
)
print("\n===== Top 5 Referrers by RPQR =====")
print(top_referrers.to_string(index=False))
Output:
===== RPQR by Source =====
referral_source qualified_count total_revenue rpqr
whatsapp 150 120000.00 800.00
facebook 100 40000.00 400.00
email 60 18000.00 300.00
direct 40 10000.00 250.00
===== Top 5 Referrers by RPQR =====
referrer_id qualified_count total_revenue rpqr
1023 18 25200.00 1400.00
2045 12 15600.00 1300.00
3012 7 8400.00 1200.00
4089 15 16500.00 1100.00
5023 10 10500.00 1050.00
১০. ETL — Daily RPQR Automatically Calculate
# etl_calculate_rpqr.py
# প্রতিদিন রাত ১টায় CRON এ run হবে
import psycopg2
from datetime import datetime
def calculate_daily_rpqr():
conn = psycopg2.connect(
host="your-host",
database="your_db",
user="your_user",
password="your_password"
)
cursor = conn.cursor()
# Daily RPQR calculate করে একটা summary table এ insert করো
insert_query = """
INSERT INTO rpqr_daily_summary (
summary_date,
qualified_referrals,
total_revenue,
rpqr
)
SELECT
CURRENT_DATE AS summary_date,
COUNT(DISTINCT r.id) AS qualified_referrals,
COALESCE(SUM(o.order_amount), 0) AS total_revenue,
ROUND(
COALESCE(SUM(o.order_amount), 0) /
NULLIF(COUNT(DISTINCT r.id), 0)
, 2) AS rpqr
FROM referrals r
LEFT JOIN orders o
ON o.user_id = r.referee_id
AND o.order_status = 'completed'
AND o.ordered_at::DATE = CURRENT_DATE
WHERE r.is_qualified = TRUE
AND r.qualified_at::DATE = CURRENT_DATE
-- Already inserted হলে update করো
ON CONFLICT (summary_date)
DO UPDATE SET
qualified_referrals = EXCLUDED.qualified_referrals,
total_revenue = EXCLUDED.total_revenue,
rpqr = EXCLUDED.rpqr,
updated_at = NOW()
"""
cursor.execute(insert_query)
conn.commit()
print(f"[{datetime.now()}] Daily RPQR ETL Complete.")
cursor.close()
conn.close()
if __name__ == "__main__":
calculate_daily_rpqr()
Crontab:
# প্রতিদিন রাত ১টায় run হবে
0 1 * * * /usr/bin/python3 /home/etl/etl_calculate_rpqr.py
১১. সব Metrics একসাথে — Big Picture
১০০০ Referral Sent
│
▼
৪০০ Converted ← Conversion Rate = 40%
│
▼
৩৫০ Qualified ← QRR = 35% (Sent Based)
│ 87.5% (Converted Based)
▼
৳১৯২,৫০০ Revenue ← RPQR = ৳৫৫০ per Qualified Referral
এই তিনটা metric একসাথে দেখলে পুরো picture পাওয়া যায়:
- Conversion Rate → কতজন আসছে
- QRR → কতজন কাজের
- RPQR → কাজের মানুষগুলো কত টাকা আনছে
১২. Superset Dashboard SQL
-- RPQR KPI Card এর জন্য
SELECT
ROUND(
SUM(o.order_amount) /
NULLIF(COUNT(DISTINCT r.id), 0)
, 2) AS rpqr
FROM referrals r
JOIN orders o
ON o.user_id = r.referee_id
AND o.order_status = 'completed'
WHERE r.is_qualified = TRUE
AND r.referred_at >= NOW() - INTERVAL '30 days';
সারসংক্ষেপ 🎯
| বিষয় | মূল কথা |
|---|---|
| RPQR কী | প্রতিটা Qualified Referral থেকে গড়ে কত Revenue আসে |
| Formula | Total Revenue ÷ Total Qualified Referrals |
| কেন দরকার | Referral program এর আসল value বোঝার জন্য |
| Reward decision | RPQR এর চেয়ে কম reward দিলে profit থাকে |
| Source analysis | কোন source এর RPQR বেশি সেখানে বেশি invest করো |
| Production এ | Daily ETL দিয়ে auto calculate, Superset এ দেখাও |