Qualified Referrals & Qualified Referral Rate
Qualified Referrals & Qualified Referral Rate
১. আগে একটা Real Story দিয়ে শুরু করি
🏪 ধরো "FoodBD" App এর কথা
রহিম তার ৫ জন বন্ধুকে referral link পাঠালো।
বন্ধু ১ — করিম → Sign up করলো, একটা order দিলো ✅
বন্ধু ২ — রফিক → Sign up করলো, কিছুই করলো না ❌
বন্ধু ৩ — সুমন → Sign up করলো, ৩টা order দিলো ✅
বন্ধু ৪ — জামাল → Sign up করলো, ১ টাকার order দিলো 🤔
বন্ধু ৫ — তামিম → Sign up করলো কিন্তু fake নাম দিলো ❌
এখন প্রশ্ন হলো —
এই ৫ টা referral কি সবগুলো business এর কাছে সমান valuable?
উত্তর হলো — না।
Business চায় এমন referee যে actually valuable customer হবে। সবাই sign up করলেই হবে না।
এই "actually valuable" referral গুলোকেই বলা হয় Qualified Referral।
২. Qualified Referral কী? (Definition)
Qualified Referral হলো এমন একটা referral যেখানে referee business এর নির্ধারিত সব criteria পূরণ করেছে — শুধু sign up না, বরং সত্যিকারের একজন valuable customer হিসেবে প্রমাণিত হয়েছে।
সহজ ভাষায়:
সব Referral = যত মানুষ refer করা হয়েছে
│
▼
সব Converted = যারা sign up বা কিছু একটা করেছে
│
▼
Qualified Referral = যারা business এর সব rules মেনে
সত্যিকারের customer হয়েছে ✅
৩. "Criteria" বা "Rules" মানে কী?
Business নিজেই decide করে কোন referee কে Qualified বলা হবে। এই rules কে বলা হয় Qualification Criteria।
বিভিন্ন Business এর Criteria:
🍔 Food Delivery App (FoodBD)
Qualified হতে হলে referee কে:
✅ Sign up করতে হবে
✅ ৭ দিনের মধ্যে প্রথম order দিতে হবে
✅ Minimum ৳২০০ এর order হতে হবে
✅ Real phone number verify করতে হবে
৪. Qualified vs Non-Qualified — পার্থক্য
FoodBD App এর উদাহরণে ফিরে যাই:
বন্ধু ১ — করিম → Sign up ✅, Order দিলো ✅, ৳৩০০ ✅, Verified ✅
→ QUALIFIED ✅
বন্ধু ২ — রফিক → Sign up ✅, Order দিলো ❌
→ NOT QUALIFIED ❌
(order দেয়নি)
বন্ধু ৩ — সুমন → Sign up ✅, Order দিলো ✅, ৳৫০০ ✅, Verified ✅
→ QUALIFIED ✅
বন্ধু ৪ — জামাল → Sign up ✅, Order দিলো ✅, মাত্র ৳৫০ ❌
→ NOT QUALIFIED ❌
(minimum amount পূরণ হয়নি)
বন্ধু ৫ — তামিম → Sign up ✅, Fake info ❌
→ NOT QUALIFIED ❌
(verification fail)
Summary:
Total Referrals = ৫
Converted = ৪ (sign up করেছে)
Qualified Referrals = ২ (করিম + সুমন)
৫. Qualified Referral Rate (QRR) কী?
Qualified Referral Rate হলো — মোট referral এর মধ্যে কতটা Qualified Referral হয়েছে তার percentage।
Formula:
Qualified Referrals
QRR = ─────────────────────────────────────── × ১০০
Total Referrals
FoodBD Example দিয়ে Calculate:
Qualified Referrals = ২ (করিম + সুমন)
Total Referrals = ৫
QRR = (২ / ৫) × ১০০
QRR = 40%
মানে — রহিম ৫ জনকে পাঠিয়েছিলো, তার মধ্যে ৪০% Qualified হয়েছে।
৬. QRR কোন Base এ Calculate করবে?
এখানে একটু সতর্ক থাকতে হবে। QRR calculate করার সময় denominator (নিচের সংখ্যা) কী হবে সেটা company decide করে।
তিনটা Common পদ্ধতি:
পদ্ধতি ১ — Total Referrals Sent এর উপর
QRR = Qualified / Total Sent × ১০০
Example:
Qualified = ২০০
Total Sent = ১০০০
QRR = (২০০/১০০০) × ১০০ = 20%
এটা সবচেয়ে strict calculation।
পদ্ধতি ২ — Total Converted এর উপর
QRR = Qualified / Total Converted × ১০০
Example:
Qualified = ২০০
Total Converted (signed up) = ৪০০
QRR = (২০০/৪০০) × ১০০ = 50%
এটা দেখায় — যারা এসেছে তাদের মধ্যে কতজন কাজের।
পদ্ধতি ৩ — Total Clicked এর উপর
QRR = Qualified / Total Clicked × ১০০
Example:
Qualified = ২০০
Total Clicked = ৬০০
QRR = (২০০/৬০০) × ১০০ = 33.3%
⚠️ Important:
তোমার company কোন পদ্ধতি use করে সেটা mentor কে জিজ্ঞেস করো। সব কোম্পানি একই পদ্ধতি use করে না। Documentation এ সবসময় লিখে রাখো কোন base এ calculate হচ্ছে।
৭. Database — Qualified Referral কীভাবে Store হয়?
-- referrals table এ qualified এর জন্য extra columns থাকে
CREATE TABLE referrals (
id SERIAL PRIMARY KEY,
referrer_id INT NOT NULL,
referee_id INT NOT NULL,
referral_code VARCHAR(50),
referral_source VARCHAR(50),
-- Basic tracking
status VARCHAR(20) DEFAULT 'pending',
referred_at TIMESTAMP DEFAULT NOW(),
converted_at TIMESTAMP,
-- Qualification tracking
is_qualified BOOLEAN DEFAULT FALSE, -- Qualified হয়েছে কিনা
qualified_at TIMESTAMP, -- কখন Qualified হয়েছে
qualification_reason VARCHAR(100), -- কেন Qualified/Disqualified
-- Criteria tracking
is_verified BOOLEAN DEFAULT FALSE, -- Phone/NID verify হয়েছে কিনা
first_order_amount DECIMAL(10,2), -- প্রথম order এর amount
first_order_at TIMESTAMP, -- প্রথম order এর সময়
days_to_qualify INT, -- কতদিনে qualified হলো
-- Reward
reward_given BOOLEAN DEFAULT FALSE
);
৮. SQL দিয়ে Qualified Referral বের করা
Query 1 — Basic Qualified Count
SELECT
COUNT(*) AS total_referrals,
SUM(CASE WHEN is_qualified = TRUE THEN 1 END) AS qualified_referrals,
SUM(CASE WHEN is_qualified = FALSE THEN 1 END) AS not_qualified,
-- QRR calculation (Total Sent based)
ROUND(
SUM(CASE WHEN is_qualified = TRUE THEN 1 ELSE 0 END)
* 100.0 / COUNT(*), 2
) AS qrr_percentage
FROM referrals
WHERE referred_at >= NOW() - INTERVAL '30 days';
Output:
total_referrals | qualified_referrals | not_qualified | qrr_percentage
----------------|---------------------|---------------|---------------
1000 | 350 | 650 | 35.00
Query 2 — কেন Qualified হয়নি (Disqualification Reason)
SELECT
qualification_reason,
COUNT(*) AS count,
ROUND(COUNT(*) * 100.0 / SUM(COUNT(*)) OVER (), 2) AS percentage
FROM referrals
WHERE is_qualified = FALSE
AND referred_at >= NOW() - INTERVAL '30 days'
GROUP BY qualification_reason
ORDER BY count DESC;
Output:
qualification_reason | count | percentage
------------------------------|-------|----------
no_first_order | 300 | 46.15%
order_below_minimum_amount | 150 | 23.08%
verification_failed | 120 | 18.46%
order_after_deadline | 80 | 12.31%
এই data দেখে business বুঝতে পারবে কোথায় সমস্যা আছে। যেমন — ৪৬% referee order-ই দিচ্ছে না। Solution — first order এ extra discount দাও।
Query 3 — Referrer অনুযায়ী QRR
-- কোন referrer এর QRR সবচেয়ে বেশি?
SELECT
r.referrer_id,
COUNT(*) AS total_referred,
SUM(CASE WHEN r.is_qualified = TRUE THEN 1 ELSE 0 END) AS qualified_count,
ROUND(
SUM(CASE WHEN r.is_qualified = TRUE THEN 1 ELSE 0 END)
* 100.0 / COUNT(*), 2
) AS referrer_qrr
FROM referrals r
WHERE r.referred_at >= NOW() - INTERVAL '30 days'
GROUP BY r.referrer_id
HAVING COUNT(*) >= 5 -- কমপক্ষে ৫টা referral আছে এমন
ORDER BY referrer_qrr DESC
LIMIT 10;
Output:
referrer_id | total_referred | qualified_count | referrer_qrr
------------|----------------|-----------------|-------------
1023 | 20 | 18 | 90.00%
2045 | 15 | 12 | 80.00%
3012 | 10 | 7 | 70.00%
User 1023 সবচেয়ে বেশি qualified referee পাঠাচ্ছে। এই user কে "Super Referrer" বলা হয়। Business এদেরকে extra reward দিতে পারে।
৯. Python দিয়ে Qualified Referral Analyze করা
import pandas as pd
import psycopg2
conn = psycopg2.connect(
host="your-host",
database="your_db",
user="your_user",
password="your_password"
)
query = """
SELECT
id,
referrer_id,
referee_id,
referral_source,
referred_at,
converted_at,
is_qualified,
qualified_at,
qualification_reason,
first_order_amount,
is_verified
FROM referrals
WHERE referred_at >= NOW() - INTERVAL '30 days'
"""
df = pd.read_sql(query, conn)
conn.close()
# =============================================
# BASIC METRICS
# =============================================
total_referrals = len(df)
total_converted = df['converted_at'].notna().sum()
total_qualified = df['is_qualified'].sum()
# QRR — Total Sent Based
qrr_sent_based = (total_qualified / total_referrals) * 100
# QRR — Converted Based
qrr_converted_based = (total_qualified / total_converted) * 100
print("============================================")
print(" QUALIFIED REFERRAL REPORT ")
print("============================================")
print(f"Total Referrals Sent : {total_referrals}")
print(f"Total Converted : {total_converted}")
print(f"Total Qualified : {total_qualified}")
print(f"Not Qualified : {total_referrals - total_qualified}")
print(f"--------------------------------------------")
print(f"QRR (Sent Based) : {qrr_sent_based:.2f}%")
print(f"QRR (Converted Based) : {qrr_converted_based:.2f}%")
print("============================================")
Output:
============================================
QUALIFIED REFERRAL REPORT
============================================
Total Referrals Sent : 1000
Total Converted : 500
Total Qualified : 350
Not Qualified : 650
--------------------------------------------
QRR (Sent Based) : 35.00%
QRR (Converted Based) : 70.00%
============================================
# =============================================
# SOURCE WISE QRR ANALYSIS
# =============================================
source_analysis = df.groupby('referral_source').agg(
total = ('id', 'count'),
qualified = ('is_qualified', 'sum')
).reset_index()
source_analysis['qrr'] = (
source_analysis['qualified'] / source_analysis['total'] * 100
).round(2)
source_analysis = source_analysis.sort_values('qrr', ascending=False)
print("\n===== QRR by Source =====")
print(source_analysis.to_string(index=False))
Output:
===== QRR by Source =====
referral_source total qualified qrr
whatsapp 500 200 40.0%
facebook 300 105 35.0%
email 150 37 24.7%
direct 50 8 16.0%
WhatsApp থেকে আসা referrals এর QRR সবচেয়ে বেশি।
# =============================================
# DISQUALIFICATION REASON ANALYSIS
# =============================================
not_qualified_df = df[df['is_qualified'] == False]
disqual_reasons = (
not_qualified_df['qualification_reason']
.value_counts()
.reset_index()
)
disqual_reasons.columns = ['reason', 'count']
disqual_reasons['percentage'] = (
disqual_reasons['count'] / len(not_qualified_df) * 100
).round(2)
print("\n===== Why Referrals Are NOT Qualifying =====")
print(disqual_reasons.to_string(index=False))
Output:
===== Why Referrals Are NOT Qualifying =====
reason count percentage
no_first_order 300 46.15%
order_below_minimum_amount 150 23.08%
verification_failed 120 18.46%
order_after_deadline 80 12.31%
১০. ETL Pipeline — Daily QRR Calculate করা
Production এ প্রতিদিন automatically QRR calculate হবে।
# etl_qualify_referrals.py
# প্রতিদিন সকালে CRON এ run হবে
import psycopg2
from datetime import datetime
# Qualification Criteria (FoodBD App)
MIN_ORDER_AMOUNT = 200 # ৳২০০ minimum
DAYS_TO_QUALIFY = 7 # ৭ দিনের মধ্যে order করতে হবে
def qualify_referrals():
conn = psycopg2.connect(
host="your-host",
database="your_db",
user="your_user",
password="your_password"
)
cursor = conn.cursor()
# STEP 1 — নতুন qualified referrals mark করো
qualify_query = """
UPDATE referrals r
SET
is_qualified = TRUE,
qualified_at = NOW(),
qualification_reason = 'all_criteria_met'
WHERE
r.is_qualified = FALSE
AND r.is_verified = TRUE
AND r.first_order_amount >= %(min_amount)s
AND r.first_order_at IS NOT NULL
AND r.first_order_at <= r.referred_at
+ INTERVAL '7 days'
"""
cursor.execute(qualify_query, {'min_amount': MIN_ORDER_AMOUNT})
qualified_count = cursor.rowcount
print(f"Newly Qualified: {qualified_count}")
# STEP 2 — Failed referrals mark করো (deadline পার হয়ে গেছে)
disqualify_query = """
UPDATE referrals
SET
is_qualified = FALSE,
qualification_reason = 'order_after_deadline'
WHERE
is_qualified = FALSE
AND status = 'pending'
AND referred_at < NOW() - INTERVAL '7 days'
AND first_order_at IS NULL
"""
cursor.execute(disqualify_query)
disqualified_count = cursor.rowcount
print(f"Disqualified (expired): {disqualified_count}")
conn.commit()
cursor.close()
conn.close()
print(f"[{datetime.now()}] ETL Complete.")
if __name__ == "__main__":
qualify_referrals()
Crontab:
# প্রতিদিন সকাল ৬টায় run হবে
0 6 * * * /usr/bin/python3 /home/etl/etl_qualify_referrals.py
১১. Superset Dashboard এর জন্য SQL
-- Daily QRR Trend — Superset Line Chart
SELECT
DATE(referred_at) AS date,
COUNT(*) AS total_referrals,
SUM(CASE WHEN is_qualified = TRUE
THEN 1 ELSE 0 END) AS qualified_count,
ROUND(
SUM(CASE WHEN is_qualified = TRUE
THEN 1 ELSE 0 END)
* 100.0 / NULLIF(COUNT(*), 0), 2
) AS qrr_percentage
FROM referrals
WHERE referred_at >= NOW() - INTERVAL '30 days'
GROUP BY DATE(referred_at)
ORDER BY date;
এই query দিয়ে Superset এ Line Chart বানাও। X-axis = date, Y-axis = qrr_percentage। দেখতে পাবে কোন দিনে QRR বেশি বা কম।
১২. QRR ভালো না খারাপ — কীভাবে বুঝবো?
QRR কত হলে ভালো সেটা industry এবং business এর উপর নির্ভর করে।
কিন্তু সাধারণ একটা idea:
QRR < 20% → ⚠️ খারাপ — criteria খুব কঠিন বা referral quality কম
QRR 20-40% → ✅ ঠিকঠাক — industry average
QRR 40-60% → 🌟 ভালো — referral program healthy
QRR > 60% → 🚀 অনেক ভালো — অথবা criteria খুব সহজ কিনা দেখো
১৩. Common Mistakes ⚠️
| Mistake | সমস্যা | সমাধান |
|---|---|---|
| Criteria document না করা | সবাই আলাদা বোঝে | Confluence/Notion এ clearly লিখে রাখো |
| Criteria মাঝে মাঝে change করা | Historical data inconsistent হয় | Change করলে version track করো |
| QRR এর base না বলা | ৩৫% মানে কোন base এ? | সবসময় বলো "Sent Based QRR = ৩৫%" |
| Fraud referral check না করা | একজন multiple account বানিয়ে inflate করে | Device ID, IP address check করো |
| NULL handle না করা | SQL এ divide by zero error | NULLIF() use করো |
সারসংক্ষেপ 🎯
| বিষয় | মূল কথা |
|---|---|
| Qualified Referral | Business এর সব criteria পূরণ করা referee |
| Criteria | Company নিজে define করে — verify, order amount, deadline |
| QRR Formula | (Qualified ÷ Total) × ১০০ |
| QRR এর Base | Sent / Converted / Clicked — company decide করে |
| Production এ | ETL দিয়ে daily auto-qualify, CRON এ run করো |
| Dashboard এ | Daily trend, source wise, referrer wise দেখাও |
| সতর্কতা | Fraud check, NULL handle, criteria document করো |
Converted vs Qualified Referral — পার্থক্য
এক লাইনে পার্থক্য
Converted = referee কিছু একটা করেছে
Qualified = referee সঠিকভাবে সব rules মেনে করেছে
Real Life দিয়ে বোঝো
🏫 School Exam এর Example
ধরো পরীক্ষায় pass করতে হলে ৩টা condition:
✅ ১. পরীক্ষা দিতে হবে
✅ ২. কমপক্ষে ৩৩ নম্বর পেতে হবে
✅ ৩. সব subject এ দিতে হবে
এখন ৫ জন student:
করিম → পরীক্ষা দিলো, ৭০ পেলো, সব subject দিলো → PASS ✅
রফিক → পরীক্ষা দিলো, ২০ পেলো → FAIL ❌
সুমন → পরীক্ষা দিলো, ৫০ পেলো, ১ subject বাদ → FAIL ❌
জামাল → পরীক্ষা দিলো, ৩৩ পেলো, সব subject দিলো → PASS ✅
তামিম → পরীক্ষা দিলো কিন্তু খাতা জমা দেয়নি → FAIL ❌
এখানে:
- ৫ জনই পরীক্ষা দিয়েছে = ৫ জনই "Converted" (কিছু একটা করেছে)
- করিম + জামাল = "Qualified" (সব rules মেনেছে)
এখন Referral এ Apply করো
🍔 FoodBD App এর Qualification Rules:
✅ ১. Sign up করতে হবে
✅ ২. ৭ দিনের মধ্যে order করতে হবে
✅ ৩. Minimum ৳২০০ এর order হতে হবে
✅ ৪. Phone number verify করতে হবে
৫ জন Referee:
┌─────────┬──────────┬──────────┬──────────┬──────────┬────────────┬───────────┐
│ নাম │ Sign Up │ Order │ Amount │ Verified │ Converted? │ Qualified?│
├─────────┼──────────┼──────────┼──────────┼──────────┼────────────┼───────────┤
│ করিম │ ✅ │ ✅ │ ৳৩০০ │ ✅ │ ✅ YES │ ✅ YES │
│ রফিক │ ✅ │ ❌ │ - │ ✅ │ ✅ YES │ ❌ NO │
│ সুমন │ ✅ │ ✅ │ ৳৫০০ │ ✅ │ ✅ YES │ ✅ YES │
│ জামাল │ ✅ │ ✅ │ ৳৫০ │ ✅ │ ✅ YES │ ❌ NO │
│ তামিম │ ✅ │ ❌ │ - │ ❌ │ ✅ YES │ ❌ NO │
└─────────┴──────────┴──────────┴──────────┴──────────┴────────────┴───────────┘
Result:
Total Referrals = ৫
Converted = ৫ (সবাই sign up করেছে — কিছু একটা করেছে)
Qualified = ২ (করিম + সুমন — সব rules মেনেছে)
কেন রফিক Converted কিন্তু Qualified না?
রফিক sign up করেছে → তাই Converted = YES ✅
রফিক order দেয়নি → তাই Qualified = NO ❌
কেন জামাল Converted কিন্তু Qualified না?
জামাল sign up করেছে → তাই Converted = YES ✅
জামালের order ৳৫০ → Minimum ৳২০০ হয়নি
→ তাই Qualified = NO ❌
সবচেয়ে সহজ মনে রাখার উপায় 🧠
CONVERTED = Gate এ ঢুকেছে
QUALIFIED = Gate এ ঢুকে সব কাজ সঠিকভাবে শেষ করেছে
Mall এর উদাহরণ:
Converted = Mall এ প্রবেশ করেছে
Qualified = Mall এ ঢুকে কিছু কিনেছে, receipt আছে,
valid payment করেছে
Relationship টা কী?
সব Qualified Referral ই Converted ✅
কিন্তু
সব Converted Referral Qualified না ❌
Venn Diagram:
┌─────────────────────────────────┐
│ │
│ CONVERTED (বড় দল) │
│ │
│ ┌───────────────────┐ │
│ │ │ │
│ │ QUALIFIED │ │
│ │ (ছোট দল) │ │
│ │ │ │
│ └───────────────────┘ │
│ │
└─────────────────────────────────┘
Qualified সবসময় Converted এর ভেতরে থাকে।
Number এ পার্থক্য দেখো
১০০০ Referral পাঠানো হলো
│
▼
৪০০ Sign Up করলো ← এরা সবাই CONVERTED
│
├── ২০০ জন order দিলো কিন্তু amount কম
├── ৫০ জন verify করলো না
└── ১৫০ জন সব criteria পূরণ করলো ← এরাই QUALIFIED
Converted = ৪০০
Qualified = ১৫০
Qualified সবসময় Converted এর চেয়ে কম বা সমান।
কখনো বেশি হতে পারে না।
এক কথায় মনে রাখো 💡
Converted = "এসেছে"
Qualified = "এসে কাজের মানুষ হয়েছে"