CPC-CPM-CTR
CPC & CPM & CTR — সম্পূর্ণ ব্যাখ্যা 📖
১. আগে একটা Real Story দিয়ে শুরু করি
🏪 ধরো FoodBD App এর Marketing Team এর কথা
Marketing manager তোমাকে ডেকে বললো —
"আমরা এই মাসে Facebook এ Ad দিয়েছি ৳৫০,০০০ খরচ করে। এই টাকা কি ঠিকঠাক খরচ হয়েছে? আমরা কি ঠকেছি নাকি লাভ হয়েছে?"
এই প্রশ্নের উত্তর দিতে হলে তোমাকে জানতে হবে —
- Ad দেখে কতজন Click করেছে → CPC
- Ad কতজন মানুষ দেখেছে → CPM
এই দুইটা metric দিয়েই Ad এর efficiency মাপা হয়।
২. কিছু Basic শব্দ আগে বুঝি
এই দুইটা metric বোঝার আগে কিছু basic terms জানা দরকার।
📢 Impression কী?
তোমার Facebook feed এ একটা FoodBD এর Ad দেখা গেলো।
তুমি click করলে বা না করলে — শুধু দেখলেই
এটা ১ টা IMPRESSION।
Impression = Ad টা কতবার মানুষের সামনে দেখা গেছে
১০০০ জন মানুষের feed এ Ad দেখা গেলো
→ ১০০০ Impressions
👆 Click কী?
তুমি FoodBD এর Ad দেখলে এবং
সেই Ad এ Click করলে।
এটা ১ টা CLICK।
Click = কতজন Ad এ actually click করেছে
💰 Ad Spend কী?
FoodBD এই মাসে Facebook Ad এ
৳৫০,০০০ টাকা দিয়েছে।
এটাই AD SPEND।
Ad Spend = Ad এ মোট কত টাকা খরচ হয়েছে
৩. CPC কী? (Cost Per Click)
Definition:
CPC = প্রতিটা Click এর জন্য কত টাকা খরচ হয়েছে
CPC = একটি ad এ প্রতি click এর জন্য company কত টাকা খরচ করছে
Simple Meaning
Company ad দিল → user click করলো → company টাকা দিল
Formula:
Total Ad Spend
CPC = ──────────────────
Total Clicks
Simple Example:
FoodBD এই মাসে:
Ad Spend = ৳১০,০০০
Total Clicks = ৫০০
CPC = ৳১০,০০০ ÷ ৫০০
CPC = ৳২০
মানে — প্রতিটা Click এর জন্য ৳২০ খরচ হয়েছে।
Real Life Example দিয়ে বুঝি:
তুমি একটা দোকান দিয়েছো।
দোকানের সামনে একজন লোক দাঁড়িয়ে
পথচারীদের leaflet দিচ্ছে।
১০০ জনকে leaflet দেওয়া হলো।
তার মধ্যে ১০ জন দোকানে ঢুকলো।
লোকটাকে তুমি ৳১০০০ দিলে।
CPC = ৳১০০০ ÷ ১০ = ৳১০০
মানে প্রতিটা "ঢোকা" এর জন্য ৳১০০ খরচ।
৪. CPM কী? (Cost Per Mille)
"Mille" মানে কী?
"Mille" একটা Latin শব্দ।
এর মানে হলো — "১০০০"
তাই CPM মানে —
Cost Per 1000 Impressions
(১০০০ বার Ad দেখানোর জন্য কত খরচ)
Definition:
CPM = ১০০০ জন মানুষের কাছে Ad পৌঁছাতে কত টাকা খরচ হয়
CPM = 1000 বার ad দেখাতে company কত টাকা খরচ করছে
Simple Meaning
Ad show হলো → user click করুক বা না করুক → cost লাগবে
Formula:
Total Ad Spend
CPM = ───────────────────── × ১০০০
Total Impressions
Simple Example:
FoodBD এই মাসে:
Ad Spend = ৳১০,০০০
Total Impressions = ৫,০০,০০০
CPM = (৳১০,০০০ ÷ ৫,০০,০০০) × ১০০০
CPM = ৳২০
মানে — ১০০০ জন মানুষের কাছে Ad পৌঁছাতে ৳২০ খরচ হয়েছে।
Real Life Example দিয়ে বুঝি:
তুমি একটা Newspaper এ Ad দিলে।
সেই Newspaper টা ১,০০,০০০ মানুষ পড়ে।
Ad এর জন্য তুমি ৳২০০০ দিলে।
CPM = (৳২০০০ ÷ ১,০০,০০০) × ১০০০
CPM = ৳২০
মানে — ১০০০ জন পাঠকের কাছে পৌঁছাতে ৳২০ লাগলো।
৫. CPC vs CPM — কোনটা কখন use করে?
┌─────────────────────┬──────────────────────────────────────┐
│ CPC │ CPM │
├─────────────────────┼──────────────────────────────────────┤
│ Click গুরুত্বপূর্ণ │ দেখানোটাই গুরুত্বপূর্ণ │
│ মানুষ action নিক │ Brand পরিচিত করতে চাই │
│ App install করুক │ যত বেশি মানুষ দেখুক │
│ Sign up করুক │ নতুন product launch │
│ Purchase করুক │ Awareness বাড়াতে চাই │
├─────────────────────┼──────────────────────────────────────┤
│ Example: │ Example: │
│ FoodBD App install │ FoodBD নতুন feature launch │
│ Pathao signup │ Eid sale আসছে — জানাতে চাই │
└─────────────────────┴──────────────────────────────────────┘
৬. আরেকটা Important Term — CTR
CPC/CPM এর সাথে CTR সবসময় আসে।
CTR = Click Through Rate
কতজন Ad দেখেছে তার মধ্যে কতজন Click করেছে — তার percentage
Formula:
Total Clicks
CTR = ───────────────── × ১০০
Total Impressions
Example:
Impressions = ১০,০০০
Clicks = ২০০
CTR = (২০০ ÷ ১০,০০০) × ১০০
CTR = 2%
মানে — ১০০ জনের মধ্যে ২ জন click করেছে।
CTR কত হলে ভালো?
CTR < 1% → ⚠️ Ad টা মানুষ পছন্দ করছে না
CTR 1% - 3% → ✅ Average — ঠিকঠাক আছে
CTR 3% - 5% → 🌟 ভালো
CTR > 5% → 🚀 অনেক ভালো
৭. তিনটা Metric এর সম্পর্ক
একটা সহজ সম্পর্ক আছে CPC, CPM আর CTR এর মধ্যে:
CPM
CPC = ────────────────
CTR × ১০
Example:
CPM = ৳২০
CTR = 2%
CPC = ৳২০ ÷ (২ × ১০)
CPC = ৳২০ ÷ ২০
CPC = ৳১
CTR বাড়লে CPC কমে। মানে — Ad ভালো হলে প্রতিটা click এর খরচ কমে।
৮. Real Scenario — তিনটা Platform Compare করি
FoodBD এই মাসে তিন জায়গায় Ad দিয়েছে:
┌──────────────┬────────────┬─────────────┬────────────┬───────┬────────┐
│ Platform │ Ad Spend │ Impressions │ Clicks │ CPM │ CPC │
├──────────────┼────────────┼─────────────┼────────────┼───────┼────────┤
│ Facebook │ ৳২০,০০০ │ ১০,০০,০০০ │ ১০,০০০ │ ৳২০ │ ৳২ │
│ Google │ ৳২০,০০০ │ ৫,০০,০০০ │ ২০,০০০ │ ৳৪০ │ ৳১ │
│ Instagram │ ৳১০,০০০ │ ২,০০,০০০ │ ৫,০০০ │ ৳৫০ │ ৳২ │
└──────────────┴────────────┴─────────────┴────────────┴───────┴────────┘
Analysis:
Facebook:
→ CPM কম (৳২০) = কম টাকায় বেশি মানুষ দেখছে ✅
→ CPC মাঝারি (৳২) = click এর খরচ reasonable
Google:
→ CPM বেশি (৳৪০) = বেশি টাকায় কম মানুষ দেখছে
→ CPC সবচেয়ে কম (৳১) = click এর খরচ সবচেয়ে কম ✅
→ মানে Google এ যারা দেখছে তারা বেশি click করছে
Instagram:
→ CPM সবচেয়ে বেশি (৳৫০) = সবচেয়ে দামি platform
→ CPC মাঝারি (৳২)
Decision:
Brand awareness চাইলে → Facebook (কম CPM)
App install চাইলে → Google (কম CPC)
৯. Database Structure
-- Ad campaigns track করার জন্য table
CREATE TABLE ad_campaigns (
id SERIAL PRIMARY KEY,
campaign_name VARCHAR(100) NOT NULL, -- "FoodBD Eid Campaign"
platform VARCHAR(50) NOT NULL, -- 'facebook','google','instagram'
start_date DATE NOT NULL,
end_date DATE,
total_spend DECIMAL(10,2) DEFAULT 0, -- মোট খরচ
total_impressions BIGINT DEFAULT 0, -- মোট impression
total_clicks BIGINT DEFAULT 0, -- মোট click
campaign_status VARCHAR(20) DEFAULT 'active'
);
-- Daily performance track করার জন্য
CREATE TABLE ad_daily_stats (
id SERIAL PRIMARY KEY,
campaign_id INT REFERENCES ad_campaigns(id),
stat_date DATE NOT NULL,
daily_spend DECIMAL(10,2) DEFAULT 0,
daily_impressions BIGINT DEFAULT 0,
daily_clicks BIGINT DEFAULT 0
);
১০. SQL দিয়ে CPC/CPM Calculate করা
Query 1 — Campaign wise CPC, CPM, CTR
SELECT
campaign_name,
platform,
total_spend,
total_impressions,
total_clicks,
-- CPM calculation
ROUND(
total_spend /
NULLIF(total_impressions, 0) * 1000
, 2) AS cpm,
-- CPC calculation
ROUND(
total_spend /
NULLIF(total_clicks, 0)
, 2) AS cpc,
-- CTR calculation
ROUND(
total_clicks * 100.0 /
NULLIF(total_impressions, 0)
, 2) AS ctr_percentage
FROM ad_campaigns
WHERE campaign_status = 'active'
ORDER BY cpc ASC;
Output:
campaign_name | platform | spend | impressions | clicks | cpm | cpc | ctr
---------------------|-----------|---------|-------------|--------|-------|------|-----
FoodBD Eid Campaign | google | 20000 | 500000 | 20000 | 40.00 | 1.00 | 4.00
FoodBD App Install | facebook | 20000 | 1000000 | 10000 | 20.00 | 2.00 | 1.00
FoodBD Brand Aware | instagram | 10000 | 200000 | 5000 | 50.00 | 2.00 | 2.50
Query 2 — Daily CPC/CPM Trend
SELECT
stat_date,
SUM(daily_spend) AS spend,
SUM(daily_impressions) AS impressions,
SUM(daily_clicks) AS clicks,
ROUND(
SUM(daily_spend) /
NULLIF(SUM(daily_impressions), 0) * 1000
, 2) AS cpm,
ROUND(
SUM(daily_spend) /
NULLIF(SUM(daily_clicks), 0)
, 2) AS cpc
FROM ad_daily_stats
WHERE stat_date >= NOW() - INTERVAL '30 days'
GROUP BY stat_date
ORDER BY stat_date;
১১. Python দিয়ে CPC/CPM Analyze করা
import pandas as pd
import psycopg2
conn = psycopg2.connect(
host="your-host",
database="your_db",
user="your_user",
password="your_password"
)
query = """
SELECT
campaign_name,
platform,
total_spend,
total_impressions,
total_clicks
FROM ad_campaigns
WHERE campaign_status = 'active'
"""
df = pd.read_sql(query, conn)
conn.close()
# =============================================
# CALCULATE CPC, CPM, CTR
# =============================================
df['cpm'] = (
df['total_spend'] /
df['total_impressions'] * 1000
).round(2)
df['cpc'] = (
df['total_spend'] /
df['total_clicks']
).round(2)
df['ctr'] = (
df['total_clicks'] * 100 /
df['total_impressions']
).round(2)
print("============================================")
print(" AD PERFORMANCE REPORT ")
print("============================================")
print(df[[
'campaign_name',
'platform',
'total_spend',
'cpm',
'cpc',
'ctr'
]].to_string(index=False))
# =============================================
# BEST PERFORMING PLATFORM
# =============================================
platform_summary = df.groupby('platform').agg(
total_spend = ('total_spend', 'sum'),
total_impressions = ('total_impressions', 'sum'),
total_clicks = ('total_clicks', 'sum')
).reset_index()
platform_summary['cpm'] = (
platform_summary['total_spend'] /
platform_summary['total_impressions'] * 1000
).round(2)
platform_summary['cpc'] = (
platform_summary['total_spend'] /
platform_summary['total_clicks']
).round(2)
platform_summary['ctr'] = (
platform_summary['total_clicks'] * 100 /
platform_summary['total_impressions']
).round(2)
print("\n===== Platform Summary =====")
print(platform_summary.to_string(index=False))
# Best platform for clicks
best_cpc = platform_summary.loc[
platform_summary['cpc'].idxmin(), 'platform'
]
# Best platform for reach
best_cpm = platform_summary.loc[
platform_summary['cpm'].idxmin(), 'platform'
]
print(f"\n✅ Best Platform for Clicks (Low CPC) : {best_cpc}")
print(f"✅ Best Platform for Reach (Low CPM) : {best_cpm}")
Output:
============================================
AD PERFORMANCE REPORT
============================================
campaign_name platform total_spend cpm cpc ctr
FoodBD Eid Campaign google 20000.00 40.00 1.00 4.00
FoodBD App Install facebook 20000.00 20.00 2.00 1.00
FoodBD Brand Aware instagram 10000.00 50.00 2.00 2.50
===== Platform Summary =====
platform total_spend impressions clicks cpm cpc ctr
facebook 20000.00 1000000 10000 20.00 2.00 1.00
google 20000.00 500000 20000 40.00 1.00 4.00
instagram 10000.00 200000 5000 50.00 2.00 2.50
✅ Best Platform for Clicks (Low CPC) : google
✅ Best Platform for Reach (Low CPM) : facebook
১২. ETL — Daily Ad Stats Pull করা
# etl_ad_stats.py
# প্রতিদিন রাত ১২টায় CRON এ run হবে
# Facebook/Google API থেকে data pull করে DB তে save করে
import psycopg2
from datetime import datetime, date
def save_daily_ad_stats(campaign_id, stat_date,
spend, impressions, clicks):
conn = psycopg2.connect(
host="your-host",
database="your_db",
user="your_user",
password="your_password"
)
cursor = conn.cursor()
insert_query = """
INSERT INTO ad_daily_stats (
campaign_id,
stat_date,
daily_spend,
daily_impressions,
daily_clicks
)
VALUES (%(campaign_id)s, %(stat_date)s,
%(spend)s, %(impressions)s, %(clicks)s)
ON CONFLICT (campaign_id, stat_date)
DO UPDATE SET
daily_spend = EXCLUDED.daily_spend,
daily_impressions = EXCLUDED.daily_impressions,
daily_clicks = EXCLUDED.daily_clicks,
updated_at = NOW()
"""
cursor.execute(insert_query, {
'campaign_id' : campaign_id,
'stat_date' : stat_date,
'spend' : spend,
'impressions' : impressions,
'clicks' : clicks
})
# Campaign এর total ও update করো
update_total_query = """
UPDATE ad_campaigns
SET
total_spend = (
SELECT SUM(daily_spend)
FROM ad_daily_stats
WHERE campaign_id = %(campaign_id)s
),
total_impressions = (
SELECT SUM(daily_impressions)
FROM ad_daily_stats
WHERE campaign_id = %(campaign_id)s
),
total_clicks = (
SELECT SUM(daily_clicks)
FROM ad_daily_stats
WHERE campaign_id = %(campaign_id)s
)
WHERE id = %(campaign_id)s
"""
cursor.execute(update_total_query,
{'campaign_id': campaign_id})
conn.commit()
print(f"[{datetime.now()}] Stats saved for campaign {campaign_id}")
cursor.close()
conn.close()
if __name__ == "__main__":
# Example — manually test করার জন্য
save_daily_ad_stats(
campaign_id = 1,
stat_date = date.today(),
spend = 1500.00,
impressions = 75000,
clicks = 750
)
Crontab:
# প্রতিদিন রাত ১২টায় চলবে
0 0 * * * /usr/bin/python3 /home/etl/etl_ad_stats.py
১৩. Common Mistakes ⚠️
| Mistake | সমস্যা | সমাধান |
|---|---|---|
| শুধু CPC দেখা | Low CPC মানেই ভালো না, conversion নাও হতে পারে | CPC এর সাথে conversion rate দেখো |
| শুধু CPM দেখা | বেশি মানুষ দেখলেই কাজ হয় না | CPM এর সাথে CTR দেখো |
| Platform compare না করা | কোথায় টাকা waste হচ্ছে বোঝা যায় না | সব platform একসাথে compare করো |
| NULL/Zero handle না করা | Divide by zero error আসে | সবসময় NULLIF() use করো |
| Daily trend না দেখা | কোন দিন performance খারাপ বুঝবে না | Daily breakdown রাখো |
সারসংক্ষেপ 🎯
| Metric | Formula | মানে |
|---|---|---|
| CPC | Spend ÷ Clicks | প্রতি Click এ কত টাকা |
| CPM | (Spend ÷ Impressions) × ১০০০ | ১০০০ জন দেখাতে কত টাকা |
| CTR | (Clicks ÷ Impressions) × ১০০ | কতজন দেখে click করলো |
Brand Awareness চাইলে → CPM দেখো (কম হলে ভালো)
Action/Click চাইলে → CPC দেখো (কম হলে ভালো)
Ad এর Quality বুঝতে → CTR দেখো (বেশি হলে ভালো)