---
title: Supplier portal
order: 6
updated: 2026-07-12
---

# Supplier portal

The Supplier Portal is a separate, browser-based interface that your suppliers use to view the enquiries you send them, submit and revise quotations, and track the purchase orders you place. Suppliers reach it through a link in the RFQ email — there is **no account registration and no password**. The portal is a plain web experience: it is not the Tauri desktop app, and suppliers never install anything.

It lives under `/supplier/*` and is scoped entirely to one supplier company. Everything a supplier does here is re-verified on the server — the link only controls *who* is logged in, never *what* they are allowed to do.

For the home-screen summary (KPIs, charts, activity trend), see [Supplier dashboard](/docs/procurement/supplier-dashboard). For the staff side of the same relationship — sending RFQs, reading responses, raising POs — see [RFQ cart](/docs/procurement/rfq-cart), [Vendor responses](/docs/procurement/vendor-responses), and [Create a purchase order](/docs/procurement/create-purchase-order).

## How suppliers access the portal

When you release an RFQ, each invited supplier receives an email containing a unique link of the form `/supplier/redirect?token=…`. Opening it verifies the token and drops the supplier into the portal:

- **If the enquiry is still open for them to quote**, the link lands directly on that enquiry (`/supplier/enquiry/{id}`) so they can fill in their rates.
- **Otherwise** — the enquiry has been closed, the deadline has passed, the invitation was superseded by a revised RFQ, or the link's own token has expired — the link lands on their **enquiries list** (`/supplier/enquiries`) instead, where the now read-only enquiry is still viewable alongside everything else you have sent them.

The server decides the landing page by checking three things at once: the invitation is in an open state (`invited`, `emailed`, or `quoted`), the sourcing event is still open for quote submission, **and** the closing date has not passed. Only if all three hold does the link open the enquiry for filling.

### The link never stops working

The email link is a **permanent identity credential**. Even long after the enquiry is closed — and even after the link token's own time-limit lapses — clicking it still logs the contact person back in so they can reach their enquiry history and orders. What the link controls is *access* to the portal. Whether they can still *submit* a quotation is governed separately by the enquiry's status and closing date, and is re-checked every time.

On sign-in the portal sets a secure session cookie (`supplier_token`) that lasts `30 days`, so the supplier can navigate freely without re-clicking the email link each time — until that session expires.

### Old email links

Links sent before the portal existed used the shape `/quotation-fill?token=…`. Those are automatically redirected to `/supplier/redirect?token=…`, so old emails keep working and land in the new portal.

## Company-wide view, person-level responses

A supplier company can have **several contact people** (you create these on the supplier's record). The portal treats them as one team:

- **Everything is visible to everyone at the supplier.** Whichever contact person signs in sees the *whole company's* dashboard, enquiries, and orders — not just the items addressed to them personally. If one colleague is away, another can still open the enquiry, read the in-progress draft, and see exactly what was sent and what is pending.
- **But only the contact an enquiry was sent to can respond to it.** Filling, saving a draft, submitting, or revising a quotation is restricted to that specific person (the "owner"). This is enforced on the server on every write: a save-draft or submit from anyone else is rejected with *"Only the contact person this enquiry was sent to can respond to it."* Everyone else gets a full read-only view.

Where the supplier has **more than one** contact person, the Enquiries and Orders lists add a *Contact Person* column and a matching filter so you can see, and narrow down by, who each enquiry or order was for. With a single contact person the column and filter are hidden — there is nothing to distinguish.

## Navigation

On desktop the portal shows a slim left sidebar that expands on hover (from `60px` collapsed to `280px`). It has three main destinations — *Dashboard*, *Enquiries*, *Orders* — plus *Settings* pinned to the bottom, and a *Supplier Portal* label in the footer. The logo links out to `intigra.app`.

Suppliers have no column-toggle controls, so the portal deliberately clears any stale table-layout preference on every load — this guarantees they always see the current default column set (including any columns added in a later app version).

## Enquiries list

Open *Enquiries* from the sidebar (or land here from the email link when the enquiry is already closed). The heading *Your Enquiries* carries a live count badge; a trailing `+` means more rows are available on the server than are currently loaded.

The list shows **all** enquiries sent to this supplier, across every contact person. It loads `10` at a time, and the next batch appears automatically as the supplier scrolls to the bottom (with a small spinner while it fetches).

### Columns

- *Products* — each product on the enquiry, with an info tooltip (*Product Details*) exposing the description, HSN code, and make.
- *Qty* — the quantity and unit for each line.
- *Rate* — the supplier's own **quoted rate per unit** for each line (gross, before tax and discount), e.g. `₹100 / Nos.`. This is a per-unit figure, *not* multiplied by quantity. It stays blank (`—`) until that line has been quoted.
- *Contact Person* — only present when the supplier has more than one contact; shows whom the enquiry was addressed to.
- *Received* — when the enquiry was sent, shown compact as `dd/mm`; hover for the full `dd/mm/yy HH:mm`.
- *Closing Date* — the submission deadline, same `dd/mm` compact / full-on-hover treatment.
- *Submitted* — when the supplier's quotation was submitted (blank until then).
- *Uploaded By* — who logged the quote. A portal upload shows the owner contact's name (or the signed-in person's own name), truncated to `5` characters plus `…` with the full name on hover. A quote keyed in manually by the buyer's staff shows the **buyer firm's name**. `—` until quoted.
- *Pending Days* — a coloured chip counting days since the enquiry was received, shown **only while the enquiry is genuinely pending**. `Today` for the same day, otherwise `N days`. Colour ramps: green for `≤ 1` day, accent for `≤ 4`, amber for `≤ 9`, red beyond that.
- *Status* — the supplier's own status; see below.
- *View* — opens the enquiry detail.

### The four statuses

The *Status* column only ever shows one of four values, derived on the server so the supplier always knows where they stand:

- *Pending* (accent) — still open and no rate submitted yet.
- *Quoted* — a rate has been submitted. **Amber** while the enquiry is still open; **green** once it has closed.
- *Lost* (red) — the enquiry closed (or the deadline passed) before any rate was submitted.
- *Regret* (grey) — the supplier declined to bid (a no-bid).

### Filters and sort

All filters and sort apply **server-side**, so they always reflect the supplier's full history rather than only what has been scrolled into view. They are stored in the URL, so a filtered view is shareable and survives a reload. Any change resets the list to the first page and refetches.

- *Product* — substring match on the product code or product-head name (debounced ~`300 ms`).
- *Status* — the supplier's own status: `Pending` / `Quoted` / `Lost` / `Regret`, or `All`.
- *Contact Person* — shown only when the supplier has more than one contact; narrows to enquiries addressed to that person.
- *Sort By* — `Received (Newest)`, `Received (Oldest)`, `Closing Date (Latest)`, or `Closing Date (Earliest)`. Default is `Received (Newest)`.

A *Clear Filters* button appears whenever any filter is active.

## Enquiry detail

Clicking *View* opens `/supplier/enquiry/{invitationId}`.

### Header and countdown

A *Back to Enquiries* link sits top-left. Top-right, while the enquiry is still open, a live *Time left to submit* countdown ticks down every second (days / hours / minutes / seconds). It disappears the moment the deadline passes or the enquiry closes.

### Parties and enquiry details

- *From (Buyer)* / *To (You)* — the buyer firm's name, address, and email on one side; the supplier's own name, address, GST number, and email on the other.
- *Enquiry Details* — *Received* date, *Closing Date* (full `dd/mm/yy HH:mm`), *Items* count, and the *Your Status* chip (the same four-status value as the list). A separate event chip reads `Released`, `Quoted`, `Awarded`, `Closed`, or `Cancelled`; an open event whose deadline has lapsed is shown as `Closed`.
- *Attention* — the contact person the enquiry was **addressed to** (the owner), with salutation, email, and phone. This is not necessarily the person viewing.

### Response summary

Once a draft or a submitted quotation exists, a summary card shows the *Payment Terms*, *Delivery* days, *Validity* days, the submission time (for a submitted quotation), and the supplier's *Remarks*. A draft-only response is flagged with a *Draft* chip.

### Items requested

A table lists each line the supplier was asked to price: *Product*, *Qty*, and *Make*. Once a response exists, it also shows the quoted *Rate*, *Tax %*, and *Disc %* per line (a declined line shows a *No Bid* chip). Each row expands to reveal the make, HSN code, unit, the buyer's description, and the supplier's own remarks.

### Attachments

Any files attached to the draft or the submitted quotation are listed and open in a new browser tab when clicked.

### Read-only notice for non-owners

If the person viewing is **not** the contact the enquiry was sent to, a locked notice appears — *"This enquiry was sent to {name}. You can view it, but only they can respond."* — and the response controls are hidden. They can still see the line items, any saved draft, the submitted quotation, and attachments.

### Actions

- When the enquiry is open **and** the viewer is the owner, a primary action button appears: *Fill Quotation* (nothing started yet), *Continue Draft* (a draft is saved), or *Revise Quotation* (a quotation was already submitted).
- When the window has gone, the button is replaced by a note explaining the enquiry is closed or the closing date has passed.
- If a quotation has been submitted more than once, a *Revision History* button opens a modal of every prior version.

## Fill quotation

The owner reaches this at `/supplier/enquiry/{invitationId}/fill-quotation` via the *Fill Quotation* / *Continue Draft* / *Revise Quotation* button. The page guards itself: if the enquiry is closed, the deadline has passed, or the viewer is not the owner, it bounces back to the detail page with an explanatory toast. The title reads *Fill Quotation*, or *Revise Quotation* when a quotation already exists.

### Overall fields

A row of four fields sits at the top:

- *Currency* — read-only, `INR`.
- *Delivery (days)* — a whole number, `≥ 0`.
- *Validity (days)* — a whole number, `≥ 0`.
- *Payment Terms* — free text (e.g. `30 days`), up to `500` characters.

*Delivery*, *Validity*, and *Payment Terms* are all **required to submit** (but not to save a draft). The rule is enforced again on the server, which rejects a submit missing any of the three.

### Per-product rows

One row per product the supplier was asked to quote. Each carries:

- *Product* and *Qty* — read-only, exactly as the buyer specified.
- *Rate* — the price per unit, `≥ 0`.
- *Tax %* — chosen from `0`, `5`, `12`, `18`, or `28`.
- *Disc %* — a discount percentage, clamped to `0`–`100`.
- *After Disc* and *Net Rate* — calculated live (`rate × (1 − disc%)`, then `× (1 + tax%)`); read-only.
- *Bid* — `Bidding` or `No Bid`. Choosing *No Bid* declines that line: its rate, tax, discount, and remarks are cleared and its money cells show `—`.

Below each row are the buyer's product description (read-only) and an optional per-line *Remarks* field (up to `2000` characters).

### Notes and attachments

- *Additional Notes* — a free-text area for anything the supplier wants to add.
- *Attachments* — drag-and-drop or browse to upload files. The client allows up to `10` attachments total and up to `50 MB` per file; each upload request carries at most `5` files at a time, so a large batch is uploaded in several goes. Oversized files are skipped with a warning.

### Save Draft vs Submit Quotation

- *Save Draft* — saves progress without submitting. The supplier can return later to continue. A draft belongs to the owner contact, so colleagues can *see* it read-only but not edit it.
- *Submit Quotation* — opens a *Submit Quotation?* confirmation, then sends the rates. On success the draft is automatically deleted.

Every submit is re-verified server-side, assuming the payload could be forged:

- The invitation must still be open (`invited` / `emailed` / `quoted`) and the event must still accept quotes; otherwise the submit is refused.
- If the closing date has passed, the submit is rejected outright.
- Line items are intersected with the invitation — any line not actually on the enquiry is silently dropped, and a payload with **no** valid lines is rejected.
- Every attachment id is checked to exist and be fully uploaded (`READY`); a payload referencing a missing or half-uploaded file is rejected.
- Server-side ranges mirror the form: rate `≥ 0`, tax `0`–`100`, discount `0`–`100`, currency exactly `3` characters, notes `≤ 2000`, up to `10` attachments.

## Orders

Open *Orders* from the sidebar for every purchase order the buyer has dispatched to this supplier (across all of the supplier's contact people). Drafts, cancelled, and deleted POs are never shown — the supplier only ever sees POs that were actually sent. Same `10`-per-page infinite scroll as the enquiries list.

### Delivery status, not lifecycle

The status shown here is the **delivery state**, derived from the buyer's inventory team approving stock arrivals against the PO. The supplier sees the result, never the underlying approvals:

- *Pending Delivery* (amber) — PO sent, nothing received yet.
- *Partially Delivered* (accent) — at least one item's quantity has been partially received.
- *Delivered* (green) — every item's full quantity has been received.

### Columns

- *PO Number* — the buyer's PO number.
- *Products* — with the same product-detail tooltip as the enquiry list.
- *Qty* — quantity and unit per line.
- *Contact Person* — only when the supplier has more than one contact.
- *PO Date* — `dd/mm/yy`.
- *Material Delivery Date* — the date of the most recent approved arrival against the PO, plus the number of whole calendar days from the PO date. Blank until something has arrived.
- *Delivery* — the delivery-status chip above.
- *Total* — the grand total including tax and any additional charges.
- *View* — opens the order detail.

### Filters and sort

- *Product* — substring match on product code or product-head name (debounced).
- *Delivery Status* — `Pending Delivery` / `Partially Delivered` / `Delivered`, or `All`.
- *Contact Person* — only when the supplier has more than one contact.
- *Sort By* — `PO Date (Newest)` or `PO Date (Oldest)`. Default is newest.

## Order detail

Clicking *View* opens `/supplier/order/{orderId}`. A PO that is still a draft or has been cancelled is never reachable here — the server returns "Order not available" for anything outside the three visible delivery states.

- *From (Purchaser)* / *To (You)* — buyer firm and supplier company details (names, addresses, buyer email, supplier GST).
- *PO Details* / *Attention* — the *PO Number*, *PO Date*, and delivery chip on one side; the contact person the PO was addressed to (salutation, post, email, phone) on the other.
- *Your Reference* — a compact strip shown only when the buyer recorded the supplier's quotation number and/or offer date on the PO.
- *Items* — a table of *Product*, *Qty*, *Delivered* (a `received / ordered` chip that turns green when fully received, amber when partial), *Price*, *Disc %*, *Tax %*, and line *Total*. Rows expand for make, HSN, unit, and description.
- *Additional Charges* — a table (*Charge*, *Amount*, *Tax %*, *Total*), shown only when the PO carries charges.
- *Totals* — a strip of *Subtotal*, *Discount*, *Tax*, *Charges*, and an emphasised *Grand Total*.
- *Deliveries* — one row per approved arrival against the PO (*Date*, *Items*, *Qty*, and any invoice *Attachments* that open in a new tab), shown only once at least one delivery has been approved. Return-to-supplier (reverse) entries are excluded.
- *Notes* — the buyer's PO note, if any, at the bottom.

The detail page deliberately omits internal fields such as *Created By*, *Created At*, and a literal "Status: sent" line — the delivery chip already conveys the visible state, and the rest is internal to the buyer.

## Profile & settings

Open *Settings* from the bottom of the sidebar (`/supplier/profile`). It is a read-only view of what the buyer holds about this supplier, plus one preference:

- *Profile* — the supplier *Company* (name, address, GST number) and the signed-in *Contact Person* (salutation, name, post, email, phone).
- *What We Source* — the *Product Categories* (product heads) and *Makes* the buyer has tagged this supplier with. Names only; the supplier can view but not edit these.
- *Customisations* — a *Dark Mode* toggle to switch the portal between light and dark themes.

## Draft behaviour

When a supplier saves a draft:

- The enquiry detail page shows a *Continue Draft* button instead of *Fill Quotation*.
- On the staff side (the Vendor detail page), the *Fill Quotation* action is disabled with the tooltip *"Supplier has a saved draft on the portal"* — this prevents staff from overwriting the supplier's in-progress work.
- Once the supplier submits their quotation, the draft is automatically deleted.

## Session expiry

If the portal session expires (or the `auth/me` check otherwise fails), the supplier is sent to a *Session Expired* screen asking them to use the link from their original email. That original link still works indefinitely — re-clicking it simply starts a fresh `30-day` session and drops them on the relevant enquiry, or, if it is now closed, on their enquiries list. See [How suppliers access the portal](#how-suppliers-access-the-portal).

## Common questions

### Do suppliers need an account or password?

No. Access is entirely through the unique link in the RFQ email. Signing in mints a `30-day` session cookie; no registration, username, or password is involved.

### The link is old — will it still open the portal?

Yes. The email link is a permanent credential: even after its own token time-limit passes and even after the enquiry closes, it still signs the contact person in so they can browse their enquiry and order history. It just may no longer let them *submit* — that depends on the enquiry's status and closing date. Old `/quotation-fill?token=…` links from before the portal are redirected automatically.

### Why can my colleague see an enquiry that wasn't sent to them?

By design. The portal is company-wide — every contact person at the supplier can *view* all of the company's enquiries and orders. Only the contact an enquiry was addressed to can *respond* to it; the server rejects any draft or submit from anyone else. When a supplier has more than one contact, a *Contact Person* column and filter show who each enquiry or order was for.

### The *Fill Quotation* button is missing — why?

Either the enquiry is no longer open (closed, or the deadline has passed — in which case the page shows an explanatory note instead), or you are not the contact it was addressed to (you will see a read-only notice naming who is). If you are the right person and it is still open, the button reads *Continue Draft* when a draft is saved, or *Revise Quotation* when a quotation was already submitted.

### Can a supplier revise a quotation after submitting?

Yes, as long as the enquiry is still open. The detail page shows *Revise Quotation*; submitting again keeps the previous version in a *Revision History* you can open from the same page.

### What do the enquiry statuses mean?

*Pending* — open, nothing submitted. *Quoted* — a rate was submitted (amber while the enquiry is open, green once closed). *Lost* — the enquiry closed with no rate submitted. *Regret* — the supplier declined to bid. Every enquiry is exactly one of these.

### The order shows "Pending Delivery" but I've shipped — why?

The delivery status reflects what the buyer's inventory team has *approved as received* against the PO, not what has physically left the supplier. It moves to *Partially Delivered* or *Delivered* as arrivals are approved on the buyer's side. The *Material Delivery Date* column and the *Deliveries* table on the order detail show what has been recorded so far. See [Add a stock arrival](/docs/inventory/add-stock-arrival) for the buyer-side flow.

### Where do the RFQ email and its self-fill link get configured?

On the staff side, under *Settings → Firm Customisation → Procurement*. The RFQ email wording, the "self-fill" link toggle, and the per-vendor link validity all live in [RFQ personalisation](/docs/settings/document-templates#rfq-personalisation); the numbering is set in the [RFQ number format](/docs/settings/document-templates#rfq-number-format). To read and compare the responses suppliers submit, see [Vendor responses](/docs/procurement/vendor-responses).
