Skip to main content

RFQs

What it is

The RFQ Terminal — every request for quote the company is working on, newest first. RFQs arrive three ways: a customer emails one and the mail sweep parses it, someone imports a file, or a buyer portal pushes one in.

The screen is built around four tabs, and which tab you are on decides what you are looking at:

TabWhat it shows
AllEvery real RFQ — received, in review, quoted, won and lost.
ApprovalsRFQs the email sweep produced that nobody has confirmed yet.
UnquotedReceived and in review — the actual to-do list.
QuotedQuoted, won and lost.

🔴 "All" does not mean every row. RFQs waiting on the Approvals tab are deliberately kept out of All, out of Unquoted, and out of every count on this screen. An email-parsed RFQ is a guess until a person accepts it, and one mailbox sweep in August 2026 produced 883 RFQs against a normal rate of 10–30 a day — putting those in All buries the real work. If an RFQ you know arrived is not in All, look on Approvals before concluding it was lost.

Rejected RFQs are hidden on every tab. Rejecting stamps the row rather than deleting it, so it stays auditable, but there is no tab that shows rejected RFQs back to you.

Who can open it

Any signed-in staff account that is active. There is no role restriction on this screen.

Two gates sit in front of it, both in proxy.ts:

  1. Account status — a signed-in account that is not active is sent back to the login page.
  2. The feature grant sales.rfqs, but only while FEATURE_GRANULAR_RBAC is switched on. When it is on and your account lacks that grant, the page bounces to the dashboard with ?denied=sales.rfqs in the address bar. The owner account bypasses this unconditionally.

The sidebar's own role settings do not gate this page — they only decide what is listed in the menu. Any signed-in session can reach the URL directly.

Before you start

  • The Approvals tab is where unreviewed email RFQs sit. It only shows an accent-coloured count when something is actually waiting.
  • Approving does not mean "someone has read it". An approved RFQ becomes Received — untouched work — not In Review. Approval only settles whether it is an RFQ at all.
  • Deleting an RFQ is blocked once it has been quoted. That is deliberate; see What it writes.

Every control on the page

Header row:

ControlWhat it does
All / Approvals / Unquoted / QuotedThe four tabs, each with its count. Switching returns you to page 1.
Search box (Search RFQ #, vessel, status...)Matches RFQ number, vessel, status and the customer's own reference. Filters as you type and returns you to page 1.
Filters⚠️ See "Partly built" below — the filter panel applies nothing. Saved Views inside it does work: it restores a saved search term.
ColumnsChoose which columns to show: Number, Client, Vessel, Status, Deadline, Items, Entity, Source, Last Action. Your choice is remembered. Reset restores the default six.
Import RFQOpens the import dialog — upload a file or key one in, review it, then commit.
⋯ MoreFour entries: Export CSV, Import RFQ, Print, Archive selected. Only Import RFQ and Print do anything — see "Partly built".

Tick rows and a bulk bar appears with: Mark Dispatched, Mark Won, Mark Lost and Close. Close asks to confirm first and names the count.

The table — RFQ #, Client Ref, Vessel, Status, Required By, Quote Deadline, and a menu at the end of each row.

  • RFQ # opens the RFQ.
  • Client Ref is the customer's own reference, e.g. a V.Ships order number. Internal ingest keys are hidden here, so a dash means "the sender gave us no reference of their own".
  • Vessel, Status, Required By, Quote Deadline are edited in place — click the cell, change it, and it saves on its own. Status offers Received, In Review, Quoted, Won, Lost.
  • All four cells lock once the RFQ is Won, Lost or Closed.
  • Quote Deadline shows red when it has passed and amber when it is due today, with the time remaining underneath.
  • The end-of-row menu is View / Edit / Delete — except on the Approvals tab, where the row instead carries View, Approve and Reject.

Paging sits at the bottom: 25 rows a page by default, with a page-size control.

Keyboard: the list supports arrow-key navigation, Enter to open, and a help dialog listing the shortcuts.

Partly built — do not rely on these

These are recorded in the feature inventory, and the screen shows them anyway:

  • The Filters panel applies nothing. It is wired with no filters and an empty apply handler, so opening it and pressing apply changes the list not at all. Use the search box and the tabs. The Saved Views control inside the panel is real and does restore a saved search.
  • There is no Export CSV in ⋯ More on this screen. The menu only lists an item when the screen supplies its handler, and this one supplies Import RFQ and Print only. A2Z-F030 was corrected from ACTIVE to ORPHANED on 2026-08-22 for exactly this reason; the inventory had also credited it to the shared DataTable toolbar export, which this screen does not use.
  • ⋯ More → Archive selected does nothing (A2Z-F031, marked ORPHANED in the inventory — "handlers are empty").
  • On a completely empty list, the offered Create RFQ and View Sample RFQ buttons link nowhere. Import from Email on that same empty state does work.

What it writes

ActionWhat it writes
Inline edit of Status, Required By, Quote DeadlinePATCH /api/rfqs/[id] — updates rfq_submissions. A failure reverts the cell and shows the reason.
Inline edit of VesselPATCH /api/rfqs/[id]/inline — updates rfq_submissions.
Approve (Approvals tab)Sets the RFQ's status to Received on rfq_submissions.
Reject (Approvals tab)Stamps retracted_at and a reason on rfq_submissions. It does not delete. The row leaves every tab but stays on record.
Bulk Mark Dispatched / Won / Lost / ClosePOST /api/rfqs/bulk. If some rows fail, the successes still stand and the failures are listed.
Delete (row menu)Removes the row from rfq_submissions. Its items and any auto-drafts go with it.
Import RFQCreates the RFQ and its items after you have reviewed the parsed result.

🔴 Delete is refused when any quotation references the RFQ. You are told how many and which quote numbers. This is on purpose — a priced document must never be silently orphaned. Delete those quotations first if the RFQ really must go.

When it goes wrong

An RFQ you were told about is not in the list. Check the Approvals tab — email-parsed RFQs wait there and never appear in All. If it is not there either, it may have been rejected, and rejected RFQs are hidden on every tab.

A status you pick will not save. Only Received, In Review, Quoted, Won and Lost are accepted. The cell is also locked outright once the RFQ is Won, Lost or Closed.

"Cannot delete this RFQ — N quotation(s) reference it." Working as intended. Delete the listed quotations first, or leave the RFQ in place.

Pressing apply in the Filters panel does nothing. Known — the panel is not wired up. Use the search box and the tabs.

Export CSV or Archive selected appears to do nothing. They do nothing. Both are recorded as unimplemented in the feature inventory.

A bulk action reports failures. The rows that succeeded are already changed; only the named ones need doing again.

  • RFQ detail — one RFQ, its items and everything raised from it.
  • Quotations — what an RFQ becomes once it is priced.