SOQ — the complete guide
The SOQ (Schedule of Quantities) is your project priced line by line: what the job is made of, how much of each thing, and what each costs. It is the spine of a QSME project — tenders are cut from it, the schedule is built from it, contracts point at its jobs, and what you actually pay is measured against it.
This page covers all of it: how the schedule is shaped, the five ways to fill it, columns and formulas, importing from Excel or CSV, templates, exporting, everything the SOQ feeds downstream, and the MCP tools an AI assistant uses.
SOQ or BOQ? In QSME the SOQ is the estimate — your own prices, before anyone quotes. The BOQ is the actuals — what the work really cost, from the Money ledger. You build the SOQ; the BOQ is produced for you as the job is paid for.
Where it sits
Sidebar → SOQ, with a project selected. There are two views of the same data, switched at the top right on a desktop:
| View | Best for |
|---|---|
| Sheet | Working at speed. One spreadsheet: every pocket, job and line in order, with subtotals and a grand total. Click a cell and type. |
| Classic | Working through a job at a time — cards for pockets and jobs, with the buttons written out. This is the view on a phone. |
How the schedule is shaped
| Level | What it is | Example |
|---|---|---|
| Tender pocket | A parcel of work you would put out as one tender. Usually a trade or a package. | Plumbing, Concrete, Preliminaries |
| Job | A piece of work inside that pocket. | Footings, First fix, Site establishment |
| Line | What the job is made of: a material line or a labour line. | 25 MPa concrete · 10 m³ · $250 · Carpenter · 40 hrs · $45 |
A job's total is the sum of its lines. A pocket's total is the sum of its jobs. The grand total at the foot is the sum of the pockets you are looking at — which is why the label tells you whether it is showing Draft, Active, or both.
Materials carry a quantity, a unit and a rate. Labour carries hours and an hourly rate. Both accept unpriced placeholder lines — quantity 0, rate 0 — which is a normal way to hold a spot for something you have not priced yet.
Draft and Active
Every pocket is either Draft (blue) or Active (green). It is a working state, not a permission:
- Draft — you are still pricing it. Filter the sheet to Draft to see only those.
- Active — you consider it settled. Activate on the pocket, or Activate all drafts on the toolbar, moves them over; Draft on an active pocket moves it back.
The filter at the top decides what the grand total counts, so if your estimate looks low, check whether you are looking at Active only while your pockets are still drafts.
Multi-unit projects
On a project with units (townhouses, stages, lots), a pocket can apply to all units or to selected units. The SOQ then filters with the unit picker, so you can price one block without the others in the way.
Five ways to fill it
- Type it. Add a pocket, add jobs, add lines. In the Sheet view it is all keyboard: click, type, Enter.
- A template. Your own saved schedules — see Templates.
- Import a spreadsheet. From Excel or CSV — see Importing from Excel or CSV.
- Draft it with AI. Create SOQ with AI asks what you are building — type, size, materials — and lets you attach documents. It produces a draft schedule for you to check. Every pocket it writes is marked as an AI draft until you keep it.
- Extract from a document. Pull quantities and rates out of a PDF estimate or a priced quote you already have.
Anything the AI drafts is a draft. It arrives marked, and you keep or discard it. Quantities and rates are a starting point to check, never an authority — QSME does not measure your building for you.
Drawing Intelligence
If your consent pack is uploaded, QSME can read it and fill the schedule from the plans, with page citations you can check. That has its own guide.
Columns
Beyond the fixed Description, Unit, Quantity, Rate, Total, you can add as many of your own columns as the job needs — supplier, cost code, waste %, order-by date, whether it is on site. They belong to the project, show in the sheet and come through on every export.
| Type | Holds |
|---|---|
| Text | Anything typed — a supplier, a code, a note. |
| Number | A plain figure — a count, a length, a factor. |
| Money | A dollar figure, totalled at the bottom. |
| Percent | A rate shown with a % sign. 15 means 15%. |
| Date | A day — delivery, order-by, inspection. |
| Pick from a list | One of your own options, chosen per line. |
| Tick box | Yes or no — supplied, confirmed, on site. |
| Formula | Worked out from the other columns, like Excel. |
Each column can fix its decimal places, set its width, and choose what the bottom row shows (sum, average, or nothing).
Formulas
A formula column works itself out on every line. The box leads with a plain sentence — multiply two columns, a percentage of a column, a column plus a percentage on top — and fills the blanks from lists, so a working formula takes three clicks and cannot come out broken.
The SOQ's own fields can be named directly: Qty, Rate, Total, Days, Staff. Your own columns are named in brackets: [Waste %].
Total * 15%
ROUND(Qty * (1 + [Waste %] / 100), 2)
IF(Qty > 100, Rate * 0.95, Rate)Operators are + - * / ^ ( ) and, inside IF, > < >= <= = <>. Functions are ROUND ROUNDUP ROUNDDOWN CEILING FLOOR ABS SQRT POW MIN MAX SUM AVERAGE IF AND OR NOT. A formula is checked as you type and says in words what is wrong — "a bracket is still open", "there is no column called Gst" — with a worked example against a $1,200 line.
#NAME? means it names a column that is not there, #DIV/0! a division by zero, #CYCLE two formulas depending on each other. One broken line never stops the rest of the schedule.
It is the same formula engine that runs in Sheets, so anything you learn in one works in the other.
Importing from Excel or CSV
Import on the toolbar takes an Excel workbook (.xlsx) or a CSV, up to 12 MB. Old .xls files are not supported — open them in Excel and use Save As → Excel Workbook (.xlsx).
Anything you export from QSME imports straight back in. Export, edit it wherever you like, bring the same file back — no reformatting, no re-typing headers.
The file
- Header row — the row naming the columns. It does not have to be the first row; a title line or a blank row above it is fine.
- Data rows — one row per material or labour line. Pockets and jobs are repeated on each row, or named once and left blank down the block (merged cells work too).
- Multiple sheets — in an
.xlsx, a sheet named SOQ or BOQ is used if there is one; otherwise the first sheet with rows in it.
The columns
Names are matched however they are written — spacing, punctuation and capitals do not matter, and each accepts several common wordings.
| Column | Also accepted as | Required | What it does |
|---|---|---|---|
| Tender Pocket | Category, Section, Trade, Package, Element | No | The pocket. With no pocket column at all, everything lands in one pocket named after the file. |
| Job | Work Item, Task, Activity | No | The job inside that pocket. Defaults to the pocket name. |
| Type | Item Type, Kind | No | Material or Labor. With no Type column, a line measured in hours or days is read as labour and everything else as a material. |
| Item | Description, Item Name, Particulars | Yes | The line description. |
| Unit | UOM, Unit of Measure | No | m², each, hrs… |
| Quantity | Qty | No | The quantity; for labour, total hours. |
| Unit Rate | Rate, Unit Price, Price, Cost | No | Price per unit, or the hourly rate. |
| Total | Amount, Total Cost, Line Total | No | Line total. If quantity × rate is blank, the total works the rate out. |
| Notes | Comments, Remarks | No | Notes; also used as the material description. |
| Days | Duration, Working days, Days on site | No | Seeds the job's length for the schedule. |
| Weather? | Weather sensitive, Rain affected | No | Yes/No — seeds whether rain stops the job. |
Money is read the way spreadsheets write it: $1,250.00, (120) for a negative, and semicolon-separated CSVs (what Excel produces in some regions).
Your own columns come too
Any column the importer does not recognise — Supplier, Cost code, Waste %, Location — is offered to you with a guessed type and a count of how many rows carried a value. Tick the ones to keep and they become project columns, with each line's value attached. Nothing is thrown away silently.
Example
Tender Pocket,Job,Type,Item,Unit,Quantity,Unit Rate,Total,Notes
Concrete,Footings,Material,Concrete 25MPa,m³,10,250,2500,Grade 25
Concrete,Footings,Material,Reinforcement,t,2.5,1200,3000,
Concrete,Footings,Labor,Pour & finish,hrs,40,45,1800,
Electrical,Installation,Material,Cable 2.5mm,m,100,3.50,350,
Electrical,Installation,Labor,Termination,hrs,8,55,440,That creates Concrete → Footings with two materials and one labour line, and Electrical → Installation with one of each.
What to expect
- Everything arrives as draft pockets, so you review before activating.
- Subtotal and GRAND TOTAL rows are skipped, so importing your own export never doubles the money.
- Unpriced lines are fine — quantity 0, rate 0 imports as a placeholder.
- Rows sharing a pocket and job name are grouped into that one job.
- CSV quoting: wrap a value containing commas or line breaks in double quotes; a literal quote inside a field is written
"". Save as UTF-8 so macrons survive.
Starting from the right shape
- Open the SOQ and use Export → Excel (.xlsx) or CSV.
- Edit that file wherever you like.
- Import it back.
Templates
Templates → My templates keeps a whole schedule on your account so you never build the same house twice.
- Save this schedule as a template — names and keeps the pockets, jobs and lines as they stand.
- Insert — drops it into whatever project you are on.
- Templates are private to you, and saving under a name you have used before replaces that template rather than making a second copy.
If you are re-using a schedule rather than editing one, this beats files entirely.
Exporting
Export offers three, and all three carry your own columns:
| Format | What you get |
|---|---|
| Excel (.xlsx) | The whole schedule, formatted. Imports straight back in. |
| CSV | The whole schedule, plain rows. |
| Printable. Widens from A4 to A3 to A2 as your columns need, keeps the description column readable, and prints with your letterhead. |
What the SOQ feeds
This is why the SOQ is worth keeping right.
| It feeds | How |
|---|---|
| Tenders | A tender is cut from a pocket: its jobs and lines become the scope tradies quote against, line by line — which is what makes quotes comparable. Bidders price your lines rather than sending a lump sum. |
| The schedule | Import jobs on the Schedule ticks jobs straight out of the SOQ. Each one arrives with its Days and whether rain stops it, so a priced schedule becomes a programme in a couple of clicks. Jobs in draft pockets can be scheduled too. |
| Contracts | A payment contract records which SOQ jobs it covers, which is how "committed" is known per job. |
| Payments and the BOQ | What you actually pay is recorded on the Money page and reported as BOQ actuals — the real cost, against the estimate you built here. |
| Sheets | A sheet line can link to an SOQ job and read its live estimate, and Estimate vs actual builds a sheet with a line per job: allowed, committed, paid. |
Coming the other way: Build SOQ from a sheet
If your priced schedule arrived as a spreadsheet and is now a Sheet, Build SOQ on that tab hands it to this same import: the sheet's name becomes a pocket, every heading becomes a job, every priced line an item. Use it for that case. If you are building an estimate from scratch, build it here.
Limits
| Tender pockets per project | 2 on a free plan, unlimited on paid |
| Your own columns | 100 per project |
| Import file | 12 MB |
Jobs and lines are not capped.
For AI assistants (MCP)
Connect Claude, ChatGPT, Claude Code, Codex or Cursor at qsme.co.nz/connect. An assistant works as you, sees only what you can see, and is held to the same rules.
What no assistant can do: move money, publish a tender, accept a bid, award work, or issue a contract. Those doors are not wired to MCP at all. It can draft; a person decides.
| Tool | What it does | Scope |
|---|---|---|
get_soq | The whole schedule as a tree: pockets → jobs → material and labour lines, with ids and totals. {project_id} | read |
add_soq_category | A new pocket. {project_id, name, description?, activate?} | write |
add_soq_job | A job inside a pocket. {project_id, category_id, title, specifications?, weather_sensitive?} | write |
add_soq_material | A material line. {project_id, job_id, name, quantity, unit, unit_rate, description?} | write |
add_soq_labour | A labour line. {project_id, job_id, description, est_hours, hourly_rate, notes?} | write |
update_soq_job | Retitle a job or change its notes or weather flag. {project_id, job_id, …} | write |
update_soq_material | Change a material line. {project_id, material_id, …} | write |
update_soq_labour | Change a labour line. {project_id, labour_id, …} | write |
delete_soq_item | Remove a job, a material line or a labour line. {project_id, item_id} | write |
create_estimate_vs_actual | Build the estimate-against-actual sheet from the project. {project_id, folder_id?} | write |
Notes for whoever is writing the prompt
- Rates exclude GST. Every rate an assistant writes is ex-GST, in New Zealand dollars.
- Units are normalised:
m, m2, m3, lm, no, item, ea, kg, t, lot, sum, hr. Anything unrecognised becomesitem, so pick from the list. - Ids come from
get_soq. A job id is not a line id;delete_soq_itemtakes whichever of the three you mean. - Never invent quantities. Measuring is the quantity surveyor's job, not the model's. Where a quantity is unknown, write the line unpriced (0 and 0) and say so.
- A new pocket is a draft unless
activateis set, which is the right default: a person should look before it counts. - Totals are worked out, not stored. Do not try to write a job or pocket total; add the lines and the totals follow.
Words used on this page
| Word | Meaning |
|---|---|
| SOQ | Schedule of Quantities — the estimate you build. |
| BOQ | The actuals: what the work really cost, from the Money ledger. |
| Tender pocket | A parcel of work you would tender as one — usually a trade. |
| Job | A piece of work inside a pocket. |
| Material line / labour line | What a job is made of: goods with a quantity and a rate, or hours at an hourly rate. |
| Draft / Active | A pocket you are still pricing, or one you consider settled. |
| Unit | On a multi-unit project, one townhouse, lot or stage. |
| Template | A whole schedule saved to your account and inserted into another project. |
| MCP | The connection an AI assistant uses to read and write QSME on your behalf. |
If something looks wrong
| What you see | What it means |
|---|---|
| The grand total reads $0 or looks low | You are filtered to Active while the pockets are still Draft (or the other way round). The label under the total says which it is counting. |
| "Pocket limit reached" | A free plan allows 2 tender pockets per project. Upgrade, or fold work into fewer pockets. |
| An import brought in nothing | The file needs at least an item description per row. The message names the columns it found — check the header row is the one you think it is. |
| An imported total doubled | Only if your file has subtotal rows that are not labelled as such. Rows starting Total / Subtotal / Grand Total are skipped. |
A formula shows #NAME? | It names a column that is not in this project — often one renamed or deleted. |
| The AI's pocket is still marked as a draft | It stays marked until you keep it. That is deliberate: an AI draft is a suggestion. |
Still stuck? hello@qsme.co.nz, or +64 27 338 8500.