Deck footing count calculator
The deck footing count calculator turns a rectangular deck concept into a clear preliminary support layout.
Run — free
Enter the deck length and projection, the maximum spacing allowed between posts and support lines, and whether the framing uses a structural ledger or stands independently. Optional beam and joist overhangs let the estimate reflect a planned cantilever. The result shows total concrete footings, beam rows, posts per row, and the intermediate spans used to produce the count. It is intended for early material planning and layout comparison, before local code checks and structural design finalize the foundation.
Translate the framing plan into consistent dimensions
Start with the rectangular dimensions of the framed deck, not an approximate surface area. Deck length runs parallel to the beam rows, while deck projection runs outward across the joists. Enter every value in one consistent unit system: feet with feet, metres with metres, or inches with inches. The maximum post spacing is the greatest permitted center-to-center distance between posts along a beam. The maximum beam spacing is the greatest permitted distance between support lines across the joist direction. Those limits should come from an approved framing table, local requirements, or a qualified designer because they depend on lumber species, member size, loading, connections, and other project details. Select ledger attached only if a properly designed structural ledger actually supports the building-side edge. A decorative attachment or flashing detail is not a structural ledger. If the deck supports itself beside the building, choose freestanding so the calculator includes support at both sides of the projection. Accurate classification matters because it changes the number of beam rows and therefore the footing total.
Understand how rows, bays, and overhangs become footings
Along each beam row, the calculator subtracts the permitted beam overhang at both ends from the full deck length. It divides that supported beam length by the maximum post spacing and rounds upward to obtain post bays. A run with three bays needs four posts, since every sequence of bays has a post at each boundary. Across an attached deck, the ledger is treated as the first support line but not as a footing row. The remaining supported projection is divided by maximum beam spacing, rounded upward, and converted directly into beam rows. Across a freestanding deck, both sides require structural support, so one more beam row than support intervals is required. Joist overhang is subtracted once for an attached layout and twice for a freestanding layout. Finally, posts per row are multiplied by beam rows, using one concrete footing per post. The output preserves the component counts and supported dimensions so you can trace the arithmetic instead of relying on a single unexplained total.
Use the estimate for planning, then verify the foundation design
Use the result to compare framing options, sketch a footing grid, estimate excavation work, or prepare an initial concrete and hardware list. Changing a spacing limit can reveal a threshold where one extra row or post becomes necessary, and testing attached versus freestanding construction shows the foundation consequence of that choice. However, this count is not a permit-ready design. It does not calculate footing diameter, thickness, embedment, frost depth, uplift resistance, lateral bracing, tributary loads, soil capacity, or the suitability of a ledger connection. Irregular outlines, concentrated loads, stairs, hot tubs, roofs, multi-level framing, and posts carrying unequal areas may require a layout that cannot be represented by equal rectangular spacing. Confirm the maximum spans and every footing location with current local code documents and the authority having jurisdiction. Where conditions are unusual or loads are significant, have a qualified structural professional design the support system. Treat the calculated count as a transparent planning baseline, not permission to reduce supports shown on approved drawings.
What you can do with it
Compare attached and freestanding layouts
See how replacing ledger support with independent beam rows changes the preliminary footing count.
Prepare a material estimate
Convert framing dimensions into an initial count of posts, bases, anchors, and concrete footing locations.
Test span-table options
Compare allowable post and beam spacing choices while keeping the deck dimensions and overhang assumptions visible.
FAQ
Does every post require one footing?
This calculator assumes one concrete footing for every post. Engineered shared supports or special foundations are outside its model.
Why does a freestanding deck need more beam rows?
A freestanding deck has no structural ledger supporting one edge, so the model provides support lines at both sides of the joist run.
Which units should I use?
Any length unit works as long as every deck dimension, spacing, and overhang uses that same unit.
Does this calculate footing size or depth?
No. Footing dimensions depend on loads, soil bearing, frost requirements, and local rules and must be determined separately.
How much does the API calculation cost?
The API base price is $0.002 per calculation. The browser version can use the same deterministic calculation locally.
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-footing-count \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"deck_length":24,"deck_projection":12,"max_post_spacing":8,"max_beam_spacing":6}'const res = await fetch("https://api.kit.forhosting.com/home/deck-footing-count", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"deck_length": 24,
"deck_projection": 12,
"max_post_spacing": 8,
"max_beam_spacing": 6
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/home/deck-footing-count",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"deck_length": 24,
"deck_projection": 12,
"max_post_spacing": 8,
"max_beam_spacing": 6
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/home/deck-footing-count", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"deck_length":24,"deck_projection":12,"max_post_spacing":8,"max_beam_spacing":6}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"deck_length":24,"deck_projection":12,"max_post_spacing":8,"max_beam_spacing":6}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/home/deck-footing-count", 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_length": 24,
"deck_projection": 12,
"max_post_spacing": 8,
"max_beam_spacing": 6
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "home.deck_footing_count",
"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. |