AAuditPro Suite· Complete manual

The 7-stage pipeline

StageMeaningProbability
newJust captured · no contact yet10%
contactedInitial call / email made25%
qualifiedConfirmed budget + need + timeline + authority40%
proposalQuote sent60%
negotiationActive discussion on terms / price80%
wonAccepted · ready to convert100%
lostRejected · reason captured0%

Lead row fields

1company_name
Required

Prospect's company. Used as lead title.

2contact_name + email + phone
Required

Primary contact. Becomes client_contacts primary on conversion.

3expected_revenue
DECIMAL(18,3) OMR

Estimated annual fee. Drives weighted forecast.

4source
Lookup

referral · website · cold_call · whatsapp · OCCI · LinkedIn · networking · other.

5stage
7-state machine

Default new. Walk through stages. Each move is timestamped.

6assigned_to
Employee picker

Manager who owns the lead. Drives "My leads" filter.

7expected_close_date
Date

When you expect to win/lose. Drives forecast bucketing.

8notes
Free text

Discovery notes, independence-check conclusions, internal context.

9lost_reason
Required if stage=lost

price · timing · scope · competitor · independence · other.

Activity timeline

Each lead has a polymorphic activity log via lead_activities:

Renders as iconified vertical timeline on the lead show page. Becomes the audit-trail of the relationship.

Pipeline view (index)

The default Leads list renders as a 7-stage tile band:

Stuck detection

Lead::listFiltered($filters) with stuck=1 applies:

WHERE stage NOT IN ('won', 'lost')
  AND updated_at < CURDATE() - INTERVAL 14 DAY
  AND deleted_at IS NULL

Surfaced as a Pipeline Conversion tile on the dashboard. Click → list filtered. Either re-engage or move to lost.

Step-by-step — capture + walk a lead

  1. Capture

    Sales → Leads → New lead. Fill company, contact, source, expected revenue, assign manager.

  2. Stage = new

    System auto-creates lead. Activity timeline shows "Lead captured by [you]".

  3. First contact

    Make the call. Stage move new → contacted via show page action button. Add an activity log: outbound call, summary, key takeaways.

  4. Qualify (BANT check)

    Confirm Budget · Authority · Need · Timeline. If yes, stage → qualified.

  5. Run independence check

    Document in notes. If conflict, stage → lost (reason: independence). Otherwise continue.

  6. Proposal

    From show page → Create quote. Quote auto-inherits lead contact + expected revenue. Stage moves proposal automatically.

  7. Negotiation

    Discussions happen. Stage → negotiation when actively negotiating terms.

  8. Won

    Client accepts. Mark stage = won. Convert to Client button enables.

  9. Convert

    Click Convert to Client. Auto-creates M04 client + primary contact. Stamps leads.converted_client_id. Click-through to client detail.

Lost reason discipline

When marking a lead lost, the system enforces a reason from the lookup:

Tracked centrally so the firm can report on win/loss patterns + tune sales approach.

RBAC matrix

RoleviewcreateupdateconvertdeleteScope
super_admin / partnerall
admin_staff / accountantall
managerdepartment
senior / staff auditorview
read_onlyview
Try this

Open Sales Pipeline → Leads. Toggle "My leads". Apply Stuck filter. The intersection is "leads I'm responsible for that haven't moved in 2 weeks". This is your weekly sales hygiene list.

Watch out

Don't sit on lost reasons. If 60% of last quarter's losses were "price", you have a pricing/positioning issue. If 40% were "competitor", you have a positioning issue. Use Reports → Quote Conversion + lead lost-reason analysis monthly.

Tip — re-engage cycle

Leads marked lost with reason="timing" should auto-trigger a follow-up task 6 months later. Currently manual; add a "Reactivate" action button on lost leads that creates a calendar event for re-contact. Soft pipeline = future revenue.