Chapter 4

Sales and Service

Cloud CRM (Aug 2026): Sales, Service, Marketing — plus Inventory, Projects, Work Orders and Partners — use the same master-detail workspace on the web: the module's records on top, the linked client (with its contacts) in Related, and the record's Interactions below. Partners lists client records whose Category is "Partner". A campaign shows its member-clients note instead of a single parent. The web Sales list resolves the Stage label and hides the source CRM's per-user system rows; Service resolves priority labels (Low/Medium/High). The web Sales toolbar has Current/All/Won/Lost/Suspended Sales and a close-date range dropdown (Any Date / This Month / This Quarter / This Year / Next 30 or 90 Days), matching the desktop's combos. Service's toolbar has All/My Tickets, a deadline range dropdown (Any Date / Overdue / Today / This Week / This Month / Next 30 Days), a Priority filter and a Status filter that covers both the web's own statuses and any status label synced in from your source CRM — see "On the web (the Service list)" below for what that means in practice.

Source-CRM equivalents: Opportunities and Customer Service. Renamed Sales and Service; the data is your source CRM's.

In this chapter - Sales: the list, the sale dialog, stages and status - Service: the list, the case dialog, solutions and knowledge base - Right-click menu and toolbar (Sales and Service) - Work Orders from a sale or a case - What Interactions shows


Sales

The Sales list shows every opportunity (status icon by status, coloured stage/probability, close date, revenue). Master-detail: selecting a sale shows its client's contacts and the sale's history.

Close Date column, sort order, and the Close Date filter (This Month / This Quarter / This Year / Next 30 or 90 Days). All three read the sale's real, recorded Close Date; a sale that has not closed yet shows its Estimated Close Date (the forecast) instead, so an open sale in your pipeline still has something useful in the column rather than a blank. None of the three ever reads the source CRM's internal "Actual Close Date" field — despite its name, that field is not a close date on a sale that has been edited since it closed; it is the date it was last modified, so reading it here would occasionally show you an edit timestamp labelled as a close date. Filtering "This Month", for example, therefore returns the sales that actually closed (or are forecast to close) this month, not the ones that were merely touched this month.

New Sale on the Sales panel creates a real opportunity record in the source database (the Clients right-click "Create a Sale…" item is not connected yet).

Sale dialog — tabs Basic (objective, description, client, revenue/cost, dates, next action, Stage with the probability bar, Confidence, Products/Services and Categories pickers, team / leader / campaign), Status (In Progress / Suspended / Won / Lost / Abandoned), User-Defined Fields, Activities, Sales Plans (activities or strategy view), Work Orders (Chapter 8), Project actions (Create a project from this sale — Chapter 5). OK/Apply save to the source database.

On the web (Add / Edit Opportunity page). The web form is a single page, not the tabbed dialog above.

Objective is the sale's name — what the sale is for — and it is required: save with it empty and the page comes back with "An objective is required." beside the box, the same words the desktop dialog uses, and nothing is saved. Objective is what the Sales list shows in its first column, what the sale's own page is titled, and what a search matches.

Changed 6 September 2026. This box used to be labelled Description, and what you typed in it was stored in the field the rest of the platform uses for the client's name. That is why an unlinked sale used to appear in the Sales list with its own title printed in the Client column. Your existing sales have not been altered: one created before this date still shows its name correctly everywhere, and its Client column is now blank rather than wrong. The next time you open such a sale and save it, its name moves into Objective and it looks like every other sale. Nothing is lost either way, and there is nothing you have to do.

It also carries a Client box in the Settings card:

  • Type two or more letters in the search box to look a client up by company name or person's name, then click a result — the client's ID drops into the ID box below it.
  • Or paste a client ID straight into the ID box, if you already have one.
  • Clear empties the box; saving then leaves the sale with no client.
  • Under the box the page tells you which client the sale is currently on ("Linked to ..."), or "Not linked to a client".
  • The Client box is editable when you add a sale and when you edit one, so a sale created from the ribbon with no client can be attached to the right client afterwards. A sale with no client shows "This record has no linked client yet." in its Related panel.
  • An ID that matches no client is rejected with a message on the field — it is never saved as though it worked.
  • Saving stores the chosen client's name on the sale as well as the link, so the Sales list can still name the client on a sale whose client record has not been brought across from your old CRM. Clearing the Client box clears that stored name too.

Forecast Revenue, Actual Revenue and Cost will not accept a negative number. Should a negative one already be in the database (imported, or written by the source CRM), the sale and ticket screens display it as -$50.00 — minus sign before the dollar sign (Chapter 7, How money is written) — rather than refusing to open. Ticket bill rate and fee follow the same rule. All Sales on the ribbon shows every sale regardless of status; the Sales list's own view box (Current / All / Won / Lost / Suspended Sales) does the same job from the list. Each row's status mark is coloured by status — New blue, In Progress green, Won green, Lost red, Suspended amber.

On the web (the Sales list). The web Sales page is the same master-detail workspace as the desktop panel, with three filters in its toolbar and a strip of numbers above the list:

  • View — Current / All / Won / Lost / Suspended Sales, the same five choices as the desktop. "Current Sales" is what a bare /sales/ link shows, which is why the ribbon's All Sales button carries ?view=all.
  • Close date — Any Date / This Month / This Quarter / This Year / Next 30 Days / Next 90 Days. A sale with no estimated close date is left out whenever one of these is chosen.
  • Status — the six status labels as they are stored (New, In Progress, Won, Lost, Abandoned, Suspended). The same filter is on the clickable pills under the toolbar, which carry a live count each. A pill is only offered when it would show something, so with "Current Sales" in force you see New and In Progress and not Won — a Won pill there would read 0 and, clicked, would give you an empty list.
  • The numbers strip — Sales / Open / Won / Lost / Suspended — follows your search and your close-date choice but NOT the view box, because those five numbers are the view box's buckets. So with "Current Sales" showing, the Open number and the list's own total are the same number and the Sales number is deliberately larger: it counts every sale your search matched.
  • The Client column is blank when a sale has no client — it no longer falls back to printing the sale's own name there.
  • Sorting. Click a column heading. Description, Stage, Revenue and Close sort the whole list. Client and Status do not, and the page says so under the list rather than moving nothing and leaving you guessing: the Client name is looked up in the Address Book for each row rather than stored on the sale, and the Status shown is worked out from two stored fields. Those two columns also switch Show all off while they are the sort, because a list that loads more rows as you scroll can only stay in order if the database is doing the ordering.
  • The source CRM's per-user @USER.OPP bookkeeping rows are hidden here, as they are on the desktop, and they are not counted in any of the numbers above.
  • Paging, page size and Show all work as described in Chapter 20.

Service

The Service list shows service tickets (status icon by status; priority, assigned to, deadline) — renamed from the source CRM's "cases" (Tickets is the TechieCRM name; the underlying records are unchanged). New Ticket on the Service panel creates a real case record in the source database (defaults to Unassigned); the Clients right-click "Create a Ticket…" item is not connected yet.

On the web (the Service list). The web Service page is the master-detail workspace, with four filters in its toolbar and a strip of numbers above the list:

  • View — All Tickets / My Tickets (assigned to you).
  • Deadline — Any Date / Overdue / Today / This Week / This Month / Next 30 Days, against the ticket's due date. A ticket with no due date is left out whenever one of these is chosen.
  • Priority — Low / Medium / High / Urgent. Only narrows a ticket whose priority was set as a word on this surface; a ticket synced in with only a raw priority code and no enrichment label is untouched by this filter.
  • Status — a ticket's status can come from two places: the five words this web page itself uses (Open, In Progress, Escalated, Resolved, Closed) or your source CRM's own status list (Assigned, Escalated, Resolved, Abandoned, Unassigned, Wait for Customer, Call Back, PreAuth Pending — the desktop's further breakdown). The dropdown offers both, and the clickable pills underneath show a live count for whichever ones your workspace actually has tickets in — a workspace with only web-created tickets sees the five web words; a fully-synced workspace sees your source CRM's own labels; either way, nothing is offered that would show zero.
  • The numbers strip — Total / Open / Closed / Overdue — counts every ticket in the workspace regardless of the filters above, and works whichever status list wrote the ticket: "Closed" means a ticket whose status is a recognised terminal word (Resolved, Closed, Abandoned) OR that has a resolved/closed date set, so a ticket carrying a status your workspace renamed is still counted correctly by its date.
  • Sorting. Click a column heading. Ticket #, Subject, Assigned and Due sort the whole list. Client, Status and Priority do not, and the page says so under the list: the Client name is looked up in the Address Book for each row, and Status/Priority are each worked out from a raw source-CRM code plus an enrichment label, neither of which is stored as the single value shown here.
  • Paging, page size and Show all work as described in Chapter 20.
  • Ticket numbers are an alphanumeric label from your source CRM (e.g. FP-00086), not a plain number — every surface (web, desktop and the mobile app) keeps the label exactly as your workspace shows it, rather than treating it as a number. Tickets still order newest-first correctly: the underlying record sequence is what decides the order, not the label's own text.

Two of these are also on the ribbon's View ▸ Filter group:

  • Overdue Tickets sets the panel's deadline filter to Overdue — every ticket whose deadline has passed.
  • Ticket Queue shows the tickets nobody has been assigned to. It loads All Tickets, then hides every row that has an assignee, and tells you how many are left; View ▸ Clear List (or changing a filter) brings the whole list back. It reads the Assigned to column of the list as it is showing, so if you have hidden that column with Column Setup the command says so instead of guessing — add the column back and run it again.

Ticket dialogBasic (subject, client/contact, type/reason/origin/queue, priority/severity, assigned to/by, deadline, Products/Services + Categories), Solution / Billing (solution notes — stored as a linked document —, knowledge-base article Browse/Details, resolved-by, resolution date, fee/bill rate/billable time), User-Defined Fields, Activities, Work Orders. A resolved ticket freezes its elapsed time.

Linking a knowledge base article to a ticket

On the ticket's Solution / Billing tab, Related knowledge base article links the ticket to an article in the Knowledge Base (Chapter 18).

  • Browse… lists every article by its article number and title and fills both boxes in.
  • The Article # box holds the article's own number in the same form the Knowledge Base shows it — FP-KB00042. You can also type a number in yourself; both FP-KB00042 and the bare digits 42 find the same article, and the box is rewritten to the full FP-KB… form once the article is found, so the ticket and the Knowledge Base always quote the same number.
  • Title fills in automatically from the matched article; it is not typed.
  • Details… opens the linked article. It stays greyed out until a number actually matches an article — a number that matches nothing is left exactly as you typed it (so an external reference is never overwritten) and the button stays disabled.

SLA: when an SLA policy applies, the ticket's response/resolution deadlines and status appear on the Compliance & SLA board (Chapter 11).

Right-click menu and toolbar (Sales and Service)

Both lists carry the source CRM's full right-click menu, and every item on it does something (before the September 2026 update the lower half of this menu was listed but not connected — a click did nothing). After Add / Open / User-Defined Fields / Delete / Select:

  • Add to Favorite List / Remove from Favorite List — the Favorite List window for the record's client entry (favorite lists hold client entries, as in the source CRM). The toolbar's Favorite List button offers the same plus View Favorite Lists.
  • Activities for — the client's tasks and meetings window (Chapter 3).
  • Phone Log — the client's logged calls: the source CRM's Outgoing calls / Incoming calls notes plus calls logged from TechieCRM's Home ▸ Phone buttons. Newest first; click a row to read the whole note.
  • Sale Monitoring… / Ticket Monitoring… — who is told when this record trips a monitoring rule, and which rules they hear about (see Monitoring below). The ribbon's Edit ▸ Monitor ▸ Sale and Process ▸ Monitor Ticket open the same window for the selected record, or the Monitor Rules window when nothing is selected.
  • Sale History / Ticket History — the record's own History entries (the source CRM's automatic "status changed / escalated from…" notes). Tick Show every note on this record to see all of its notes.
  • Export to Excel and Print — the list as shown (visible rows and columns), through the same Export window and print preview as the Clients list (Chapter 20).
  • Schedule Project Plan… — a project plan attached to this sale / ticket (not just its client), so its steps show under the record's Activities.
  • View in Clients — switches to the Clients window showing the record's client entry.
  • Properties — type, identification (Opp Id / ticket number), client, created by / on, owner, last modified.

Sales toolbar: Column Setup · Sales Funnel (one layer per sales stage for the sales currently listed — count and forecast revenue) · Sales Pipeline (forecast revenue per stage, the weighted value — revenue × probability — drawn inside each bar, and a status breakdown; both windows print) · Favorite List · Search (hides sales whose Company, Objective, Stage, Status or Close Date does not contain your text; Show all, a filter change or Refresh restores the list). Service toolbar: Column Setup · Favorite List · Activities · Phone Log · Monitoring · Properties · View in Clients · Schedule Project Plan — the same functions as the menu items above.

Monitoring (Sales and Service)

Monitoring watches every open sale and ticket for a condition and raises an alert when one trips. Alerts are in-app notifications: they appear in the web portal's bell and Notifications page, count toward the phone's unread badge, and show in this desktop's bell after the next cloud sync. Monitoring needs the local MongoDB store (Chapter 13 / Settings ▸ Database); without it the menu items say so.

Monitor Rules (Sale/Ticket Monitoring… ▸ Monitor rules…, or the ribbon Monitor button with nothing selected) is the workspace's rule table — one row per rule:

Rule Watches Trips when Threshold
Sale idle Sales an open sale has not been modified for the threshold 30 days
Sale past its close date Sales an open sale is past its estimated close date — or, when it has no estimate, past the close date recorded on the sale 0 days grace
Ticket past its deadline Tickets an open ticket is past its deadline 0 hours grace
Ticket unassigned Tickets an open ticket has had no assignee since it was created 4 hours
Ticket SLA breached Tickets the ticket's SLA tracker (Chapter 11, Compliance & SLA) has flipped to breached — the SLA engine decides; the threshold is not used

Each row has Active, Notify owner (the sale's owner / the ticket's assignee), Notify watchers, Extra recipients (emails, comma-separated), Tell about existing on activate and Max per run. Every rule starts off. Turning one on records the records already in that state silently — so 49 old tickets do not become 49 alerts the moment you tick the box — and from then on only a record that newly enters the state raises an alert. Tick Tell about existing on activate to be told about them anyway; when more than Max per run would go to one person they arrive as a single digest ("Ticket past its deadline: 49 tickets"). Evaluate now runs the rules immediately and shows what happened (how many tripped, how many were new, how many alerts were written, how many had nobody to tell); otherwise they run on every cloud sync tick (about every 15 minutes), after the source CRM refresh and before the push, so an alert rides the same sync up.

The same alert is never raised twice: the engine remembers the fact that tripped (the date a sale went idle, the deadline that passed) and stays quiet until the condition clears and trips again on a new fact — a deadline that is moved and missed again is a new alert; the same deadline is not. An alert you have read on the web stays read. Someone whose login has no email in the user directory cannot be told; the run counts those, and the rule's fallback recipient (or your own cloud sign-in email) is used only when nobody else can be reached.

Sale Monitoring… / Ticket Monitoring… (right-click, the Service toolbar's Monitoring, or the ribbon Monitor button with a record selected) is the record's watcher list: the people told, in addition to the owner, when this record trips a rule. Add me adds your cloud sign-in email; pick a user from the directory or type an email; Remove takes one off. Every active rule for this kind of record is the default; untick it to choose specific rules for these watchers. The lower list shows the alerts this record has raised (sent to whom, or recorded silently at activation, or cleared).

Rules and watcher lists live on this desktop's local store until the cloud registers the collections (a platform change tracked in docs/design/notification_engine.md); the alerts they raise reach every device now.

Work Orders from a sale or a ticket

Both dialogs have a Work Orders tab listing the work orders they spawned; Create Work Order raises one for the same customer with the sale/ticket as its parent (Chapter 8).

On a Sale there is a second way in — the toolbar's Actions ▸ Create Work Order from this Sale — which does exactly the same job as the tab's button, including seeding the new order with one line taken from the sale (its objective, forecast revenue and cost, quantity 1) that you can edit or remove before creating it. A sale never raises a work order by itself; both routes are restricted: a work order can only be raised from a won sale that has been saved. On any other sale the button and the menu item are greyed out and say why. The sale's existing work orders are still listed whatever its status. See Chapter 8, Raising a work order from a won sale.

Interactions

For a client, Interactions lists its Sales and Service records as child rows; double-click opens the dialog. Right-click ▸ Add ▸ Sale or Add ▸ Service opens the same new-record dialog as the Clients menu, with the selected client already filled in; saving refreshes the list. A Sale row's subtitle is its status and forecast revenue (Won · $12,500.00); a negative forecast — a credit or a reversed sale — reads -$50.00, never $-50.00 (Chapter 7, How money is written).

A ticket's (or sale's) notes, meetings and to-dos appear in two places. They are stored on the ticket, so the ticket's own Activities tab shows only its own — that is unchanged. But they also appear on the client's Interactions timeline, in date order among the client's own notes, documents, meetings and to-dos, so the client's history is complete without opening every ticket. A row that came from a ticket or a sale says so at the end of its description — “· Ticket #12” or “· Sale: Roof replacement” — so you can always tell where it lives. Open, edit, print and delete work on those rows exactly as they do on the client's own; deleting one removes the note or activity from the ticket too, because it is the same record.

Use the Types filter to narrow the timeline (Notes, Meetings, To-Dos …) — a ticket's note is a Note, so it follows that filter like any other. Inside a ticket's or sale's own Interactions view nothing is pooled: you see that record's history alone.

Deleting a sale or a ticket

Right-click ▸ Delete on the Sales or Service list (or the ribbon Edit ▸ Delete Record, or right-click the row on a client's Interactions timeline). A sale and a ticket each own records of their own — notes, to-dos and meetings linked to that sale or ticket rather than to the client — so, exactly as with a client entry, TechieCRM counts them before anything is removed.

If nothing is attached, you get a plain confirmation. If anything is attached, the Delete dialog lists each kind with its count and asks what should happen to them:

Choice What it does
Delete them together with this record The notes, to-dos and meetings go with the sale or ticket.
Move them to the client entry — name They are re-attached to the client (or contact) the sale or ticket belongs to, and unlinked from it, so they stay on that client's timeline.
Move them to another Sale / Ticket Search for and pick another sale (or ticket); the records are re-linked to it.

A sale's strategy activities and a ticket's project links belong to the record itself — they cannot be moved and are always removed with it, and the dialog says so. The record's user-defined field values and its audit-trail notes go with it too. A ticket's solution document is a Knowledge Base article and is left in the Library.

Delete respects your access rights: without delete permission for Sales or Service the menu item is blocked before anything is read.

Selecting several sales or tickets

Both lists use the standard record-list selection (Chapter 2): the row you clicked is the current one (outlined, and it drives the panels below), while selected rows are a separate peach-filled set. Click a row's first-column icon cell to select it, the header's master box to select or clear every row, or right-click ▸ Select / Unselect. Ribbon Edit ▸ List (Select All, De-select All, Invert Selection, Select Entry) acts on the same set.