Browse the documentation

Features

Products

Your organization's product catalog: record each product's data, prices and files once, and it finds its own matching tenders and fills your bids and documents wherever you need it.

The My Products page, under the Catalog section of the navigation bar. Is your organization's shared product record. A product recorded here works everywhere on the platform: it matches new tenders on its own (this page, the Product alerts page and the notifications), it is linked to tender items from the tender page, and its data (trade name, packing, registration and VAT rate) is pulled into the NUPCO files and quotation documents. The catalog belongs to the whole organization: what a colleague adds, you see.

Tip:The rule behind all the matching: a product finds its tenders through its saved search query or its linked NUPCO codes, never through its name or its keywords, because a bare word matches everything that contains it (PPE matches an item called SLIPPER) and buries the real matches. A product with no query and no codes matches nothing.

The product list

The product list: names with a Medical badge, NUPCO codes, cost and sale price with the level each is stated per, and manufacturers

The table shows 50 products per page: the product's thumbnail and name (linking to its page) with a Medical badge where it applies, then the NUPCO product code, the Cost (USD) and Sale price columns for the roles allowed to see them (see roles) and the linked Manufacturers, each a link to its own page. Above the table a usage bar reads N of M products used: products count toward your organization's plan limit, and one moved to the trash frees its slot.

The search box: Search by name, NUPCO code, catalogue no. or manufacturer…. Looks for a plain word in those four fields at once, and understands a structured syntax in the style of the tender search bar with the catalog's own fields:

WriteTo find
catheterThe word in the product's name, NUPCO code, catalogue number or a linked manufacturer's name.
name:, description:, code:/nupco: or catalogue:The word in that one field. A plain word does not search the description, so target it with description:.
manufacturer:braunProducts linked to a manufacturer whose name contains the word.
keywords:bandageProducts one of whose stored keywords is this whole word. This field matches an entire stored keyword, not a fragment of one.
catheter OR tube, -veterinary, "exact phrase"The same grammar: OR for either word, - to exclude, and quotes for an exact phrase.

Beside the box an All manufacturers dropdown narrows the table to one manufacturer's products, and below it the collapsible By manufacturer panel shows a chip per manufacturer with its product count. Clicking one applies the same filter. The search, the filter and the page number all mirror into the URL, so a copied link opens on the same slice.

Adding a product

The new product form: the Basics and Regulatory sections and the start of Packaging, with the Save product bar

The Add product button opens the New product page with the full product form. Only the name is required; everything else is optional and can be left blank to be hidden from documents or to inherit defaults. The form is split into sections, each feeding a part of the platform:

  • Basics: the product name, the description, the Catalogue / model no., the Country of origin, and the NUPCO codes as one list: the first is the product's primary code and the rest are linked codes, the same codes as the NUPCO codes card. The manufacturer shows read-only, from the linked manufacturers.
  • Regulatory: the Medical product checkbox, the MDMA registration status (Ready / Under registration), the MDMA no. and its expiry, the Listing / IDL no. and the Shelf life: what prints on the product summary, the NUPCO response file and the compliance letter. For a product Under registration, submission packs attach the generated bilingual registration-status letter instead of the SFDA certificate. Marking a product medical switches the VAT to 0% automatically (qualifying medical goods are zero-rated in Saudi Arabia) and unmarking it back to 15%, with a note telling you so; a manual edit of the field afterwards is what sticks.
  • Packaging: how the product is packed, from the carton down to one piece, with its picture. The packing and the price per level section explains it.
  • Pricing and terms: Price per, then the Cost with its approximate SAR equivalent and the Sale price (SAR), each for one Price per level, then the VAT %, the FOC %, the Minimum order qty, and First delivery and Order delivery in days (leave them blank to inherit the organization defaults shown as a hint).
  • Tender matching: the Search query, the matching query, in the same input bar as the search page with field typeahead and live syntax validation. The how a product matches tenders section explains how it is used.
  • Notes: free text printed on the "Additional information" line of the product summary.
Note:Photos and files are not uploaded from the form: Save the product first to add files. Then upload them from the Photos & files card on its page. And at the plan limit, the add button opens the limit message instead of the form.

Packing and the price per level

Tip:This section is a summary. The full guide, with lab-reagent examples, how tender line units are read and how prices convert, is Packing levels: price per test, kit, vial or carton.

The Packaging section opens in Simple mode and asks What kind of product is it? with four cards: Item (gloves, syringes, sutures, devices), Liquid (vials, bottles, IV bags), Tablet (tablets, capsules) and Lab test (reagents, controls). The type names the levels for you: an item is a carton of boxes of pieces, a liquid a carton of boxes of vials, a lab test a carton of kits of vials. A type never changes a name you typed and never writes a count. Then How is it packed? asks only the counts: how many boxes a carton holds, and how many pieces a box holds. A liquid or a lab test also asks what one vial holds, such as 500 mL or 100 tests. A fifth card, Service (installation, delivery, training), has no packing: you pick its unit (job, visit, hour, day, month or lump sum) and type its price, which is used as it is on every tender line. The medical flag, the registration facts and the country of origin disappear with it, and a priced service goes into the NUPCO response file and attachments file without the catalog and certificate slots.

Advanced mode shows the narrower types (gloves, vials and ampoules, IV fluids, lab reagents and more), lets you rename each level from a list or type your own name, remove a level or add one, state what one piece holds for any type, and opens Sizes and weights with the dimensions, the weights and the check that the boxes fit the carton. Your browser remembers the mode you chose, and a product with something Simple mode does not show opens in Advanced.

Under the counts, a sentence sums the packing up (1 carton = 10 boxes = 1,000 pieces) beside a picture of the levels drawn for the type: gloves in a dispenser box, vials standing, IV bags lying flat. A missing count shows in the picture as a question (How many boxes are in a carton?), and a carton that is not a whole number of boxes offers the nearest whole count. Check packing asks a small AI model to read the product's name and the packing you entered and point out what looks wrong, such as a box count that reads like an amount. Each suggestion has an Apply button that fills the form, and nothing is saved until you save.

Price per, in Pricing and terms, says what your one cost and one sale price are for: one carton, one box, one piece, or one unit of what a piece holds, such as one test or one mL. A new product starts at the piece. Under each price the form shows what it comes to at every other level (150 per carton = 15 per box = 0.15 per piece), and from that one price, pricing from the catalog and pricing by margin work out each tender line's price in the line's own unit: a line bought per box of 100 is priced at 15, a line bought per piece at 0.15. Switching Price per on a saved price converts it and tells you so, with a link to keep the number instead. A level whose count is missing cannot be chosen until you enter the count.

Note:A product saved before this shows Price per: not set: its price is used as it is on every tender line, as before, until you choose what it is per. The product page shows the same picture and the price with its level and what it comes to at the other levels, and the product list and Edit in table add the level after each price (/ Carton).

Adding many at once

Three buttons beside Add product serve large catalogs, each for its own case:

Bulk add

The bulk add grid: rows you type or paste straight from Excel

Bulk add opens an excel-like sheet you type into or paste rows into straight from Excel: name, catalogue number, NUPCO code, prices, packing and registration data, and the Manufacturers cell takes several names separated by commas (up to 20 per row); a name not in your directory gets a new manufacturer created, and the review card names them before saving. Each row has a photo column taking up to 5 images (JPEG/PNG/WebP/GIF, 5MB each). Review and create shows the summary, and Create everything saves the batch in one atomic request: either every row is created or nothing is. Photos upload after the create, and a failed one is retried on its own without repeating the batch. Rows added here have no Price per: their prices are used as they are on every tender line until you set it in the product's form.

Import from Excel

The product import page: the spreadsheet upload with the template download, and the optional photos and catalogs upload

Import from Excel takes an .xlsx, .xls or .csv file up to 10MB with any column labels: your supplier's file as it is. Any field of the product form can be a column. To start from scratch, press Download template: its Products sheet carries the main columns, and its instructions sheet explains each column with an example and lists every further column you can add. The template and a catalog export carry the import's own headers, so their columns are read straight from them. One cell can hold several NUPCO codes, the first being the primary, or several manufacturers, separated by a semicolon (;). A Price per column says what each row's prices are for: Piece, Box, Carton, Content, or the name of one of the row's own levels, such as Vial. A cell naming no level of the row, or a level the row has no count for, drops that row's prices with the issue listed, rather than storing them as if they were per piece.

After Upload and review mapping the page shows how each column was understood (the column, its header, and which field it imports as, or Ignore), with a confidence score, concerns and a preview of the first rows, and you can correct any column from its dropdown before pressing Import. Nothing is written before you confirm; empty rows, repeated headers and banner strips are skipped and counted, and up to 500 rows import per run. A cell the import cannot use, such as an unknown country, is left empty and listed with its row, and the product is still created. Unknown manufacturers are created here too, named by the completion report.

Photos and catalogs in the same import

Select the images and PDF or Office files along with the sheet, or one ZIP file that holds them. Each file goes to the row that names it in the Photo files or Catalog files column or, when that cell is empty, to the row whose catalogue number is the file's name (SYR-5.jpg, SYR-5-2.jpg). The review lists the files that will not be attached, each with its reason. A product takes up to 5 photos (5MB each) and 5 catalogs (15MB each).

The files upload after the products are created, so keep the page open until it says they are attached. A file several products share, such as a brochure covering a whole range, uploads once and is copied to the rest. A file that fails is retried on its own, without creating the products again.

Edit in table

Edit-in-table mode: the catalog as a grid of editable cells

Edit in table turns the current list page into a sheet whose cells you edit directly. Name, catalogue number, NUPCO code, cost, sale price, units per case and the medical flag. Review changes shows how many rows changed and Confirm and save saves them together; other pages are edited page by page. Pricing columns your role may not see do not appear at all, and the server protects their values on save regardless. Each price shows the level it is per (/ Carton), which is changed in the product's form, not in the table.

The product page

The product page: the name and description, then the Basics, Regulatory, Packaging and Pricing and terms sections, each with an Edit link

Clicking a product opens its page: its photo when it has photos, its name, Medical badge and description, then its sections in the same order as the form: Basics, Regulatory, Packaging, Pricing and terms (the prices only for the roles allowed to see them), Tender matching and Notes. The Edit button at the top opens the full form in place, and the Edit link on a section opens it at that section; the Delete product button is inside the form. Below this card come the product's cards:

Photos and files

The photos and files card: product photos, the SFDA certificate and the catalog

The Photos & files card uploads the product's photos and its attachments in three categories: SFDA certificate, Catalog and Other. A file is saved to the product the moment it uploads (no edit mode needed) and removed from the × beside it. The first photo is the list thumbnail, and the SFDA certificate and catalog are what quotation documents and the NUPCO attachments packet pull later, so uploading them here once saves attaching them to every bid.

NUPCO codes

The NUPCO codes card with two codes and the add-code field

The NUPCO codes card links any number of material codes to the product beside its primary one, for a product that shows up in NUPCO tenders under more than one code. Tender items carrying one of these codes suggest this product in the linking panel on the tender page, and tenders carrying them count as its matching tenders.

Linked manufacturers

The product's manufacturers card with the default manufacturer marked

The Manufacturers card links the product to the companies that make it from your organization's directory: Link a manufacturer opens a picker searching by name or country, and each linked one has Set as default and Unlink. The Default manufacturer (at most one per product) is the one generated documents pick when none is specified, and the link is what shows the manufacturer's name in the list, its filter and the tender items table. Manufacturers have their own page and their own guide.

The two price histories

The sourcing price history and the NUPCO award history of one product

Two read-only cards appear when there is data: Sourcing price history, every supplier price your organization has recorded for this product across tenders and RFQs, newest first, and NUPCO award price history: what this product's codes were awarded at in published NUPCO results across all vendors, with a chip marking the rows your organization won, and a dash (never a zero) where no price was published. The second is the product's slice of the general Price History record.

At the bottom of the page sit Active matching tenders and Show past tenders: the tenders the product finds under the matching rules below, open ones then expired ones, with an item-match marker on those admitted through their items, and opening a tender from here opens its items table filtered to the same query.

How a product matches tenders

The product's matching tenders section with each tender's match type

The matching rules are the same everywhere. The product page, the Product alerts page and the notifications never disagree:

  • The search query. When the product has a saved search query, that is the whole matching expression, in the full search-page syntax. Keywords play no part in matching; they only help you search the catalog. No query? Only the codes path remains.
  • NUPCO codes always. A tender one of whose items carries the product's primary code or a linked one matches it with no query at all. The most precise path, and the one most worth maintaining.
  • A bare-word query must hold within one item. Because a product is one line item in reality, a query written as bare words must hold entirely within a single item of the tender (or within its own name and agency). catheter AND silicone does not match a tender where the two words sit on two different items. A query with explicit fields such as agency: and item:( ) runs exactly as written.

New matches enter the same scheduled check as keyword alerts: one Product match: notification per tender however many of your products match it, delivered on the same channels. In-app, by email to every member of the organization because products belong to the organization rather than one person, on WhatsApp for enabled numbers, and to your webhooks as a tender.matched event.

The Product alerts page

The product alerts page: active matching tenders, each with its matched products

The Product alerts page, under the Notifications section. Is the live picture of the matching: the open tenders matching any product in the catalog, nearest deadline first, up to 200 tenders. Each card shows the source, name, agency, deadline and remaining days, and beneath it Matched products (N) as chips leading to each product, with a dot on those matched through a specific item. A tender closing today stays listed until midnight Riyadh time, and one with no deadline is treated as open. The list is computed ahead of time and refreshes after every tender scrape and on any catalog change, so editing a product's query shows its effect on the very next visit.

Products with the same NUPCO code

The product page has a Products with the same NUPCO code card: the other products in your catalog that carry its primary code or one of its linked codes, with the shared code, catalogue number, manufacturers and the prices your role may see. The card shows only when another product carries the same code.

On the products list, choose Group by: NUPCO code to see the catalog under its codes, the code most products carry first and the products with no code last. A product with two codes appears under both. Grouping works with the search and the manufacturer filter, and stays in the page's link.

Exporting the catalog

The Export button: for owners and admins. Downloads the whole catalog as Excel (.xlsx) or CSV: every row with every field, pricing columns per your role and an empty cell, never a zero, for an unentered price. The file's headers deliberately match the import's labels, so an exported file goes back through Import from Excel with a fully confident column mapping. A practical way to edit the whole catalog in Excel and bring it back. Price per is written as the level's name, so it reads back as the same level.

Deleting and the trash

The trash page with a deleted product and its restore and delete-forever buttons

Deleting is always two steps. Delete product on its page, or ticking several in the list and pressing Delete. Moves them to the trash after a confirmation: they vanish from the list, the matching and the documents and free their plan slots, but nothing is lost. The Deleted products page at /app/products/trash shows them with all their data, each with Restore (which counts against the plan limit again) and Delete forever, plus an Empty trash button permanently deleting everything after a confirmation; the permanent kind has no undo.

Who sees and edits what

Every member sees the catalog itself; the differences run on two axes. Editing: the working roles. Owner, admin, sales and purchasing. Add, edit and delete; viewers and the technical role are read-only, and exporting is owner/admin only. Pricing: the viewer without pricing and technical roles see no price at all, and the sales role sees the sale price but not the cost. Withheld by the server, not merely the screen: hidden fields never arrive in any list, export or API response, and a role cannot write a field it cannot see. Only a member who sees both prices can change a saved product's Price per, because changing it converts both prices.

Outside the browser

The whole catalog is on the API under the products.read and products.write scopes: listing and creating at GET/POST /api/v1/products (with the same structured q, the manufacturer_id filter and pagination), one product at GET/PATCH/DELETE /api/v1/products/{id} (where omitted PATCH fields mean "unchanged", never "clear") batches at POST/PATCH /api/v1/products/bulk, the trash at /api/v1/products/trash and POST /api/v1/products/{id}/restore, codes and manufacturers at /api/v1/product-nupco-links and /api/v1/product-manufacturers, photos and attachments at /api/v1/products/{id}/photo and /attachment, the matches at GET /api/v1/products/alerts, and the export at GET /api/v1/products/export with the export scope.

On the MCP server the same family exists as tools: products_list, products_get, products_create, products_update, products_delete, products_bulk_create, products_restore, products_alerts_list and their siblings, and the sheet_import tool with the products target imports an Excel file down the same path as the page. So send the WhatsApp assistant a price list from your supplier (a file or a photo) and say "add these products to the catalog", and it reads them and creates them through these very tools, under your same role and plan limits. See the API reference and Getting started.