HEX Grain
HEX Consultancy HEX Consultancy

HEX Grain

Doors & cabinet costing — built on HEX Consultancy's own pricing logic

Working as Display currency
Welcome to HEX Grain 👋

HEX Consultancy's doors, cabinets & kitchen costing bench — priced items track per client/project and roll straight into quotations and invoices.

Who's working right now?

What do you want to do?

click a card to jump straight there

How it all fits together

click any step to open it

Doors, cabinets and kitchens (a kitchen is just a run of cabinets, priced module by module) all follow this same path, start to finish.


Display currency (top right) only changes how Door/Cabinet/Session Log/Overview/Doc Log are BROWSED — it never changes what's stored. Pricing itself always happens in your base currency, set in Library.
HEX-IQ — the small blue hexagon in the bottom-right corner — is a chat assistant built into this tool. It only ever sees this tool's own live data (Library prices/stock, the open session, business overview), never invents figures, and can flag things like unset prices, low stock, missing lead times or thin margins.

Door specification

dims in mm
Leaf thickness is independent of jamb width — the leaf is the slab (~35–64mm); the jamb is the timber casing lining the wall opening (typically 150–200mm to span the wall).
Jamb/précadre is a rough sub-frame built into the wall opening ahead of the finished frame — always plywood (or a melamine-faced board if you want it faced), priced by area, not the frame's solid-wood species.

Accessories & hardware

Labor & shop cost mode

from library rates

Indirect costs (this item)

overhead, power, depreciation…

Elevation

Jamb / head section

Schematic material build-up through the jamb (a head section, at the top of the frame, is typically the same build-up) — not to architectural drafting standard. Same layers left to right whichever side you're cutting, since the app doesn't distinguish hinge side from lock side.

Cost breakdown — dry cost

per unit
ComponentQty / basisCost
Dry cost
–
Overhead + profit
–
Sell price
–

Material price sensitivity

what if board/veneer/hardware/hinge prices move?

Cabinet specification

dims in mm

Hardware

Indirect costs (this item)

overhead, power, depreciation…

Front elevation

Side view

Looking along the width, wall (back) on the left, room (front) on the right — shows depth, shelf heights and the door leaf's own thickness.

Top view

Plan view from above — wall (back) at the top, room (front) at the bottom, with door swing shown for reference.

Cost breakdown — dry cost

per unit
ComponentQty / basisCost
Dry cost
–
Overhead + profit
–
Sell price
–

Material price sensitivity

what if board/veneer/hardware/hinge prices move?

Kitchen

modular floor + wall cabinets along one or more walls, priced module by module
Same finish on every cabinet?
Overhead and profit are set once for the whole kitchen, not per module. Height is set once per kitchen too, shared by every wall in an L/U layout. Shelves and drawers are always set per module. When "Same finish" is Yes, box/back/door materials, finish and toggles (back / hanger rail / soft-close) are set once above and locked on every module; when No, each module sets its own. A drawer module's front is priced as part of the drawer itself — same as the Cabinet tab — with no separate front-panel material line.

Front elevation

One strip per wall for an L/U layout — perpendicular walls can't share one flat elevation.

Side view

Schematic side profile per row (every floor module shares the same height/depth, likewise every wall module) — wall above, floor below.

Top view

Plan view, drawn as the actual straight/L/U footprint — floor-unit depth solid, wall-unit footprint as a dashed inset near the wall line.

Cost summary

per module + kitchen total
ModuleDrySell
Dry cost
–
Overhead + profit
–
Sell price
–

Material price sensitivity

what if board/veneer/hardware prices move? — whole kitchen

Cladding specification

dims in mm, area in m²

Openings to deduct

doors, windows — by height × width, positioned exactly
"From left" and "from floor" locate the opening's bottom-left corner on that wall, so it's drawn exactly where it is on site.


Backing (battens)

fixed behind every cladding type — timber, not invented pricing
Estimated as 1 running metre of batten per (spacing ÷ 1000) m² of area — a standard estimating approximation, override the LM below if you measure it differently.

Fixing hardware


Site install

separate crew from shop production

Front view

Front elevation — openings drawn in place.

Top view

Plan view from above.

Cost breakdown — dry cost

per unit
ComponentQty / basisCost
Dry cost
–
Overhead + profit
–
Sell price
–

Material price sensitivity

what if board/veneer/wood prices move?

Bill of Quantities

upload or build a BOQ, then price each line into Door/Cabinet before it lands in the session log

A BOQ belongs to one session log — same Client/Project as the Session Log tab. Lines here are just queued specifications/sizes/quantities; nothing is costed until you price each one on the Door or Cabinet page. Kitchen lines are priced on the Cabinet page too (kitchen units are cabinets), just tagged "Kitchen" here for tracking.

–

Add a BOQ line

specification, size & quantity

Import / export

fixed column template

BOQ lines

No BOQ lines yet — add one above or import a file.

Session log

–

Cost control: register the realistic (actual) cost incurred on each item below and it's compared against the theoretical cost this dashboard computed (material + labor + indirect, before overhead/profit). Any excess is flagged.

No items priced yet — build a door or cabinet and add it here.

Variation orders — this session

scope changes after the original quotation, costed the same way
A variation order (VO) is a scope change agreed after the quotation. Build it from Library items, send the PDF to the client, then record the client's approval with proof. Once approved it joins the project's Gantt and shop queue and can be invoiced.
VODateDescriptionPriceMarginBilledStatus

Material availability — this session

demand vs Library stock

Cutting list & sheet yield — this session

board area needed vs. sheets bought — where offcuts come from

Issue invoice

pulls priced items from the session log

From (issuer)

Pre-filled from General settings (click the HEX logo in the header) — editable here just for this document.

To (client)

No priced items in the session log yet.

Preview

not issued
Fill in the form and press "Issue invoice" to generate the document.

Invoice drafts — one per session

–

Created automatically from the Shop Floor: an item or kitchen marked Ready drafts an invoice for 80% of its quoted value, Delivered drafts 100% — each less everything already invoiced (advance and progress). Press "Create invoice" to open it pre-filled on the Invoice page.

Document log

–

Every invoice and quotation ever issued, across all session logs. Filter and re-download any historical document.

–

No invoices or quotations issued yet.

Accounts receivable

what's actually been collected — not what's been billed

Quotations aren't included — they're not billed yet. Balance and days-overdue come from real payment entries logged against each invoice and that invoice's own due-days; nothing here is estimated or assumed.

NumberClientDateDueTotalPaidBalanceAging

Receivables log

invoices, payments and receipts together — partial payments included

Business overview

Margin and volume across every session log — all figures are in the base currency so they're comparable regardless of what currency any given invoice was issued in.

Shop floor & capacity

now its own page
The full production schedule — Gantt, weekly capacity heatmap (with its color key), the backlog table, completed work and the site look-ahead — moved to its own Shop Floor tab, since it's the page that actually controls what's on the shop floor. Quick read below; open the tab to change a status, override a start date, or see the full explanation.

Cash flow forecast

next 90 days

Inflows are real — the balance due on open invoices, bucketed by each one's own due date. Outflows are an estimate: open purchase orders' ordered quantity × each material's current Library price (a PO carries no locked price of its own) — treat them as a planning figure, not a committed amount. Overdue AR and POs with no expected date are called out separately.

By project type

kitchen modules break out from standalone cabinets

By client

Grouped by the Client field set on each session log (Session Log tab). Sessions with no client set are grouped under "Unassigned". Click a row for details.

Invoicing by project / session

invoiced vs drafted vs still to bill

By team member

Grouped by who priced each item ("Working as", Session Log tab). Items with no attribution recorded are grouped under "Unassigned". Click a row for details.

Shop floor & capacity

the live production plan — what's on each line, and how booked the weeks ahead are
This page is the schedule that actually controls production — every priced item not yet marked Ready/Delivered, laid out across your production lines. It's the same live schedule everywhere else in the app points to (the Session Log's per-item note, the Overview summary card): change a status or start date here and everything updates together.
How an item gets scheduled: items already In production claim a line first; then Queued items fill in behind them, oldest-priced first. Each item's line runs one job at a time — the moment a job's estimated ready date passes, that line is free for the next one. Setting a Start date by hand (blank = auto-scheduled) overrides where an item lands on its line, but never pulls a later item on the same line earlier. Lead time (shop days to build) is set per item on its Session Log row, not here — nothing with a lead time appears on the Gantt or heatmap below, since there's no window to plot.

LineItemClientStatusStartLead timeEst. readyActual readyDelayMissing itemQCPhotosHours
Lead time is set on the item's row in the Session Log tab; status and start date are set right here (leave Start blank to auto-schedule); production lines and the working week are set in Library, under Shop capacity.

Completed work

everything marked Ready or Delivered, filterable by when
ItemClientStatusCompletedActual readyDelaySellPhotosHours

Look-ahead

what's happening between two dates, whatever its status
A site look-ahead: every item whose production window falls inside the dates below, however far along it is — queued, in production, or already ready/delivered — all in one list.
ItemClientStatusWindow

Project Gantt

every awarded project, live — five phases per project
One row per Won quotation. Set the start date and phase durations once after award (✎ or "set start date"); then drag a bar to move it, or drag the edge of a phase to change its length. A project short of material turns red until the material arrives.

Project phases — gates, logs & delays

Engineering → Procurement → Shop floor, each passed with a signature
⚠ This is your editable price book. Everything here drives the calculators — nothing is invented at calculation time. Rows marked unverified are placeholder estimates (fire-core tiers beyond what was in HEX's own cost sheet) and should be confirmed against a real supplier quote before you rely on them.

Shop capacity

drives the Shop Floor page
The only two shop-wide assumptions the backlog queue makes. Each item's own lead time and production status are set on its own row in the Session Log — these settings only turn that into a real schedule with real dates.
Production lines is how many items the shop can actually be working on at the same time (lines, stations, crews — whatever splits your concurrent capacity). Set it above 1 and several items marked "In production" will start together instead of queuing one after another.

Machines

one entry per physical machine — it can serve up to two lines
Log the shop's actual machines against whichever line(s) they run on. Capacity is per 8-hour shift/day, in that machine type's own unit — take it from the machine's own spec sheet or your own measured output, never a guess. This is a capacity record for your own planning; nothing here changes how the Shop Floor queue schedules an item yet.
Serves line(s) — pick 1 or 2:
TypeNameDaily capacityLine(s)

Material stock & reorder levels

on-hand qty vs reorder threshold — every board, veneer, wood and hardware line in one place
On hand and Reorder at are both in that item's own unit (m³ for frame/jamb stock, m² for veneers, sheets for boards, whatever's shown for hardware). Left at 0 until you set real counts — a 0 reorder threshold means "not tracked yet", not "out of stock".
A new item is added with price 0 (and, for boards/hardware, a default unit/sheet size) — set its real price in the matching table below. Size is editable here for boards (e.g. "2440x1220") — other categories don't have a sheet size, so they show N/A. Delete a row here to remove that item from the whole Library (it stops appearing everywhere it's used, including past cost breakdowns that reference it by name).
CodeItemUnitSizeOn handReorder atSync tol. %StatusShortage

Stock ledger

every logged movement — newest first
This is the audit trail behind the "On hand" numbers above. Adding a priced door/cabinet item to a session logs a consumption here (and lowers stock) for its board-sheet / solid-wood demand — the same demand the session's Material availability check computes; removing an item logs a matching reversal. Use "+ Receive" above to log stock coming in, or edit "On hand" directly to log a manual adjustment. Melamine-faced trim, veneer facing and hardware aren't moved automatically yet — only board and solid-wood demand is.
DateItemTypeQtyDelivery noteNote

Weekly stock sync (Odoo)

reconcile the factory's actual counts against this Library — deny a line below if something looks wrong, otherwise "End sync session" approves everything left and closes it out
Upload the weekly factory stock-count sheet — columns Code, Article, Unit, Size, Color, Quantity, Unit Price, Remark (download this week's starting sheet — every Library item pre-filled with today's actual on-hand quantity and price, so the factory only has to overwrite Quantity, and Unit Price/Remark where something actually changed). Every matched item with a quantity difference lands in Quantity variances below, however small — approving one logs it as a normal Stock ledger adjustment, same as a manual on-hand edit. A quantity difference within that item's own tolerance % (set per item in Material stock & reorder levels above — 0% by default, meaning every difference is flagged) is skipped automatically. Any price on the sheet that differs from the item's current price lands in Price changes, always, however small — approving updates that item's standing price going forward and logs the change; it never touches quotations/invoices already issued. A Size or Color cell that's filled in and differs from what's on file lands in Size/color changes — a blank cell is left alone, it's never treated as "clear this field". A row whose code is blank or not recognized lands in New items, where you set its category, confirm its details and set its starting price before it enters the Library.

Sync log

every approved or denied line from every weekly stock sync — the dated audit trail
DateRefTypeCodeArticleDetailOutcome

Sync archive

past weekly stock syncs you've formally closed out, grouped by the date you ended them — reopen the report any time
Click "End sync session" above once you've worked through a sync (or decided to leave what's left for later) — it archives that sync's log lines here under today's date, downloads the report automatically, and clears the working queue so the next upload starts fresh. Nothing here is ever re-applied; it's a record, not a queue.
ClosedRefApprovedDenied

Material demand — approved quotations

materials still short of what every "Won" quotation needs
Rolls up the board-sheet / solid-wood demand (same calculation as the session Material availability check — melamine trim, veneer facing and hardware aren't covered) across every quotation currently marked Won, and shows only what's still short of on-hand stock — a material fully covered by stock (or once a PO for it is received) drops off this list. Not invoices — once a quotation becomes an invoice its demand is already committed. Status mirrors Purchase orders below: raise a PO from Material stock & reorder levels and it shows here as "Ordered". Click a row to see which quotation needs how much.
MaterialNeededOn handStatus

Purchase orders

what a Low/Out flag actually triggers
Raised from a Low/Out row in Material stock & reorder levels above (the "+ PO" button) — a supplier, expected-arrival date, and now the currency and unit price actually agreed with the supplier, all real fields you set and locked at order time (never recomputed from a later Library price change). "Receive" here logs the actual delivered quantity as a normal stock receipt in the ledger above and closes the PO out; "Cancel" just closes it without touching stock.
POItemQtyValueSupplierExpectedStatusNote

Remnants & offcuts

leftover cut pieces worth keeping instead of scrapping
Log a piece cut from a board that's big enough to reuse on a future small job — a drawer bottom, a shelf, a small door back. Dimensions are entered by hand (this app doesn't do real cut-layout nesting, so there's no way to derive them automatically). "Use 1" draws one piece down when it gets used; delete a row once a piece is gone or too small to bother tracking.

BoardSize (mm)AreaQtyNote

Rework & defects

panels/leaves that had to be remade — and why
A shop-wide QC record, not tied to one session — log every remake with its cause so a recurring supplier defect or machine problem shows up as a pattern instead of staying invisible one incident at a time. Cost impact (optional) is the dry cost of the remake itself, for your own tracking — it's never billed to a client.
DateItemCauseDescriptionCost impact

Frame / jamb stock (solid & melamine)

price / m³
Species / stockPrice/m³CurrencyMel.

Veneers

price / m²
VeneerPrice/m²Currency

Boards (melamine / MDF / plywood)

price + cutting service / board
BoardSheet mmmmPriceServiceCurrencyMel.
Used for melamine facing/frame/jamb/architrave and for plywood jamb — add a new board (give it a real thickness in mm so it shows up in the right picker):

Fire-rating tiers

core / seal / compliance
TierCoreSealCompl.Leaf mm
Add a tier:

Door hardware

unit prices
ItemUnitPriceCurrency

Cabinet hardware & services

unit prices
ItemUnitPriceCurrency

Man-hour / machine rates

per hour
Role / machineRate/hrCurrency

Door assumptions

real values from HEX's own cost sheet — editable

Cabinet assumptions

waste factors & per-m² rates

Cladding hardware

unit prices — fixing clips/screws
ItemUnitPriceCurrency

Cladding slat/batten profiles

slat width + gap sets the wood coverage ratio
ProfileSlat mmGap mmDepth mmCoverage
No profiles yet? You can still enter slat width/gap/depth by hand on the Cladding tab — profiles here just save you re-typing the same one repeatedly.

Cladding assumptions

geometry/practice defaults, not prices — see Cladding tab for real costs

Costing defaults

Overhead %/Profit % pre-filled on each page when it loads — still fully editable per item on every costing

QC / snag checklist templates

per item type — Shop Floor blocks an item from going "Ready" until every checked-off item for its type is ticked. A type with no checklist here is never gated.

Team members

for attribution on priced items & documents
NameRoleDepartment accessPIN
Move all data between the artifact and the hosted app:

Hold points — who signs

approvals to pass from stage to stage, by role

Currencies

base currency is what everything above is priced in
CurrencyRate (per 1 base unit)
Add a currency an invoice/quotation can be issued in — rate starts unset (0) until you supply a real exchange rate; it's never invented.