Tile grout calculator
300 mm square tiles with 3 mm joints, 8 mm deep, over 10 m² take 2.5221 kg of grout, or 3 kg rounded up for buying. The estimate comes from the real joint geometry, not a bag-per-room guess. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Tile size
- 300
- Joint width
- 3
- Tile thickness
- 8
- Area
- 10
- Tile length mm
- 300
- Tile width mm
- 300
- Joint width mm
- 3
- Tile thickness mm
- 8
This tile grout calculator estimates how many kilograms of grout you need for a tiled floor or wall once you know the tile size, joint width, tile thickness, and total surface area. It uses a geometric joint-fraction model: each tile sits in a module that includes its share of the joints, the fraction of the surface that is joint is one minus the tile face over that module, and volume equals area times that fraction times thickness. Weight follows by multiplying volume in litres by bulk density, defaulting to a typical cementitious value of 1.6 kilograms per litre. Small checks you can verify by hand include three-hundred millimetre square tiles with three millimetre joints, eight millimetre thickness, and ten square metres of floor, which yields a few kilograms of grout rather than a bag-per-room guess. The engine is pure arithmetic with no network calls, no sampling, and no date-dependent shortcuts.
What your grout estimate tells you
Grout fills the open network of joints between tiles, so the mass you buy depends on how wide those joints are, how deep the tile is (joint depth is taken as tile thickness unless you override thickness), how large each tile face is, and how many square metres you cover. Larger tiles leave fewer linear metres of joint per square metre; wider joints and thicker tiles increase volume quickly.
This calculator returns the parsed tile length and width in millimetres, the joint width and thickness, the area in square metres, the density used, the joint fraction as a pure number between zero and one, the grout volume in litres, the weight in kilograms, a ceiling of that weight for bag purchasing, unit tags, the precision applied, a method tag, and a short formula string you can audit.
There is no catalogue of brand bag sizes and no moisture or waste fudge baked into the core number: you get the geometric fill weight so you can add your own waste percentage for cuts and leftovers.
Where grout take-offs fit in DIY, trade quotes, and software
Homeowners meet this calculation when a bathroom remodel needs a second bag of sanded grout after a surprise wide joint, or when a kitchen splashback order must not overshoot the budget. Tile fitters and small contractors use the same numbers to turn a measured floor plan into a shopping list before they leave the yard, adjusting density when the spec sheet lists epoxy rather than cementitious product.
Estimators embed the contract in take-off tools so a room schedule of tile size, joint, thickness, and square metres becomes kilograms without a spreadsheet full of hidden cells. Product and education tools show learners why 600 by 600 tiles with two millimetre joints use far less grout per square metre than 100 by 100 mosaics with the same joint width.
Pair it with paint or area helpers when you are building a small lab of free, deterministic home-improvement calculators, and keep a margin for waste, hollows, and cleaning losses that your site conditions require beyond the pure geometric fill.
What you can do with it
DIY bathroom and floor shopping lists
Convert measured m², tile size, and joint width into kilograms of grout before you buy bags at the merchant.
Trade quotes and take-offs
Turn room schedules of tile dimensions and area into reproducible weight estimates for written quotes.
FAQ
What does the tile grout calculator cost?
It is free in your browser on this page.
What happens if a dimension is zero or negative?
Tile size, joint width, thickness, area, and density must all be strictly positive.
Does the result include waste or bag sizes?
No. The core weight is geometric fill only.
Why does the joint width change the grout amount so much?
Grout fills the network of joints, so wider joints and thicker tiles raise the volume quickly. Larger tiles work the other way: they leave fewer metres of joint per square metre, so the same floor needs less grout.
What density should I use for epoxy or sanded grout?
The default is 1.6 kg per litre, a typical value for cement-based grout. If the spec sheet for your epoxy or fine sanded product lists a different bulk density, enter that figure and the weight follows it.
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/tile-grout \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"joint_width":3,"tile_thickness":8,"area":10,"tile_size":300}'const res = await fetch("https://api.kit.forhosting.com/home/tile-grout", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"joint_width": 3,
"tile_thickness": 8,
"area": 10,
"tile_size": 300
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/home/tile-grout",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"joint_width": 3,
"tile_thickness": 8,
"area": 10,
"tile_size": 300
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/home/tile-grout", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"joint_width":3,"tile_thickness":8,"area":10,"tile_size":300}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"joint_width":3,"tile_thickness":8,"area":10,"tile_size":300}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/home/tile-grout", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"joint_width": 3,
"tile_thickness": 8,
"area": 10,
"tile_size": 300
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "home.tile_grout",
"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.
Limits
max_abs | 1000000000 |
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
What the grout estimate means and what the response contains
Rejected cases include missing tile size or rectangular dimensions, missing joint width, thickness, or area, non-finite values, magnitudes above the documented ceiling, and any dimension that is zero or negative, because a zero joint or zero area does not define a positive grout mass.
How tile size, joints, and density are read and stay reproducible
Computation converts thickness to metres, builds the module area as length plus joint times width plus joint, subtracts the tile face fraction from one, multiplies by area and thickness for cubic metres, converts to litres, then multiplies by density. Prefer tile_length and tile_width in millimetres for rectangular tiles, or a single tile_size when both sides match, with aliases length, width, L, W, size, and side so forms and query strings can reuse the same contract. Joint width accepts joint_width plus aliases joint, gap, and j; thickness accepts tile_thickness plus thickness, depth, and joint_depth; area accepts area, total_area, surface, sqm, and m2. Optional density defaults to 1.6 kilograms per litre for cement-based grout and may be set via density, rho, or bulk_density when the manufacturer publishes a different bulk density for epoxy or fine sanded products. Optional precision, with aliases decimals and dp, chooses decimal places for the numeric fields, defaulting to four and capped at fifteen so JSON goldens stay stable. Pair the free browser run on this page with the priced API when you need the identical mathematical result inside an automated pipeline without re-implementing the fraction formula yourself.
Where grout take-offs fit in DIY, trade quotes, and software
On this page the work runs entirely in your browser; through the API each successful lookup costs $0.002, failed validation is not charged, and nothing is stored after the response returns. That split — free interactive exploration and a priced, identical API — matches the rest of the KIT tier-A catalog and lets you move from a phone check on site to an automated pipeline without changing the mathematical result.
Integration use cases
Estimating software and CI fixtures
Seed deterministic weight_kg and volume_l values for unit tests, property checks, and automated pipelines.
Technical questions
How is grout weight calculated?
joint_fraction = 1 − (L×W)/((L+j)×(W+j)); volume in litres = area_m² × joint_fraction × (thickness_mm/1000) × 1000; weight_kg = volume_L × density (default 1.6 kg/L).
Do I need separate length and width for square tiles?
No. Pass tile_size once for square tiles, or pass both tile_length and tile_width for rectangles. Do not mix tile_size with length or width.