Sanan Corporation · Requirement analysis · CRM

Leads · Kizna CRM

A lightweight lead record and screen, so raw inbound contacts get screened before anyone creates a full family profile.

What it shows
Requirement analysis
My role
Product Owner · requirement analysis
When
09/2026 (KIZUNA-007)
Company
Sanan Corporation
PRDUser flowsAcceptance CriteriaBusiness RulesData Model

01 · The problem

Context

Admissions teams take in raw contacts from Facebook, Zalo, the hotline, walk-ins, and events. The request arrived as “we need a leads screen”.

The CRM had nowhere to put a contact that hadn't been checked yet. Every new phone number went through the 3-step “Add family” wizard, which creates a family, a student, and an enrollment opportunity. Spam and wrong numbers sat in the family list next to real customers, logging one number meant filling a heavy form, and nobody could measure how many raw contacts actually became families.

02 · What I did

  1. 01Looked past the request to the root cause. It read as “add a leads screen”, but the real gap was a missing record between a raw contact and a family profile. The existing “lead overview” was really an enrollment pipeline for students who already had profiles.
  2. 02Checked the codebase before promising reuse. The B2B lead object and the grouped-by-stage view existed only in planning docs, not in the preschool product, so this was a new build rather than a port.
  3. 03Wrote the PRD: context, in and out of scope, use cases for counsellors, team leads, and marketing, four user flows, Given/When/Then acceptance criteria, data model, business rules, edge cases, permissions, and tracking events.
  4. 04Defined a 5-state lifecycle (New → Verified → Nurturing → Profile created / Disqualified) and mapped it onto the existing B2B statuses, so reporting stays consistent across products.
  5. 05Closed the four blocking questions with the developer the same day, then carried it into the design doc and a 12-group dev plan.

03 · Decisions & trade-offs

No “Profile created” without a profile

Moving a lead to Profile created opens the Add family wizard first, and the status only changes after it saves. The server also rejects that status without a linked family, so the rule holds through the API, not just the UI.

Warn on duplicates, don't block

Phone and email are checked against existing leads and families. Staff see a link to the match and can still continue, because one number can belong to a different parent.

Converting keeps the lead

The lead stays as the record of where the family came from, linked both ways, so source quality and time-to-convert can be reported later.

Phase 2, on purpose

Excel import, merging duplicates, lead scoring, and auto-creating an enrollment opportunity were scoped out. Phase 1 adds the screening step without touching the live enrollment funnel or its reports.

04 · What I produced

Use casesWho it's for

Primary admissions counsellor / telesales: screens raw contacts

Secondary team lead (KPIs, assigns owners) · marketing (source quality)

• Log a new number from Facebook / hotline / inbox in 10 seconds,

without creating a family profile

• Call to verify → New → Verified, or Disqualified if wrong or spam

• Nurture with a follow-up date and notes

• Parent is really interested → Profile created; the system makes

you create or link a family profile first

User flowD · Convert to a family profile

1 Staff drags the card to “Profile created”

2 The status does NOT change yet. The Add family wizard opens,

prefilled from the lead: name, phone, email, source, branch, owner

3 Phone or email matches an existing family → offer “Link existing”

4 Saved → status = Profile created, linked family, convertedAt

5 Cancelled → status unchanged, card goes back to its column

Acceptance criteriaThe rule holds on the server too

Given a client calls updateOneLead with status = Profile created

and no linked family

When the request is processed

Then the server rejects it with a clear error

(checked in the query hook, not only in the UI)

Given the Add family wizard was opened from the convert flow

When the user cancels or the save fails

Then the lead keeps its previous status and the card returns

States & business ruleslead.status

1 New raw contact, not called yet

2 Verified reached; right person, real need

3 Nurturing interested, not ready yet

4 Profile created terminal · success

5 Disqualified terminal · wrong number, spam, no need

BL-1 Profile created ⇔ a family profile is linked

BL-4 Disqualified ⇒ a disqualify reason is required

BL-5 duplicates: warn on normalised phone + email, never hard-block

Decision logOpen questions → decisions

OQ-1 Route and menu label?

→ its own screen, placed above the enrollment overview

OQ-3 Does converting also create a student + opportunity?

→ No. Only the family profile is required

OQ-4 Which working fields in phase 1?

→ owner, branch, channel, follow-up date, notes, reason

OQ-7 Can a lead move back out of Profile created?

→ Blocked until the family profile is unlinked

Blocking questions were settled with the developer on 2026-09-04. The rest went to design with a recommendation attached.

05 · Before / after

Drag the divider to compare

Demo image (replace): quick lead form and Kanban by status
Demo image (replace): 3-step Add family wizard
BeforeAfter
Logging a new contactBefore: the 3-step Add family wizard just to save a phone number. After: the quick lead form and the Kanban by status.

06 · What I achieved

What changed

  • PRD approved for design the day it was written, with all four blocking questions resolved.
  • One document that design and development worked from: scope, flows, rules, and testable acceptance criteria, followed by a design doc and a 12-group dev plan.
  • Non-blocking questions recorded with a recommended answer instead of being left vague.

What I'd keep doing

  • “The first request is usually a solution. The work is finding the missing concept behind it.”
  • “A rule that only the UI enforces isn't a rule.”

Next case study · Sanan

Corporate & Marketing Websites

Leads · Kizna CRM · case study | Bui Thuy Ngoc