EthicsComputerCourses
Join training +91 90532 10052

Buyer Personas & Customer Research

Digital Marketing & SEO · Lesson 3 of 30 Beginner 6 min read Updated

"Everyone" is not a target audience. A laptop repair shop in Kochi serves college students with a broken screen two days before an exam, and it also serves office managers who need ten machines serviced every quarter. Those two people search differently, worry about different things and need different messages.

In this lesson you will learn what a buyer persona is, where to find real information about your customers, how to write a persona that a whole team can use, and how a few lines of Python can turn a messy enquiry log into clear themes.

What is a buyer persona?

A buyer persona is a short profile of one type of customer, written from real research. It describes their goal, their problem, what makes them hesitate and where they look for answers. It is "semi-fictional": the name is invented, but every detail should come from real customers.

Personas help you make decisions. Should the homepage talk about speed or price? Should you post on LinkedIn or Instagram? Should the ad say "same-day repair" or "GST invoice available"? The persona tells you.

Where to find real customer information

You do not need a research agency. Small businesses already hold most of the data:

  • Enquiry messages. WhatsApp chats, emails and call notes show the exact words customers use.
  • Reviews. Your Google reviews, and your competitors' reviews, show what people praise and what annoys them.
  • Search Console. The queries report shows the words people typed before finding your site (see Google Search Console).
  • Analytics. GA4 shows cities, devices and which pages people read before they contacted you.
  • Staff. The person at the counter hears the same five questions every day.
  • Short interviews. Ask five recent customers: "What were you trying to fix? What almost stopped you from choosing us?"

Writing a persona

Keep a persona to one page. A structured format such as JSON makes it easy to store, share and compare. Here is one persona for the Kochi repair shop:

JSON
{
  "name": "Exam-week Farhan",
  "who": "Engineering student, 19-22, lives in a hostel or PG",
  "goal": "Get the laptop working before exams or a project deadline",
  "problem": "Cracked screen or dead battery, limited budget",
  "objections": ["Will my data be safe?", "Is the part original?", "How long will it take?"],
  "searches_for": ["laptop screen replacement near me", "same day laptop repair kochi"],
  "channels": ["Google Maps", "Instagram", "college WhatsApp groups"],
  "decision_trigger": "Clear price range and a same-day promise in writing",
  "message": "Same-day screen and battery replacement, price confirmed before repair"
}

And a second one for the same shop:

JSON
{
  "name": "Office-admin Meera",
  "who": "Admin or office manager at a small firm of 10-40 staff",
  "goal": "Keep every computer running without disturbing work",
  "problem": "No in-house IT person, needs a reliable vendor",
  "objections": ["Do they give a GST invoice?", "Can they come on site?"],
  "searches_for": ["laptop AMC kochi", "computer service for office"],
  "channels": ["Google search", "LinkedIn", "referrals"],
  "decision_trigger": "References from other offices and a written service agreement",
  "message": "Quarterly on-site servicing with GST invoice and a fixed visit schedule"
}

Notice how different the two messages are. One ad cannot serve both well.

Finding themes in an enquiry log

Reading 300 WhatsApp enquiries by hand is slow. If you copy the questions into a list (without names or numbers), Python can count the topics. This example uses simple keyword matching.

PythonRun it yourself
from collections import Counter

enquiries = [
    "screen cracked how much for replacement",
    "do you give gst bill",
    "battery drains fast, price with gst?",
    "can you repair today, exam tomorrow",
    "is my data safe during repair",
    "screen flickering dell inspiron",
    "need amc for 15 laptops in office",
    "same day screen replacement possible?",
    "battery replacement original or duplicate",
    "gst invoice needed for company",
]

topics = {
    "screen": ["screen", "display"],
    "battery": ["battery"],
    "speed/urgency": ["today", "same day", "urgent", "tomorrow"],
    "invoice/GST": ["gst", "invoice", "bill"],
    "trust/data": ["data", "original", "safe"],
    "business/AMC": ["amc", "office", "company"],
}

counts = Counter()
for text in enquiries:
    for topic, words in topics.items():
        if any(word in text for word in words):
            counts[topic] += 1

for topic, n in counts.most_common():
    print(f"{topic:15} {n}")
Output
screen          3
invoice/GST     3
battery         2
speed/urgency   2
trust/data      2
business/AMC    2

Three of ten questions mention GST or invoices. That is a strong hint: show "GST invoice available" clearly on the website and in the business persona's ads. Keyword matching is rough (a question can match several topics, and spelling varies), but it is a fast first look.

Negative personas

A negative persona describes people you do not want to attract, so you stop paying for them. For the repair shop, it might be "people looking for free repair tutorials" or "buyers of second-hand phones". In Google Ads you can block such searches with negative keywords, which you will learn in Google Ads Search Campaigns.

Advanced: personas by search intent

Personas connect directly to search. Each persona searches in a different stage and with different words. You can group the searches_for lists from all personas and check which persona each landing page serves:

PythonRun it yourself
personas = {
    "Exam-week Farhan": ["laptop screen replacement near me", "same day laptop repair kochi"],
    "Office-admin Meera": ["laptop amc kochi", "computer service for office"],
}
pages = {
    "/screen-replacement": ["screen replacement", "same day"],
    "/office-it-support": ["amc", "office"],
}

for persona, searches in personas.items():
    for search in searches:
        match = [p for p, words in pages.items() if any(w in search for w in words)]
        print(f"{persona}: '{search}' -> {match or 'NO PAGE'}")
Output
Exam-week Farhan: 'laptop screen replacement near me' -> ['/screen-replacement']
Exam-week Farhan: 'same day laptop repair kochi' -> ['/screen-replacement']
Office-admin Meera: 'laptop amc kochi' -> ['/office-it-support']
Office-admin Meera: 'computer service for office' -> ['/office-it-support']

If a search shows NO PAGE, you have found a content gap.

Common mistakes

  • Inventing personas in a meeting. If no real customer said it, it does not belong in the persona.
  • Too many personas. Two to four are enough for most small businesses.
  • Demographics only. "Male, 25" says little. Goals, problems and objections drive decisions.
  • Writing it once and forgetting it. Review personas every few months as new questions appear.

Key points

  • A buyer persona is a one-page profile of a customer type, built from real research.
  • Enquiries, reviews, Search Console queries, analytics and staff are free research sources.
  • Good personas list goals, problems, objections, search words, channels and a decision trigger.
  • Simple Python counting can turn an enquiry log into clear themes.
  • Negative personas help you avoid paying for the wrong audience.

Exercise

Write a buyer persona in JSON for a home bakery in Jaipur that sells eggless birthday cakes. Include at least name, goal, problem, objections, searches_for, channels and message. Then add one more topic, "eggless", to the Python enquiry counter and test it with three sample questions of your own.

Show solution
JSON
{
  "name": "Birthday-planner Isha",
  "goal": "Order a good-looking eggless cake for her son's birthday",
  "problem": "Many shops are not fully eggless or need orders days ahead",
  "objections": ["Is it 100% eggless?", "Can it be delivered by 6 pm?"],
  "searches_for": ["eggless birthday cake jaipur", "cake delivery malviya nagar"],
  "channels": ["Google Maps", "Instagram"],
  "message": "100% eggless kitchen, same-day orders before 12 noon"
}
Python
from collections import Counter
enquiries = ["is the cake eggless", "eggless chocolate cake price", "delivery by 6 pm?"]
topics = {"eggless": ["eggless"], "delivery": ["delivery"]}
counts = Counter(t for q in enquiries for t, words in topics.items() if any(w in q for w in words))
print(counts.most_common())
Output
[('eggless', 2), ('delivery', 1)]

The generator expression checks every question against every topic and counts each match once.

Quick Quiz

1. What is the best source for a buyer persona?

2. What is a negative persona?

3. Which field helps most when writing ad copy?

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