{"ns":"crm","title":"Pipewise","version":"4.0","summary":"Pipewise is a sales pipeline CRM. Teams track deals on a six-stage board with weighted totals, work a deal through its detail page, manage accounts and contacts (including duplicate detection and merge), price deals in four currencies and compare closed plus weighted pipeline with quota on a forecast view. The demo clock is pinned to 19 Oct 2026.","problem":"Sales managers need to trust the numbers on screen: what a stage is worth, which deals are late, what each currency converts to and whether the quarter will reach quota.","personas":[{"name":"Sales manager","need":"See the whole pipeline, move deals between stages and judge forecast against quota."},{"name":"Quota-carrying rep","need":"Log activity, keep the next step current and see only what is overdue."},{"name":"Sales operations","need":"Keep accounts and contacts clean by merging duplicates."}],"goals":["Every column total, weighted total and forecast figure reconciles to the deals behind it.","A deal closing today is never shown as overdue; one closing yesterday always is.","Foreign-currency amounts are converted at the published rate, and merges never lose data."],"features":[{"id":"AUT","title":"Sign-in and session","summary":"Email and password sign-in; sign-out closes the session.","reqs":[{"id":"FR-AUT-01","weight":"Must","text":"Sign-in rejects missing and wrong credentials with distinct messages and opens the board for valid ones.","accept":["Both fields empty: \"Enter your email and password\" and the login form stays","Wrong password: \"Invalid credentials\" and no board is shown","A valid rep account opens the board and the account menu shows the rep name"]},{"id":"FR-AUT-02","weight":"Should","text":"Sign out returns to the sign-in form and protected pages stay closed afterwards.","accept":["Opening the forecast page signed out shows the sign-in form","Browser Back after sign-out shows no deal data"]},{"id":"FR-AUT-03","weight":"Could","text":"The sign-in screen shows the brand panel (headline \"See every deal before it slips.\") beside a form with a Show/Hide password toggle.","accept":["Clicking Show reveals the password and the button reads \"Hide\"","No text is clipped or overlapping"]}]},{"id":"BRD","title":"Pipeline board","summary":"Six stage columns with counts, totals and weighted totals; deals move by drag or keyboard.","reqs":[{"id":"FR-BRD-01","weight":"Must","text":"The board shows six columns in order with their deal counts and an open-pipeline summary line.","accept":["Seeded counts: Prospect 5, Qualified 6, Proposal 7, Negotiation 6, Closed won 4, Closed lost 2","Summary reads \"24 open deals · $2,708,184 total · $1,162,131 weighted\""]},{"id":"FR-BRD-02","weight":"Must","text":"Each column shows a Total (sum of deal amounts in USD) and a Weighted total (sum of amount x stage probability). Probabilities are Prospect 10%, Qualified 30%, Proposal 50%, Negotiation 75%, Closed won 100%, Closed lost 0%.","accept":["Prospect $400,806 / $40,081; Qualified $803,620 / $241,086; Proposal $987,418 / $493,709; Negotiation $516,340 / $387,255","Closed won $182,760 / $182,760; Closed lost $58,380 / $0","For open stages below 100% the weighted total is lower than the total"]},{"id":"FR-BRD-03","weight":"Must","text":"Dragging a card onto another column moves the deal and recalculates both columns.","accept":["Toast \"<deal> moved to <stage>\"","Moving \"Wholesale portal\" from Prospect to Qualified gives Prospect 4 deals ($359,806 / $35,981) and Qualified 7 deals ($844,620 / $253,386)","The move is still there after a reload in the same tab"]},{"id":"FR-BRD-04","weight":"Should","text":"A focused card moves one stage right or left with Shift+ArrowRight / Shift+ArrowLeft.","accept":["The card's accessible name ends with \"Shift plus arrow keys move between stages.\"","Toast \"<deal> moved to <stage>\" and the target column count increases by one"]},{"id":"FR-BRD-05","weight":"Should","text":"Moving a deal to Closed lost requires a reason.","accept":["Dialog \"Mark deal as lost\" with a \"Lost reason\" select","Confirming without a reason shows \"Choose a reason for losing this deal\" and the dialog stays open","Escape or Cancel closes the dialog and leaves the deal where it was","With a reason chosen the card appears in Closed lost"]},{"id":"FR-BRD-06","weight":"Could","text":"The top search and the Owner select narrow the cards and the stage counts.","accept":["Search \"Brightloom\" leaves two cards","Owner \"Ravi Menon\" gives Prospect 1, Qualified 0, Proposal 2, Negotiation 1, Closed won 2, Closed lost 0"]},{"id":"FR-BRD-07","weight":"Must","text":"A card whose close date is before the demo date (19 Oct 2026) shows the date in red with an \"<n>d overdue\" pill, where n is the number of days late. A deal closing on the demo date is \"Due today\" and is not overdue.","accept":["Close 12 Oct shows \"7d overdue\"; 16 Oct \"3d overdue\"; 5 Oct \"14d overdue\"","Close 19 Oct shows the chip \"Due today\", a non-red date and no overdue pill"]},{"id":"FR-BRD-08","weight":"Could","text":"Cards show the native amount, the converted USD value muted beside it, the overdue state and the owner initials, in a flat style with aligned digits.","accept":["A EUR card reads \"€38,500\" with \"≈ $41,580\"","No shadows at rest; numbers use tabular digits"]}]},{"id":"DEL","title":"Deal detail and editing","summary":"Create, read, edit, delete and annotate a deal.","reqs":[{"id":"FR-DEL-01","weight":"Should","text":"The deal detail page shows amount, stage with probability, weighted value, close date status, contacts, next step and an activity timeline (newest first).","accept":["D-1001 \"Warehouse analytics rollout\": Amount $84,000, Negotiation (75% probability), Weighted value $63,000, Close date 6 Nov 2026 \"On schedule\"","Contacts Hannah Weiss (VP Operations) and Ines Carvalho (Buyer); next step \"Send revised MSA to legal\""]},{"id":"FR-DEL-02","weight":"Must","text":"Logging an activity adds it to the top of the timeline, and the next step can be edited; both persist after reload.","accept":["Empty activity text shows \"Write a short summary of the activity\" and adds nothing","Toast \"Activity logged\"; new entry is first in the timeline with its type","Toast \"Next step saved\"; the card shows the new text after a reload"]},{"id":"FR-DEL-03","weight":"Should","text":"The New deal form validates each field and reports its own message.","accept":["\"Deal name is required\", \"Deal name must be at least 3 characters\"","\"Amount is required\", \"Amount must be greater than 0\", \"Amount must be a positive number\" for non-numeric input, \"Amount can't exceed 100,000,000\"","\"Close date is required\", \"Close date must be a valid date (YYYY-MM-DD)\"","\"Choose an account\" when no account is selected","Escape closes the dialog without creating a deal"]},{"id":"FR-DEL-04","weight":"Must","text":"Creating a valid deal places it in Prospect, converts the amount to USD at the published rate and owns it by the account owner.","accept":["Toast \"Deal created\" and the new deal's detail page opens","EUR 20,000 shows \"≈ $21,600 at 1.08\", Stage Prospect (10% probability), Weighted value $2,160","Prospect then shows 6 deals, Total $422,406, Weighted $42,241","Amount 1 is accepted with Weighted value $0"]},{"id":"FR-DEL-05","weight":"Should","text":"Editing the close date updates the overdue state and records the change in the timeline.","accept":["Setting 2026-10-10 shows \"10 Oct 2026\" in red with \"9d overdue\"","Setting 2026-10-19 shows \"On schedule\" with no overdue pill","Timeline top entry \"Close date changed from 2026-10-30 to 2026-11-30\""]},{"id":"FR-DEL-06","weight":"Should","text":"Deleting a deal asks for confirmation; confirming removes it everywhere.","accept":["Dialog \"Delete this deal?\" warns that activity history will be removed; Cancel keeps the deal","Confirming shows \"Deal deleted\" and the board shows 23 open deals","Reopening the deal shows \"Deal not found\" with a \"Back to pipeline\" button"]},{"id":"FR-DEL-07","weight":"Could","text":"Changing the stage on the detail page moves the deal and updates probability and weighted value.","accept":["\"Ad ops dashboard\" Qualified (30%, $7,200) moved to Proposal shows toast \"Moved to Proposal\", 50% and $12,000"]}]},{"id":"FXC","title":"Currencies","summary":"Deals are priced in USD, EUR, GBP or JPY and converted to USD at published rates.","reqs":[{"id":"FR-FXC-01","weight":"Must","text":"Every foreign-currency amount converts to USD as amount x the published rate: USD 1, EUR 1.08, GBP 1.27, JPY 0.0067. The rate printed beside a converted value is the rate used.","accept":["EUR 38,500 gives \"≈ $41,580 at 1.08\"","GBP 22,400 gives \"≈ $28,448 at 1.27\"","JPY 8,600,000 gives \"≈ $57,620 at 0.0067\""]},{"id":"FR-FXC-02","weight":"Should","text":"The Forecast page lists the exchange rates table with the four published rates.","accept":["USD 1, EUR 1.08, GBP 1.27, JPY 0.0067"]}]},{"id":"ACC","title":"Accounts","summary":"Sortable, searchable, paged list of 30 accounts with a detail page.","reqs":[{"id":"FR-ACC-01","weight":"Must","text":"Accounts page ten at a time; each page starts exactly after the previous one ends, with no repeated or skipped rows.","accept":["\"30 accounts\", \"Showing 1–10 of 30\", \"Page 1 of 3\"; Previous disabled on page 1, Next disabled on page 3","Page 1 runs Ashgrove Energy to Granite Peak Outdoors; page 2 starts with Halden Freight; page 3 ends with Vantor Analytics"]},{"id":"FR-ACC-02","weight":"Should","text":"Column headers sort the whole list (not just the visible page), toggle direction on a second click and reset to page 1.","accept":["Default Account ascending (aria-sort \"ascending\")","Open pipeline descending: Meridian Cold Chain $410,000, Copperfield Mining $310,000, Cobalt Harbour Marine $240,000, Kingfisher Aviation Services $205,000","Open pipeline ascending starts with Fernleaf Organics, shown as \"—\"","Owner ascending starts with Cobalt Harbour Marine (Amara Nwosu)"]},{"id":"FR-ACC-03","weight":"Could","text":"Search filters accounts; no match shows an empty state.","accept":["\"logistics\" gives 3 accounts: Halden Freight, Harrow Logistics, Meridian Cold Chain","\"zzzz\" shows \"No accounts match “zzzz”.\""]},{"id":"FR-ACC-04","weight":"Could","text":"The account detail page shows open deal count, open pipeline, deals and contacts; an unknown id shows a not-found state.","accept":["Brightloom Textiles: Open deals 2, Open pipeline $96,000, two deals, contacts Hannah Weiss and Ines Carvalho","\"Account not found\" with a \"Back to accounts\" button"]}]},{"id":"CON","title":"Contacts and duplicates","summary":"Possible duplicate pairs are detected and can be merged or dismissed.","reqs":[{"id":"FR-CON-01","weight":"Must","text":"Duplicate detection flags pairs sharing an email, a phone number, or the same name at the same account, and labels the reason.","accept":["Subtitle \"43 contacts · 3 possible duplicate pairs\"","Marcus Doyle \"Same email address\"; Sofia Lindqvist \"Same name at the same account\"; Tomás Ribeiro \"Same phone number\""]},{"id":"FR-CON-02","weight":"Must","text":"Merging keeps the chosen record and fills any missing field (such as phone or title) from the other record; no data is lost.","accept":["Dialog \"Merge contacts\" with a \"Keep this record\" choice; Cancel changes nothing","Merging Sofia Lindqvist (keeping the record with no phone or title) shows \"Merged into Sofia Lindqvist\"","The surviving contact is Head of Retail, +33 1 55 55 01 99; counts become \"42 contacts · 2 possible duplicate pairs\""]},{"id":"FR-CON-03","weight":"Could","text":"\"Not a duplicate\" removes the pair from the list without deleting either contact.","accept":["Toast \"Marked as not a duplicate\"; pairs drop to 2; all contacts stay at 43"]}]},{"id":"FCS","title":"Forecast","summary":"Q4 closed won plus weighted pipeline versus quota.","reqs":[{"id":"FR-FCS-01","weight":"Must","text":"Forecast = closed won + weighted pipeline; attainment is closed won / quota and forecast vs quota is forecast / quota, using the $1,000,000 team quota (monthly quota $333,333).","accept":["Closed won $182,760 (18.3% attainment); Weighted pipeline $924,931; Forecast $1,107,691; Forecast vs quota 110.8%","October closed $182,760, weighted $343,224; November weighted $339,105; December weighted $242,602","By rep forecasts: Ravi Menon $258,740 (107.8%), Elena Park $255,075 (115.9%), Tobias Grant $220,670 (110.3%), Amara Nwosu $233,582 (129.8%), Lucas Ferreira $139,624 (87.3%)"]},{"id":"FR-FCS-02","weight":"Could","text":"The chart shows October, November and December as stacked bars (closed won plus weighted) with a dashed quota line at $333,333.","accept":["October is the tallest bar","Axis labels are at least 12px and nothing is clipped"]}]}],"nfr":[{"id":"NFR-01","weight":"Could","text":"Unknown routes show \"Page not found\" (\"The page you are looking for does not exist.\") with a \"Back to pipeline\" button."},{"id":"NFR-02","weight":"Could","text":"At 390px width there is no horizontal page scroll, gutters are 16px, the sidebar becomes a drawer opened by \"Open navigation\", and board columns scroll inside their own area.","accept":["Drawer lists Pipeline, Accounts, Contacts, Forecast and closes after a choice"]},{"id":"NFR-03","weight":"Could","text":"At 768px width the deal detail reflows without overflow and the title, stage select, Edit and Delete remain visible."},{"id":"NFR-04","weight":"Could","text":"With a dark colour scheme all screens use dark surfaces with legible text, and the overdue red keeps sufficient contrast."},{"id":"NFR-05","weight":"Should","text":"Application state is kept per browser tab: changes survive a reload in the same tab, and a new tab starts from the seeded book."}],"glossary":[{"term":"Weighted total","meaning":"Sum of amount x stage probability for the deals in a column, in USD."},{"term":"Overdue","meaning":"Close date strictly before the demo date of 19 Oct 2026."},{"term":"Forecast","meaning":"Closed won plus weighted pipeline for the quarter."}],"outOfScope":["Email sync","Import and export","Role permissions beyond sign-in"]}