Deck board calculator
A 24 m² deck with 0.14 × 3.6 m boards, 5 mm gaps and 10% waste needs 51 boards. Each board is counted with its gap, the waste is added on top, and the result is rounded up to whole boards. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Deck area
- 24
- Board width
- 0.14
- Board length
- 3.6
- Gap
- 0.005
- Waste percent
- 10
- Board face area
- 0.504
- Effective pitch
- 0.145
- Effective board area
- 0.522
- Waste factor
- 1.1
Ordering deck boards by guesswork leaves you short on the last bay or stuck with expensive leftover stock. This deck board calculator turns five practical numbers into a clear purchase count: the surface area of the deck, the face width and length of one board, the gap you leave between boards for drainage and expansion, and a waste percentage for cut ends and breakage. It builds an effective coverage footprint per board by multiplying length by width plus gap, inflates the deck area by the waste factor, divides for an exact board count, then ceilings so you never order a fractional board. Keep deck area and board edges in one unit system—square metres with metres, or square feet with feet—and treat the waste percent as the allowance your builder recommends for the pattern and board grade you chose.
How boards actually cover a deck
A board does not cover only its own face. Laid across the joists, each one takes up its full length along the run and its width plus the gap across it, so the gap for drainage and expansion has to be part of the count. With 0.14 m boards and 5 mm gaps, every board advances 0.145 m, and a 3.6 m board covers 0.522 m² instead of the 0.504 m² of its face. The deck area, increased by the waste allowance, is divided by that footprint: 24 m² plus 10% is 26.4 m², which works out to just over fifty boards and therefore 51.
Getting the order right
Keep the deck area and the board sizes in one system: square metres with metres, or square feet with feet. A board width in millimetres next to an area in square metres gives a meaningless count. Rounding is always upward, because no shop sells part of a board, and the result shows how much spare area those whole boards cover; in the example, 51 boards cover 2.622 m² more than the bare deck. A zero gap is fine for butt-tight boards and a zero waste for a perfect rectangle, but most real decks need both. For several decks, run each one with its own area and board size.
What you can do with it
DIY deck shopping list
Measure the deck area, enter board size and the gap your code or manufacturer recommends, add waste percent, and buy whole boards without shortfall or bulk overstock.
Builder take-off estimates
Feed each deck’s area and board SKU into the same formula so purchase orders match the estimate and every ceil step is auditable.
FAQ
What happens if board dimensions are zero or negative?
Board width and board length must both be strictly positive; a zero or negative size would make coverage undefined or non-physical.
Which units should I use?
Any consistent set: square metres with metres for length, width, and gap, or square feet with feet. Do not mix systems.
Why is gap required?
Decking needs spacing for drainage and expansion. Use 0 only for a butt-tight layout; a few millimetres or an eighth of an inch is common depending on material and climate.
What does it cost?
The browser tool is free and runs locally.
How much waste should I add for deck boards?
Use the allowance your builder recommends for the laying pattern and board grade you chose. The percentage is applied to the deck area, so 10% means planning for the deck plus a tenth more, covering cut ends, breakage and picture-frame borders.
Related tools
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/home/deck-boards \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"deck_area":24,"board_width":0.14,"board_length":3.6,"gap":0.005,"waste_percent":10}'const res = await fetch("https://api.kit.forhosting.com/home/deck-boards", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"deck_area": 24,
"board_width": 0.14,
"board_length": 3.6,
"gap": 0.005,
"waste_percent": 10
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/home/deck-boards",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"deck_area": 24,
"board_width": 0.14,
"board_length": 3.6,
"gap": 0.005,
"waste_percent": 10
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/home/deck-boards", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"deck_area":24,"board_width":0.14,"board_length":3.6,"gap":0.005,"waste_percent":10}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"deck_area":24,"board_width":0.14,"board_length":3.6,"gap":0.005,"waste_percent":10}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/home/deck-boards", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"deck_area": 24,
"board_width": 0.14,
"board_length": 3.6,
"gap": 0.005,
"waste_percent": 10
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "home.deck_boards",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |
Technical notes
The same pure function powers the free browser tool and the paid API, so a quote you generate on a phone matches the line item a script posts later. Zero or negative board dimensions are rejected with a clear invalid_input message instead of a silent divide-by-zero.
How the deck board count formula works
Deck area must also be positive; gap and waste percent must be non-negative so a butt-tight zero-gap layout and a zero-waste perfect rectangle remain expressible. Start from a coverage identity that matches how boards actually fill a deck: each board occupies its full face length along the run and a pitch of board_width plus gap across the joists. Write effective_board_area equals board_length times (board_width plus gap), using the same linear unit that sits under your deck_area square unit so metres pair with square metres and feet pair with square feet. The face-only product board_length times board_width is reported as board_face_area for audit, but purchase math uses the larger effective footprint so drainage gaps do not vanish from the plan. Next apply the waste allowance as a multiplicative factor: waste_factor equals one plus waste_percent divided by one hundred, so ten percent waste means you plan for one hundred ten percent of the bare deck. Multiply deck_area by that factor to obtain area_with_waste—the effective coverage target after cut ends, picture-frame borders you approximate with extra stock, broken pieces, and shade-lot extras. Divide area_with_waste by effective_board_area to produce boards_exact, a real number that may have a fractional part. Purchase quantity boards_needed is the ceiling of boards_exact. The response also echoes intermediates (board_face_area, effective_pitch, effective_board_area, waste_factor, waste_area, area_with_waste, boards_exact, coverage_area) and spare_area_vs_deck so you can audit the math against a hand calculation on the packing slip. The pipeline is deterministic floating-point arithmetic with no random seeds, no wall-clock timestamps, and no network calls, so identical inputs always produce identical JSON. Board width and board length must both be strictly positive: zero or negative size is rejected with invalid_input because a zero footprint would make the ratio undefined and a negative footprint is non-physical.
What you send and what you get back
All five fields are required. Send five finite numbers: deck_area for the deck plan coverage in square units, board_width and board_length for one board face pair in matching linear units, gap for the spacing between adjacent boards in those same linear units, and waste_percent as the extra material percentage (for example ten for a ten percent allowance). Missing fields, non-numeric strings, NaN, and Infinity fail with invalid_input and are not charged. When board_width or board_length is zero or negative the request fails with a message that board dimensions must be positive, so clients can correct dimensions before retrying instead of receiving Infinity boards. On success the response echoes cleaned inputs, board_face_area, effective_pitch, effective_board_area, waste_factor, waste_area, area_with_waste, boards_exact, integer boards_needed, coverage_area, spare_area_vs_deck (how much area the purchased set covers beyond the bare deck when each board is counted at full pitch), a unit_note reminder to keep one unit system, and a short formula string for documentation. Classic checks include a twenty-four square-metre deck with zero-point-fourteen by three-point-six metre boards, a five-millimetre gap, and ten percent waste: effective board area is board length times width plus gap, area with waste is twenty-six point four, and boards_needed is the ceiling of that ratio. Pricing for successful API calls is the published base of $0.002 per item; validation failures do not consume prepaid balance.
Where deck board calculators show up in real work
Homeowners building a backyard deck need a trustworthy board count before ordering composite or treated lumber, especially when long boards have a high unit price and a multi-week lead time. If you later need joist and beam schedules, hidden-fastener clip counts, railing pickets, or stair stringer layouts, treat those as separate search intents and landings rather than overloading this deck board calculator page. Deck builders and carpenters build take-offs from measured deck areas and manufacturer board sizes; a single deterministic endpoint that ceilings boards after gap and waste reduces spreadsheet drift between the estimator and the purchasing clerk. Landscape designers comparing three board SKUs for the same plan can swap only board_width, board_length, and gap while holding deck_area and waste_percent fixed, then rank total boards and spare coverage without re-deriving the pitch math each time. Property managers planning multi-unit balcony refreshes feed a batch of deck areas through the API and attach boards_needed to purchase orders so overstock stays intentional rather than accidental. Because this capability is a pure parse engine, API pricing is the published base of $0.002 per successful item and failed validation does not consume balance.
Integration use cases
SKU comparison for designers
Hold deck area and waste fixed, swap board width, length, and gap across candidate products, and compare boards_needed and spare coverage side by side.
Technical questions
How does this deck board calculator work?
It multiplies board length by (board width plus gap) for effective coverage per board, inflates deck_area by (1 + waste_percent/100), divides for an exact board count, then ceilings so you order whole boards only.