Header Ads

Header ADS

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 দেখো (বেশি হলে ভালো)


Powered by Blogger.