EthicsComputerCourses
Join training +91 90532 10052

Planning a Campaign Budget

Digital Marketing & SEO · Lesson 22 of 30 Intermediate 6 min read Updated

"How much should I spend on ads?" is the question every small business owner asks, and "it depends" is the honest but useless answer. A better answer is a calculation: start from the number of customers you need, work backwards through your funnel, and see what that costs. Then compare the cost with what a customer is worth.

In this lesson you will build a budget backwards from a goal, add a testing reserve and seasonality, split it across channels, and make a calculator the whole team can use.

Work backwards from the goal

Suppose a computer training institute in Rohtak wants 20 new students next month. Its own records give the funnel rates; the cost per click is an estimate from a short test campaign or from Google Ads Keyword Planner's bid ranges.

PythonRun it yourself
import math

goal_students = 20
lead_to_student = 0.25      # 1 in 4 enquiries joins (from last 3 months of records)
click_to_lead = 0.06        # 6 in 100 landing-page visitors enquire (from GA4)
cost_per_click = 22         # rupees, estimate from a test campaign

leads_needed = math.ceil(goal_students / lead_to_student)
clicks_needed = math.ceil(leads_needed / click_to_lead)
budget = clicks_needed * cost_per_click

print(f"Leads needed:  {leads_needed}")
print(f"Clicks needed: {clicks_needed}")
print(f"Ad budget:     ₹{budget:,}")
print(f"Cost per student: ₹{budget / goal_students:,.0f}")
Output
Leads needed:  80
Clicks needed: 1334
Ad budget:     ₹29,348
Cost per student: ₹1,467

math.ceil rounds up, because you cannot get 0.3 of a student. Now the owner can make a real decision: if a student is worth ₹12,000 in fees, spending about ₹1,500 to get one may be fine. If the course fee is ₹2,000, it is not, and the plan must change (better conversion, cheaper channels, or a smaller goal).

Where do the numbers come from?

Every input should come from your own data whenever possible:

  • Lead-to-customer rate: count enquiries and new customers in your register or CRM for the last few months.
  • Click-to-lead rate: GA4 key events divided by sessions from the paid channel.
  • Cost per click: your past campaigns; for a new campaign, Keyword Planner's estimated bid ranges or a small test budget for two weeks.

If you have no data at all, run a small test budget first, for example two to four weeks on one channel, and only then plan the full month. Planning from someone else's "average CPC" is guessing.

Test, scale and reserve

A sensible budget is split into parts. A common rule of thumb (not a law) is:

PartShareUsed for
ProvenAbout 70%Campaigns with a known, acceptable cost per customer
ImproveAbout 20%New ads, landing pages and audiences on proven channels
ExperimentAbout 10%A new channel or format

Keep a small reserve too. Leads sometimes arrive faster than expected, and a campaign that works should not stop on the 20th because the money ran out.

Seasonality

Demand changes through the year: admissions season for institutes, wedding season for photographers and caterers, Diwali for sweets and gifts, summer for AC repair. Google Trends and your own sales history show the pattern. This program spreads a yearly budget by monthly weights:

PythonRun it yourself
yearly_budget = 3_00_000      # rupees, written Indian-style with underscores
weights = {                   # relative demand from last year's enquiries
    "Apr": 3, "May": 3, "Jun": 4, "Jul": 3, "Aug": 2, "Sep": 2,
    "Oct": 1, "Nov": 1, "Dec": 1, "Jan": 2, "Feb": 2, "Mar": 2,
}
total = sum(weights.values())
for month, w in weights.items():
    print(f"{month}: ₹{yearly_budget * w / total:>9,.0f}")
Output
Apr: ₹   34,615
May: ₹   34,615
Jun: ₹   46,154
Jul: ₹   34,615
Aug: ₹   23,077
Sep: ₹   23,077
Oct: ₹   11,538
Nov: ₹   11,538
Dec: ₹   11,538
Jan: ₹   23,077
Feb: ₹   23,077
Mar: ₹   23,077

Python accepts 3_00_000 because underscores in numbers are ignored, so you can group digits the Indian way (lakh and crore) for readability; the program still prints them in the international style.

A calculator for the team

Not everyone will run Python. This page does the same backward calculation in the browser. Change the inputs and the result updates.

HTMLTry it yourself
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>Campaign budget calculator</title>
  <style>
    body { font-family: system-ui, sans-serif; margin: 1.5rem; max-width: 28rem; }
    label { display: flex; justify-content: space-between; margin: .4rem 0; }
    input { width: 7rem; }
    #result { margin-top: 1rem; background: #fff7ed; padding: .8rem; line-height: 1.6; }
  </style>
</head>
<body>
  <h1>Budget calculator</h1>
  <form id="f">
    <label>Customers wanted <input name="goal" type="number" value="20" min="1"></label>
    <label>Lead to customer (%) <input name="close" type="number" value="25" min="1"></label>
    <label>Click to lead (%) <input name="cvr" type="number" value="6" min="0.1" step="0.1"></label>
    <label>Cost per click (₹) <input name="cpc" type="number" value="22" min="1"></label>
    <label>Value of a customer (₹) <input name="value" type="number" value="12000" min="1"></label>
  </form>
  <div id="result"></div>
  <script>
    const form = document.getElementById("f");
    const inr = (n) => "₹" + Math.round(n).toLocaleString("en-IN");
    function calc() {
      const v = Object.fromEntries([...new FormData(form)].map(([k, x]) => [k, Number(x)]));
      const leads = Math.ceil(v.goal / (v.close / 100));
      const clicks = Math.ceil(leads / (v.cvr / 100));
      const budget = clicks * v.cpc;
      const perCustomer = budget / v.goal;
      document.getElementById("result").textContent =
        `Leads needed: ${leads}. Clicks needed: ${clicks}. Budget: ${inr(budget)}. ` +
        `Cost per customer: ${inr(perCustomer)} (${(perCustomer / v.value * 100).toFixed(1)}% of a customer's value).`;
    }
    form.addEventListener("input", calc);
    calc();
  </script>
</body>
</html>

toLocaleString("en-IN") formats rupees in the Indian style, so 125000 is shown as ₹1,25,000 with the lakh comma. Try lowering "Click to lead" from 6% to 3%: the budget doubles. That one number shows why improving the landing page often saves more money than any bidding trick.

Costs beyond media

Ad spend is not the whole budget. Also plan for:

  • Creative: photos, short videos, design.
  • Tools: website hosting, email platform, scheduling tools.
  • People: your time or a freelancer's, to manage campaigns and reply to leads quickly.
  • Taxes and fees: check whether tax is added to ad spend in each platform's billing settings, and confirm the treatment with your CA.

Common mistakes

  • Budget first, goal later. "₹10,000 on Facebook" without a target cannot be judged.
  • Using someone else's benchmarks for CPC and conversion rates.
  • Spreading a small budget across five channels. Each gets too little data to learn anything.
  • No testing reserve, so nothing new is ever tried.
  • Ignoring follow-up capacity. Doubling leads is pointless if nobody can call them back the same day.

Key points

  • Plan backwards: customers wanted → leads needed → clicks needed → budget.
  • Use your own conversion rates and test-campaign costs, not generic averages.
  • Compare cost per customer with what a customer is worth before approving a budget.
  • Split budget into proven, improve and experiment parts, keep a reserve, and follow seasonality.
  • Include creative, tools, people and taxes in the full marketing budget.

Exercise

A wedding photographer in Jaipur wants 6 bookings in November. One in 10 enquiries books, 4% of ad clicks send an enquiry, and a click costs ₹30 on average in her test campaign. A booking is worth ₹80,000. Calculate leads, clicks, budget and cost per booking in Python, and say whether the plan looks affordable.

Show solution
Python
import math

goal, close, cvr, cpc, value = 6, 0.10, 0.04, 30, 80_000
leads = math.ceil(goal / close)
clicks = math.ceil(leads / cvr)
budget = clicks * cpc
print(leads, clicks, f"₹{budget:,}", f"₹{budget / goal:,.0f} per booking",
      f"{budget / goal / value:.1%} of a booking's value")
Output
60 1500 ₹45,000 ₹7,500 per booking 9.4% of a booking's value

Spending about ₹7,500 to win an ₹80,000 booking is under 10% of its value, so the plan looks affordable if her margin is healthy and she can handle 60 enquiries in a month.

Quick Quiz

1. What is the first step in planning a campaign budget?

2. You need 40 leads and 5% of clicks become leads. How many clicks do you need?

3. Where should a new advertiser get a cost-per-click estimate?

Learn Digital Marketing & SEO with a mentor

Free lessons get you started. Our Digital Marketing & SEO training adds real projects and code reviews from working developers.

  • Project-based learning
  • Mentor code reviews
  • Free counselling call