Supplier RFQs
What it is
Every request for pricing sent to a supplier, newest first: which vessel and port it is for, which supplier it went to, when, and whether they have answered.
A supplier RFQ is not a purchase order. It asks a supplier what they would charge; the Purchase Orders screen is where you commit to buying.
Who can open it
Any signed-in staff account that is active. Two gates sit in front of it, both in proxy.ts: an
active account, and the ops.supplier-rfqs feature grant while FEATURE_GRANULAR_RBAC is on. The
owner bypasses the grant.
Before you start
Fixed 2026-08-23: until that date the wizard's Send Requests button failed every single time. It wrote the request without an entity, which the database refuses, so the create path had never once worked — every supplier RFQ in the system had come from a quotation, a procurement run or an internal RFQ instead. It now files the request against the entity in the switcher.
⚠️ What has not changed: nothing is emailed. The button still only writes rows. The supplier learns about the request when someone opens it and sends them the portal link by hand — see Supplier RFQ.
Pick the entity before you start. With none selected the wizard now stops you with "Select an entity before creating a supplier RFQ." rather than failing at the last step.
The entity switcher scopes the list. Changing entity re-runs the query filtered to it. Until 2026-08-23 the query carried no entity filter, so every entity's RFQs showed under whichever one was selected.
Every control on the page
New Supplier RFQ (top right) opens the three-step wizard — 🛳️ Vessel Details, 📋 RFQ Items, 🏢 Select Suppliers — with Cancel / Back and Next Step, ending in Send Requests. A vessel name is required to leave step 1. The request is filed against the entity selected in the switcher. Despite the button's name it sends nothing — see the note above.
Three counters across the top:
| Counter | What it counts |
|---|---|
| Pending | RFQs the supplier has not opened |
| Responded | RFQs the supplier has priced |
| Total Sent | Every RFQ on the list |
All three count the whole list, not what your search or filter has narrowed it to.
Guide sits inside the Total Sent card and opens a four-point explainer. ⚠️ Point 4 of it — "Suppliers receive a secure, passwordless link to submit their prices directly into your workspace" — is not true today. The link exists; nothing sends it.
Search and filter, above the table:
| Control | What it does |
|---|---|
| Search vessel or supplier... | Filters the loaded rows as you type. Vessel name and supplier name only — not port, not status |
| All Status | All Status, Pending, Viewed, Responded, Expired — all four real statuses. Viewed and Expired used to have badges in the table but no way to filter to them |
The table — Vessel & Port, Supplier, Sent Date, Required By, Status, and per-row actions. No column is sortable. Rows are always newest first.
- Vessel & Port — vessel name, with the port under it or N/A.
- Supplier — the supplier's name, or Unknown if the link is missing.
- Sent Date — ⚠️ despite the name this is when the record was created, filled in by the database. Nothing was posted, so nothing was "sent" at that moment.
- Required By — the deadline, or
—. - Status — one of pending, viewed, responded, expired.
- View → opens the detail screen.
- 🗑 deletes the RFQ after asking "Delete Supplier RFQ? This will permanently remove the RFQ and all associated data. This cannot be undone."
Empty state: "No Supplier RFQs yet" with "Start by creating your first RFQ to get competitive pricing from your maritime suppliers." — or "No matching RFQs found" / "Try a different search term." when a search is active.
What it writes
The list itself writes nothing. It reads supplier_rfqs with the supplier's name joined.
🗑 deletes from supplier_rfqs directly, under your own database permissions.
The wizard writes supplier_rfqs and supplier_rfq_items — one RFQ per selected supplier,
not one shared between them, each against the entity in the switcher. Two details are worth knowing:
- A supplier only gets the items that match their categories. A supplier with no categories set gets everything. A supplier whose categories match none of your items is skipped silently — select five and three may be dropped with no message.
- IMPA codes are looked up and attached where they match. A failed lookup does not stop the save — the RFQ goes out without codes.
When it goes wrong
"Select an entity before creating a supplier RFQ." Nothing was written. Choose an entity in the switcher and press the button again.
An error at the end of the wizard mentioning entity_id. That was the pre-2026-08-23 defect and
should no longer occur. If you see it, report it — it means the fix has been lost.
The list is empty and you expected rows. A failed load now says "Could not load supplier RFQs", prints the database message and offers Retry — so "No Supplier RFQs yet" means there genuinely are none for this entity. Until 2026-08-23 a failed query left the empty state showing, indistinguishable from having none. Check the entity switcher next.
A supplier says they never received anything. Expected — nothing is emailed. Open the RFQ, use Copy Portal Link, and send it yourself.
You cannot filter to Viewed or Expired. Correct; the dropdown has no such options. Use the search box to narrow by vessel or supplier and read the badges.
Switching entity changes nothing. Correct; this screen is not entity-filtered.
Related screens
- Supplier RFQ — one request, its items, and the portal link to send.
- RFQs — the customer-side request these are raised against.
- Suppliers — the suppliers offered by the wizard, and their categories.
- Purchase Orders — what you raise once you accept a price.