Exercise Workbook

FolksCRM — Training & Hands-on Labs

Version 1.0  |  June 2026  |  MasGen Innovations

16 Labs · 14–18 Hours · Final Assessment Included
00

How to use this workbook

This workbook accompanies the FolksCRM User Manual. Each lab walks a real scenario, asks you to perform the steps, and ends with self-check questions. The labs build a single connected story — the account, contact, lead, deal, quote, order and invoice you create early are reused later — so do them in order and record the codes you generate.

Before you start

  1. You have a working login with SuperAdmin or a fully-scoped CRM role. The starter login is superadmin / superadmin.
  2. The API and FE are both running locally (dotnet run in each). API on port 5291, FE on port 5200.
  3. Both solutions build with 0 errors. Confirm with your trainer if unsure.
  4. The database FolksCRM_Dev_V1 is restored with seed master data.
  5. Keep a notebook (or the NOTE lines below) to record codes — Account, Lead, Opp, Quote no., Order no., Invoice no. — they reappear in later labs.

Skill levels

Foundation — Labs 1–4

Anyone can do these. Login, navigate, build masters, capture a lead.

Intermediate — Labs 5–11

Requires Foundation. Convert, work the pipeline, quote, order, invoice.

Advanced — Labs 12–16

Full setup + previous labs done. Aging, campaigns, workflow, reports, end-to-end.

Conventions used in this workbook

DO — Action

An action you perform on screen.

SEE — Outcome

The expected result you should observe.

NOTE — Record

A value (code, number) to write down.

Q — Self-check

A question to test your understanding.

The running scenario. Throughout these labs you are a rep at MasGen selling CRM seats to a prospect called Northwind Ltd. You'll meet them as a lead in Lab 4 and collect their payment in Lab 11.
01

Lab 1 — System orientation

Foundation

Get comfortable with the navbar, the side menu, the standard list/form pattern, and the role you'll work as.

Foundation 30 minutes Goal: orient yourself Pre-req: working login

1.1 First login

  • Open the FE URL (http://localhost:5200). Sign in with superadmin / superadmin.
  • You land on the home dashboard mapped to your role's default path.
  • Note the role pill at the top right and the inbox bell badge count.

1.2 Walk the menu

  • Expand each menu group in turn: Sales, Marketing, Activities, Billing, Reports, plus the UM core groups.
  • Sub-menus expand; pages share a toolbar — Add / Refresh / Export / Search.

1.3 Standard page anatomy

  • Open Sales → Accounts. Identify: header toolbar, filter strip, KPI tiles, data grid, row actions.
  • Click Add; the form opens as a modal/drawer. Cancel without saving.

Self-check

  • Q1.1  Where is the bearer token stored after login?
  • Q1.2  What builds the left navigation — and why might two users see different menus?
  • Q1.3  If the Add button is greyed out, which privilege is your role missing?
02

Lab 2 — Seed the master data

Foundation

Master data feeds every dropdown. Make sure the lookups your scenario needs exist before you create any records.

Foundation 40 minutes Goal: lookups ready Pre-req: Lab 1

2.1 Confirm the opportunity stages

  • Open Master Data Console → Opportunity Stages. Verify the five stages below; add any that are missing.
#StageProbabilitySort order
1Prospecting10%1
2Qualification25%2
3Proposal50%3
4Negotiation75%4
5Closed Won100%5

2.2 Lead sources, industries, tax & terms

  • Ensure a Lead Source = "Webinar", an Industry = "Software", a Tax Code = "VAT 5%", and a Payment Term = "Net 30" all exist and are active.
  • Each saved value appears in its grid with an Active badge.
  • You'll select these exact values in later labs.

Self-check

  • Q2.1  Why deactivate a stage instead of deleting it?
  • Q2.2  What does the stage probability drive downstream?
  • Q2.3  Which single call loads all active lookups when the app starts?
03

Lab 3 — Create accounts & contacts

Foundation

Build the customer book your deal will hang off. You'll create one account and link a primary contact.

Foundation 45 minutes Goal: customer book Pre-req: Lab 2

3.1 Create the account

  • Open Sales → Accounts → Add. Name = Contoso PLC, Industry = Software, Owner = yourself. Add one Billing address.
  • The account saves (composite insert: account + address + you on the team) and opens the 360° drawer.
  • Record the Account name — you'll reuse Contoso later.

3.2 Add a contact & link it

  • Open Sales → Contacts → Add. Create Liam Chen, Title = Procurement Head, and link to Contoso PLC as Primary.
  • On the contact, set email opt-in = yes, SMS opt-in = no.
  • The Contoso 360° → Contacts tab now lists Liam as primary.

Self-check

  • Q3.1  How can one contact belong to several accounts?
  • Q3.2  Which composite DevSP saved the account + address + team in one go?
  • Q3.3  Where will Liam's SMS opt-out be respected?
04

Lab 4 — Capture & score a lead

Foundation

Meet Northwind Ltd — your hero deal — as a fresh lead. Capture, score and review it on the Kanban.

Foundation 40 minutes Goal: a scored lead Pre-req: Lab 2

4.1 Capture the lead

  • Open Sales → Leads → Capture. Company = Northwind Ltd, Name = Aisha Rahman, Source = Webinar, Owner = yourself.
  • The lead appears in the New column of the Kanban and the "New" KPI tile increments.
  • Record the Lead name; you'll convert it in Lab 5.

4.2 Score & add a note

  • Open the lead → Run scoring. Then add a note: "Attended the June webinar, asked about 25 seats."
  • A score appears and a score-history row is written; the note is timestamped.

4.3 Toggle Grid / Kanban

  • Switch the list between Grid and Kanban. Filter by Source = Webinar.

Self-check

  • Q4.1  What two things does Run Scoring write?
  • Q4.2  What groups the cards into Kanban columns?
  • Q4.3  Name one way a lead can be captured without the manual form.
05

Lab 5 — Convert a lead

Intermediate

Turn Aisha/Northwind from a lead into a real account, contact and opportunity — in one atomic step.

Intermediate 50 minutes Goal: Account+Contact+Opp Pre-req: Lab 4

5.1 Qualify, then convert

  • Open the Northwind lead → mark Qualified.
  • Click Convert. In the wizard, let it create a new Account & Contact, and tick Create opportunity: name = "Northwind — 25 CRM seats", amount = 80,000.
  • The lead flips to Converted; a new Account, Contact and Opportunity now exist and are cross-linked.
  • Record the new Opportunity name — it's your deal for Labs 6, 9, 10.

5.2 Verify the links

  • Open the new Account 360° → Timeline.
  • The opportunity and the conversion activity already appear in the timeline. The lead's converted_to_* ids point here.

Self-check

  • Q5.1  Convert is one DevSP call — name three records it creates/updates.
  • Q5.2  How does conversion avoid duplicate accounts?
  • Q5.3  Who receives the workflow listener emitted on convert?
06

Lab 6 — Work the opportunity Kanban

Intermediate

Move your Northwind deal through the stages, add products and competitors, and read the forecast.

Intermediate 55 minutes Goal: advance the deal Pre-req: Lab 5

6.1 Drag through stages

  • Open Sales → Opportunities → Kanban. Drag the Northwind card from ProspectingQualificationProposal.
  • Each move writes a stage-history row with duration-in-stage; the card's probability badge updates.

6.2 Products, competitors & team

  • On the deal detail, add a product line (you'll create the catalog in Lab 8 — for now add any seeded product) and a competitor.
  • Open the Forecast dashboard.
  • Northwind contributes amount × 50% (Proposal) to the weighted pipeline for its close month.

Self-check

  • Q6.1  What does ChangeStage write besides updating the stage?
  • Q6.2  How is weighted forecast value calculated?
  • Q6.3  Where would a stage-gated approval show up?
07

Lab 7 — Activities & auto follow-ups

Intermediate

Log the human work on the deal and see how a stage change can create a follow-up automatically.

Intermediate 40 minutes Goal: full activity trail Pre-req: Lab 6

7.1 Log a call and schedule a meeting

  • From the Northwind opportunity, add a Call (outcome: "agreed to a demo") and a Meeting next week with a reminder.
  • The meeting appears on the Calendar; My Activities shows it under "This week".

7.2 See the auto follow-up

  • Move the deal to Negotiation.
  • A follow-up task is auto-created and linked to the opportunity (if the stage hook is enabled).

Self-check

  • Q7.1  What makes an activity "polymorphic"?
  • Q7.2  Which view groups activities Today / This week / Overdue?
  • Q7.3  Which DevSP creates the follow-up on stage change?
08

Lab 8 — Catalog & pricebook

Intermediate

Set up the products and prices your quote will draw from, including a discount rule.

Intermediate 50 minutes Goal: priced products Pre-req: Lab 2

8.1 Create products

  • Open Product Catalog → Products → Add and create the two below (UoM = Each, Tax = VAT 5%).
SKUNameDefault price
CRM-PROFolksCRM Pro (annual seat)$240
CRM-ONBOnboarding package$3,000

8.2 Pricebook & discount rule

  • Ensure both products are in the default pricebook. Add a discount rule: 10% off CRM-PRO when qty ≥ 20.
  • On a 25-seat line, the resolved net unit price reflects the 10% discount.
  • Record both SKUs for Lab 9.

Self-check

  • Q8.1  Which DevSP resolves a context price, and what four inputs does it take?
  • Q8.2  Why set a product inactive rather than delete it?
  • Q8.3  When is inventory "committed" vs "released"?
09

Lab 9 — Build & approve a quote

Intermediate

Convert the won opportunity into a quote, add lines, submit for approval and approve it.

Intermediate 55 minutes Goal: an accepted quote Pre-req: Labs 6, 8

9.1 From opportunity to quote

  • On the Northwind opportunity, click Convert to Quote. Add lines: 25 × CRM-PRO, 1 × CRM-ONB.
  • Line totals compute (qty × unit − discount + tax); the quote opens in Draft.
  • Record the Quote number (e.g. QUO-####).

9.2 Approval chain

  • Click Submit for approval.
  • Status → Pending Approval; a step appears in the approver's inbox (the bell badge increments).
  • As approver, open the inbox and Approve with a comment. Then Mark Sent and record the customer Accept.
  • Status walks Draft → Pending → Approved → Sent → Accepted.

Self-check

  • Q9.1  What status must a quote reach before it can become an order?
  • Q9.2  What does editing an approved quote create, and why?
  • Q9.3  Which module actually routes the approval step?
10

Lab 10 — Quote → Order → Shipment

Intermediate

Commit the accepted quote to an order, confirm it, and ship part of it.

Intermediate 50 minutes Goal: a partly-shipped order Pre-req: Lab 9

10.1 Create & confirm the order

  • On the accepted quote, click Convert to Order. Review lines, then Confirm.
  • Status → Confirmed; editing locks; product inventory is committed.
  • Record the Order number (e.g. ORD-####).

10.2 Ship partially

  • Create a shipment for 15 of the 25 CRM-PRO seats.
  • Order status → Partially Shipped; the line shows 15/25 shipped.

Self-check

  • Q10.1  What three things does the shipment composite DevSP do in one transaction?
  • Q10.2  What happens to committed inventory if the order is cancelled?
  • Q10.3  Can you convert a partly-shipped order to an invoice?
11

Lab 11 — Invoice, payment & receipt

Intermediate

Bill the order, take a partial payment, and issue the receipt — then watch the balance recompute.

Intermediate 45 minutes Goal: a part-paid invoice Pre-req: Lab 10

11.1 Create & issue the invoice

  • On the order, click Convert to Invoice. Confirm Payment Term = Net 30; Issue it.
  • Status → Issued; due date = invoice date + 30 days.
  • Record the Invoice number and the total.

11.2 Record a partial payment

  • Record a payment for ~60% of the total (method = Bank transfer).
  • A receipt is generated; status → Partially Paid; balance due updates automatically.

Self-check

  • Q11.1  What three things does RecordPayment_Composite do?
  • Q11.2  How is the invoice due date derived?
  • Q11.3  Why void rather than delete an invoice?
12

Lab 12 — Receivables aging & dunning

Advanced

Refresh the aging snapshot and produce the list of overdue invoices to chase.

Advanced 40 minutes Goal: read AR & dun Pre-req: Lab 11

12.1 Refresh & read aging

  • Open Admin → Run Job → Aging Snapshot, run it, then open the Aging Dashboard.
  • Your Northwind invoice's balance sits in the 0–30 days bucket.

12.2 Dunning

  • Run Dunning Candidates and review the queue.
  • Your invoice is current, so it should not appear — confirm that, and reason why.

Self-check

  • Q12.1  Name the four standard aging buckets.
  • Q12.2  In v1, how do scheduled jobs get triggered?
  • Q12.3  What pushes an invoice into the dunning list?
13

Lab 13 — Campaign → lead attribution

Advanced

Close the loop on marketing: build a campaign, a target list and a template, execute, and attribute a lead.

Advanced 50 minutes Goal: measurable ROI Pre-req: Lab 4

13.1 Build & execute

  • Create a campaign "June Webinar Follow-up" (type = Email, budget = $1,000). Build a target list by criteria (Industry = Software). Author a template using {{firstname}}.
  • Schedule an execution against the list + template and run it (mock SMTP).
  • Execution metrics show recipient/sent counts; opt-outs are excluded.

13.2 Attribute & ROI

  • Set the Northwind lead's source campaign to this campaign; set actual revenue from the won deal.
  • ROI = revenue ÷ cost displays on the campaign's ROI tab.

Self-check

  • Q13.1  How is a target list populated?
  • Q13.2  What stops a recipient from being queued?
  • Q13.3  Where is campaign attribution stored?
14

Lab 14 — Workflow approval & escalation

Advanced

Look behind the curtain at the engine that routed your quote approval — and make a step escalate.

Advanced 45 minutes Goal: understand routing Pre-req: Lab 9

14.1 Inspect a definition & instance

  • Open Workflow → Definitions and find the Quote.SubmitForApproval definition. Note its levels.
  • Open the entity history for your QUO-#### quote.
  • You see the instance, the steps and the decision/comments you made in Lab 9.

14.2 Force an escalation

  • Submit a second quote for approval but do not act on it. Run Admin → Run Job → Escalation Sweep.
  • The overdue step is escalated to the next-up approver; an escalation row is recorded.

Self-check

  • Q14.1  What signature does Workflow_Trigger take?
  • Q14.2  What happens on reject vs approve at the last level?
  • Q14.3  What condition causes escalation?
15

Lab 15 — Reports & dashboards

Advanced

Read your work back through the analytics layer and watch the conversion funnel light up.

Advanced 40 minutes Goal: read the numbers Pre-req: Labs 5–12

15.1 Role dashboards

  • Open the Sales Rep dashboard, then Finance, then Executive.
  • Your Northwind deal contributes to pipeline, won-this-month, and AR figures respectively.

15.2 Conversion funnel & export

  • Open the Conversion Funnel report; export it to CSV.
  • Trace your single deal through Lead → Opportunity → Quote → Order → Invoice in the funnel counts.

Self-check

  • Q15.1  What kind of SQL does every report use, and why is that safe?
  • Q15.2  Name the five role dashboards.
  • Q15.3  How can an admin add a brand-new report?
16

Lab 16 — End-to-end day scenario

Advanced

The capstone. Run a brand-new deal — start to finish — without looking back at earlier labs. No hand-holding.

Advanced 90 minutes Goal: prove mastery Pre-req: Labs 1–15

The scenario

A new prospect, Globex Corp, requests 40 CRM Pro seats plus onboarding after attending a webinar. Take them from cold to cash.

  1. Capture Globex Corp as a lead (source = Webinar); score it.
  2. Qualify and convert — create Account + Contact + Opportunity ("Globex — 40 seats", $130k).
  3. Move the opportunity to Proposal; add 40 × CRM-PRO + 1 × CRM-ONB.
  4. Convert to Quote; submit, approve, send, accept.
  5. Convert to Order; confirm; ship all lines.
  6. Convert to Invoice; issue; record full payment; confirm status Paid.
  7. Refresh aging; open the Executive dashboard and confirm Globex revenue appears.
Lead Globex Corp shows status Converted
Opportunity Globex — 40 seats is Closed Won
Quote, Order & Invoice all reference the same account & lines
Invoice status = Paid, balance due = 0
No duplicate Globex account was created

Capstone questions

  • Q16.1  List, in order, every status your Quote passed through.
  • Q16.2  At which two points did the workflow engine get involved?
  • Q16.3  If the customer had paid only half, what would the invoice status be, and where would the balance sit in aging?

Final assessment

Part A — Multiple choice

Choose the single best answer.

A1

Converting a qualified lead creates which records?

  • a) Only an Opportunity
  • b) Account + Contact + Opportunity (atomically)
  • c) A Quote
  • d) A Campaign
A2

A quote can be converted to an order only when its status is…

  • a) Draft
  • b) Pending Approval
  • c) Sent
  • d) Accepted
A3

Weighted pipeline forecast equals…

  • a) Σ deal amounts
  • b) Σ (deal amount × stage probability)
  • c) Σ invoice totals
  • d) Σ quote totals
A4

Which procedure class handles multi-table workflows & dashboards?

  • a) SP_
  • b) DevSP_
  • c) Views
  • d) Triggers
A5

Recording a partial payment sets the invoice status to…

  • a) Paid
  • b) Issued
  • c) Partially Paid
  • d) Overdue

Part B — Short answer

One or two sentences each.

B1

Explain why FolksCRM deactivates lookup values instead of deleting them.

B2

How does the platform prevent duplicate accounts during lead conversion?

B3

Describe what the shipment composite DevSP does in a single transaction.

B4

What triggers a workflow escalation, and what does the sweep do?

B5

Why are all reports built on read-only DevSPs?

Part C — Practical

C1

Take a new prospect of your own invention from lead capture to a fully paid invoice, then screenshot the Executive dashboard showing the revenue. Submit the Lead, Opportunity, Quote, Order and Invoice numbers.

Pass mark. 4/5 on Part A, 4/5 on Part B, and a complete Part C with matching record numbers across all five stages.

Answer key (trainers)

Reveal each section to mark. Lab self-checks are summarised first, then the final assessment.

Lab self-check answers (1–8)

1.1 In the browser's localStorage. 1.2 The menu is built from the user's role privileges (+ overrides), so two roles see different menus. 1.3 The Add privilege for that page.

2.1 Historical records still reference it; deleting would orphan them. 2.2 The weighted pipeline forecast. 2.3 The pick-list bundle DevSP, cached client-side.

3.1 Via the ContactAccounts M:N link (one flagged primary). 3.2 DevSP_Account_Insert_Composite. 3.3 On Campaign sends (comm preferences).

4.1 A score on the lead + a score-history row. 4.2 The lead status (grouped client-side). 4.3 Web-to-lead form, or bulk import.

5.1 Inserts/reuses Account, inserts/reuses Contact, creates Opportunity, stamps converted_to_*, writes audit + listener. 5.2 It reuses a matching existing account. 5.3 The new owner.

6.1 A stage-history row (with duration) + a workflow listener if gated. 6.2 Σ (amount × stage probability). 6.3 The approver's inbox / bell badge.

7.1 It can link to any module via related_to_module + related_to_id. 7.2 My Activities. 7.3 DevSP_Activity_AutoCreateFollowUp.

8.1 DevSP_Product_GetPriceForContext — product, customer, qty, date. 8.2 Sales history referencing it stays intact. 8.3 Committed on order confirm; released on cancel.

Lab self-check answers (9–16)

9.1 Accepted. 9.2 A revision (JSON snapshot) — preserves the negotiation trail. 9.3 The Workflow module.

10.1 Inserts shipment + lines, increments qty_shipped, recomputes order status. 10.2 It is released back to on-hand. 10.3 Yes — confirmed or partly-shipped orders can be invoiced.

11.1 Writes the payment, generates a receipt, recomputes invoice status + balance. 11.2 Invoice date + the payment term (e.g. Net 30). 11.3 To keep an audited, reversible money trail.

12.1 0–30 / 31–60 / 61–90 / 90+ days. 12.2 Manually via the admin "Run Job" page (cron in v2). 12.3 Being overdue past its due date.

13.1 By criteria applied to leads/contacts. 13.2 A channel opt-out in comm preferences. 13.3 campaign_id on the Lead.

14.1 (Module, EntityType, EntityID, Event, PayloadJson). 14.2 Reject → instance Rejected + notify originator; approve at last level → Complete. 14.3 A step older than its due time.

15.1 Read-only aggregations — no writes, safe to run anytime. 15.2 Sales Rep, Sales Manager, Marketing, Finance, Executive. 15.3 Register a report definition pointing at any DevSP.

16.1 Draft → Pending Approval → Approved → Sent → Accepted. 16.2 Quote submit-for-approval, and any gated order/invoice step. 16.3 Partially Paid; the balance sits in the 0–30 bucket (until overdue).

Final assessment — Part A (MCQ)

A1 b  ·  A2 d  ·  A3 b  ·  A4 b  ·  A5 c

Final assessment — Part B (model answers)

B1 Deactivation preserves referential integrity — records that already reference a lookup keep a valid pointer, and the value simply stops appearing in new dropdowns.

B2 Conversion reuses a matching existing account/contact instead of inserting; only when there's no match does it create new — and duplicates can still be folded with Account Merge.

B3 It inserts the shipment header + lines, increments each order line's qty_shipped, and recomputes the order's overall status, all atomically.

B4 A step left unactioned past its due time is escalated by the sweep job to the next-up approver, writing an escalation row.

B5 Reports only aggregate — never mutate — so they can run anytime without side effects, and every KPI traces to one named procedure.

Done! Return to the User Manual for reference, or the Documentation Home.