Projects

Sales and project workspace

A Next.js and TypeScript workspace connecting customer records, product configuration, quotes, and follow-up.

  • Software

My experience in sales and project management showed how much context gets scattered across customer conversations, product choices, and quotes. The workspace brings those steps together and makes the next action easier to find.

When
2026
Where
Bang & Olufsen Boston
Role
Designer and developer
Covers
Customers, follow-ups, quotes, projects, sales, and inventory
In use
Daily by the showroom's staff
Access
Sign-in with roles for sales, operations, and service staff
Data shown here
Fictional records only
Tools
Next.js, React, TypeScript, Postgres, Drizzle, Clerk, Zod, pdf-lib

Records along the sales path, each linked to the next. All example values are fictional.

Customer: interactions and follow-ups. Example: Example Customer. Product configuration: product families, options, and compatibility rules. Example: Example family, 3 options. Quote: sections, item groups, and approval. Example: 2 sections, 4 item groups.

An accepted quote becomes a sale in one database transaction. If the conversion is submitted twice, a unique constraint returns the existing sale instead of creating another. Example: Sale 1001.

Project: spaces and tasks. Example: Living room, 5 tasks. Follow-up: the next action, kept with the customer. Example: Call back next week.

Error policy, with fictional messages. An error the employee can fix gets a plain message saying what to change, for example: Pick an option for item group 2, then save. An unexpected error is logged on the server with a reference ID, and the message shows that ID, for example: Something went wrong. Reference ID EX-1042. When the database cannot be reached, the screen says that nothing was saved.

Each record links to the one before and after it. The quote-to-sale step is a single transaction, and every error tells the employee what happened to their work. Fictional records and messages.

Problem

A single sale passes through several steps: a conversation with the customer, a set of product choices that have to work together, a quote, a project with rooms and tasks, and follow-ups along the way. When those live in separate places, the next action is easy to lose. The workspace keeps them connected so each record links to the ones before and after it.

My role

Alongside my sales and project-management role at Bang & Olufsen Boston, my work on this showroom application covered the data model, screens, quote and sale workflows, access control, and test suite. The showroom’s staff use it day to day.

Data model

At a conceptual level, the workspace connects:

  • Customers with their interactions and follow-ups, plus a review step for likely duplicate customer records.
  • Products with inventory, including serialized units, and configurable product families whose options carry compatibility rules.
  • Quotes built from sections and item groups, with an approval step.
  • Projects organized by space, linked to the quotes that belong to them, with tasks.
  • Sales and operations, covering payments, shipments, vendor orders, and receipts.

Navigation follows the working day: today’s dashboard and follow-ups, relationships, sales, store operations, and administration. Each role sees only the sections it needs.

Moving from quote to sale

When a customer accepts a quote, it becomes a sale inside a single database transaction. If the same conversion is submitted twice, for example by a double click or a retried request, a unique constraint catches the second attempt and returns the existing sale instead of creating another one or adjusting stock twice.

Validation and error recovery

  • Workflow errors that an employee can fix come back as plain messages that say what to change.
  • Unexpected errors are logged on the server with a generated reference ID, and that ID appears in the message so the problem can be found later.
  • If the database cannot be reached, the screen says that nothing was saved.
  • List screens keep showing the records they already loaded when a refresh fails, with a visible retry.
  • Background jobs that derive sale records retry with capped exponential backoff.

Outbound actions stay with a person

Integrations that reach outside the workspace are switched off unless configured. Email support creates drafts and never sends on its own. The built-in assistant proposes actions, such as updating a record, and an employee confirms or cancels each one.

Testing

The project has automated tests for its workflows, including concurrency tests against Postgres for the quote-to-sale path, and browser acceptance tests at desktop, tablet, and phone sizes.