1. Open your workspace
Extract the entire buyer ZIP. Open app/index.html in desktop Google Chrome. Keep app/, manual/, screenshots/ and examples/ together. You do not need Node, a local server, an account or an internet connection.
Tested on Linux x86_64, Google Chrome 152.0.7977.82, using local files with the browser context offline. Other browsers and operating systems are unverified. A 390px layout was checked for readable navigation and horizontally scrolling tables; desktop Chrome is the supported workflow.

2. Reach your first result: USD 48
Click Try the Northlight example. This loads a 10-board BOM and two quote files, already mapped and issued as revision 1. The example is deliberately unreviewed. The fixed review date is October 3, 2026.
Northlight needs 20 DEMO-R-A, 10 DEMO-C-B and 10 DEMO-J-C pieces. All names and parts are fictional. This exercise is about purchasing records, not component suitability.
- In Review & award, open Alpha / DEMO-R-A. Confirm quote validity and accept the five excess pieces. Add “Accept five spare pieces” and choose Award this offer.
- Award Alpha / DEMO-C-B, confirming validity. Award Beta / DEMO-J-C, also confirming validity.
- Open Alpha / DEMO-X. Select Excluded extra, write “Not in issued BOM” and Record row decision.
- Open Beta / DEMO-R-A. Select Unselected alternate, write “Alpha selected” and record the decision.
- Open Beta / DEMO-C-BX. The changed suffix is an identity conflict, so it cannot be awarded. Select Rejected, write “MPN suffix differs” and record the decision.
| Supplier | Selected parts | Fixed charges | Draft total |
|---|---|---|---|
| Alpha | 25 × 0.08 + 10 × 1.20 = 14.00 | 5.00 | USD 19.00 |
| Beta | 10 × 2.50 = 25.00 | 4.00 | USD 29.00 |
| Combined | 40 needed / 45 purchased / 5 excess | Two charges, once each | USD 48.00 |
All three demand lines are awarded and all six returned rows are accounted for. Only then does Complete coverage appear. This is a reviewed selection, not a cheapest-price recommendation.

The examples/ folder includes the three CSV inputs, an expected-results sheet and expected recipient draft. The separate free pack includes those files and this guide, without the paid application. You can inspect the exercise in a text editor or your own spreadsheet.
3. Bring your own files
For an existing job, go to Job & BOM → Start a new job. Save first. Name the job, choose USD, EUR or GBP and set a review date. Select your BOM and an explicit comma, semicolon or tab separator. Click Read & map columns.
Inputs must be UTF-8 text with one unique, nonempty header row and rectangular data. Quoted fields may contain delimiters, line breaks and doubled quotation marks. LF and CRLF are supported, with an optional UTF-8 byte-order mark. No XLSX, PDF, CAD files, nested BOMs or automatic supplier integrations are included.
| BOM field | How to map it |
|---|---|
| Manufacturer, exact MPN, quantity | Required. Identity keeps case, punctuation, suffixes and leading zeros. |
| Line ID | Optional, unique. If blank, generated as L1, L2, etc. Repeated MPNs remain separate rows. Reserved IDs __proto__, constructor and prototype are rejected. |
| Description | Optional, retained for the RFQ. |
| DNP | Optional. Enter each nonempty value you want excluded on a separate line in DNP values. Matching is exact. Any nonempty unrecognized token rejects the import. Clear included tokens such as “No” in your source copy before importing. All quantities, including excluded rows, must still be positive integers. |
Choose Per board × build count or Already extended. Always enter a positive build count; it is ignored for already-extended quantities. Click Preview mapped result, inspect included/excluded rows, then Confirm this import. The preview shows the first 20 rows; all valid rows are kept. Changes to mappings or form fields require another preview.
Issue a stable request
In Issue RFQ, review the requested quantities and issue date. Click Issue revision 1. Download the RFQ CSV or printable RFQ HTML and send it yourself to suppliers. Ask them to return the same IDs and exact manufacturer/MPN along with each quantities, price and price-per count.
If demand changes, edit the requested quantities here and click Reissue changed quantities. A confirmation explains that all awards and quote reviews will be cleared. Earlier issued snapshots remain in the project. Fixed quotes are never silently repriced. A quote too short for the new revision cannot be awarded.
Map returned quotes
In Supplier quotes, enter one supplier name and quote reference per file. Add quote date, optional expiry and promised dates, quote currency and fixed charges. Use dot decimals for charges. Choose dot or comma decimals for prices; thousands separators and scientific notation are not supported.
Read the quote file, then map required manufacturer, exact MPN, offered quantity, quoted price and price-per count. Optional fields are requested line ID, quoted line total and per-row currency. A price of 12 with a price-per count of 100 is 12 per 100 each; quantity is always the fixed number of pieces quoted. No pack/reel conversion is inferred. Preview and confirm.
One file is allowed per supplier name. Corrected quote prices or metadata require starting a new job and reimporting the corrected files; v1 does not edit or remove imported quotes. Save the old project for its history. The supplier register lists issued IDs missing from each reply; the review stage exposes unmatched extras and identity conflicts.
4. Review sources, then decide
Rows match a unique issued ID first, otherwise a unique exact manufacturer/MPN pair. A matching ID never makes a different MPN acceptable. Open Review to see the original filename, physical row, quote dates, raw values and SHA-256 source digest.

A manual link requires a reason and still cannot override manufacturer or MPN differences. For ambiguous repeated parts, explicitly link the correct issued line; every other returned row still needs its own decision.
| Condition | Required action |
|---|---|
| Short quantity, changed identity, mixed currency, mismatched quoted total | Cannot award. Reject, exclude or mark pending with a reason; obtain a corrected quote if you need to purchase it. |
| Excess quantity / zero price | Explicitly check the matching confirmation before awarding. |
| Quote validity | Confirm validity on the review date for every award. Blank expiry requires this buyer confirmation. Expired quotes are blocked; obtain a refreshed quote. |
| Review before issue/quote date | Correct the review date. Applying a different date clears selections for revalidation. |
| Extra or unselected row | Record excluded, rejected or unselected with a reason. Pending technical review remains unresolved. |
| Demand deferred | Use Defer / clear and enter a reason. Deferral keeps coverage partial. Clear decision reverses it; award another offer to change a selection. |
Costs use integer/rational arithmetic: fixed offered quantity × price ÷ price-per count. Each line rounds half-up to two decimal places; the rounded lines are summed, then fixed supplier charges are added once for each selected supplier. No tax, duty, currency conversion, price-break optimization or electrical equivalence is calculated.
For example, 3 pieces × 1.666667 per 1000 = 0.005000001, rounded to 0.01. A supplied extended total must equal the computed rounded line amount or the offer is blocked.
5. Export, save and reopen
Open Export handoff. The embedded preview is the same recipient HTML downloaded through Download printable draft. Open that HTML in Chrome and use Print for paper or PDF. Table column headings repeat on continued pages; the quote register title repeats with its headings. The app does not send, order or invoice anything.

Download handoff ZIP includes:
draft-requests.html: printable supplier drafts, totals, coverage and complete quote row register.supplier-S1.csv, etc.: one selected supplier file with each fixed quantity, price basis, line amount, charges and total.issued-rfq.csv,decisions.csvandunresolved.csv: current issued request, every quote row and unresolved/deferred demand.project.json: reopenable sources, mappings, revisions, decisions and hashes.originals/F1.txt, etc.: original UTF-8 bytes, renamed by internal ID to avoid path conflicts. The project maps IDs to original filenames.
Use Save project for a JSON download at any stage. In a fresh app tab, click Reopen and select it. The app validates the schema and original digests, reparses inputs and recomputes amounts/coverage. A damaged project does not replace current work. Source hashes detect accidental changes, not supplier authenticity; deliberately edited projects are not signed audit records.
Supported bounds
| Item | Limit |
|---|---|
| BOM / returned quotes | 500 BOM data rows; 2,500 quote data rows total; eight suppliers (one file each) |
| Files | 5 MiB each; 10 MiB total original UTF-8 inputs; 64 MiB saved project, including JSON escaping and revision history; changes exceeding this size are refused before commitment |
| Tables | 64 columns; 20,000 characters per cell; unique nonempty headers |
| Quantities | Positive integers: per-BOM row up to 1,000,000; build count up to 100,000; extended/requested/offered each quantity up to 1,000,000,000; price-per count up to 1,000,000 |
| Prices | 0 to 1,000,000,000 inclusive, maximum six decimals. Quoted line totals and fixed charges have at most two decimals and the same maximum. |
| Text / revisions | Job and supplier names, quote reference and line IDs up to 200 characters; filenames up to 255; decision/link notes up to 2,000; Up to 100 issued revisions, also subject to the project-size limit |
| Selection | One fixed offer per included line; no split awards, substitutions, consolidation or inventory management |
Only USD, EUR and GBP are available, with one currency for the entire job. If any supplier/row uses another supported currency it remains visible but cannot be awarded in this job. No CAD, distributor or spreadsheet-application integration is claimed.

Change would exceed 64 MiB: Your previous work is unchanged. Save the current job, then start a new job with the required current inputs. Large descriptions and repeated revisions consume the same project budget; the 100-revision limit does not guarantee space for every large job.
Troubleshooting
| What you see | What to do |
|---|---|
| Blank page or buttons do not work | Extract the entire archive, open app/index.html in the tested Chrome, and ensure JavaScript is permitted for local files. Do not open inside an archive preview. |
| Map required field / wrong number of fields | Select the correct separator. Ensure all rows use the same column count and required fields are mapped. Commas inside fields must be quoted. Re-export as UTF-8. |
| Duplicate headers/IDs or reserved ID | Use unique headers and stable, unique line IDs. Keep repeated MPNs as separate identified rows. |
| Preview disappears | Changing import details invalidates the previous preview. Click Preview mapped result again. |
| Unknown DNP token | Explicitly list each excluded token. For included rows, clear nonempty DNP values in a copy of the source before import. |
| Offer cannot be awarded | Read the source drawer's reasons. Quantity, identity, currency, date or supplier-total blockers require correction, not just a confirmation box. |
| Total is lower than expected | The total includes valid selected offers and charges for selected suppliers only. Review unresolved/deferred lines and all unselected rows. |
| Complete coverage will not appear | Award all included lines and account for every returned row. Pending reviews and deferrals intentionally keep the draft partial. |
| Project not opened / hash differs | Use an untouched saved JSON from this version. Do not hand-edit source text or approvals. Reimport original inputs into a new job if recovery is necessary. |
| No downloaded file | Check Chrome Downloads and local download permissions. A “download requested” message is not a claim the file was saved to disk. |
Privacy, keyboard use and removal
Runtime files are bundled; there are no network calls, accounts, telemetry, cookies or local-storage saves. Files are processed in the open tab and exported only when you choose. Closing the tab discards unsaved work. The browser and operating system may retain downloaded files and their usual local records.
Use Tab/Shift+Tab to move among labelled controls, Enter/Space to activate buttons and checkboxes, arrow keys for selections, and Escape to close a review dialog. Visible focus rings help track the active control. No accessibility certification is claimed.
To uninstall, close the tab and delete the extracted folder. Delete project/export files separately if desired. The app installs no service, extension or background process.
Version 1.0.0. Manual and screenshots reflect the tested release. The price is an experiment; no customer adoption, savings or compatibility beyond the tests is claimed.