Quilt Batting Size Calculator for Shrinkage and Trimming
A quilt top needs batting larger than its visible finished size. This calculator combines two separate allowances: extra material that compensates for quilting or washing shrinkage, and a margin around every edge for loading, basting, handling, and final trimming.
Run — free
Enter the measured width and height of your quilt top, choose inches or centimeters, then set the shrinkage percentage and margin that suit your materials and quilting method. The result gives a practical batting rectangle to cut before quilting begins.
Measure the quilt top and choose a working margin
Measure the completed quilt top after pressing it flat, without stretching the fabric or pulling the corners into shape. Take the width and height through the center as well as near both outer edges; if those readings differ slightly, use the largest measurement so the batting is not undersized. Enter both dimensions in one unit and select either inches or centimeters. The margin is added separately on every edge, so a four-inch margin adds eight inches to the total width and eight inches to the total height. This surrounding material gives a longarm frame room for clamps, lets a domestic-machine quilter reposition the sandwich, and leaves imperfect edges available for square trimming. Four inches per edge is a common planning value, but the correct amount depends on the quilting setup. Check the longarm provider's requirements before cutting because some machines, pantographs, or side clamps need more space. A hand-quilted or carefully basted small project may need less, while a generous margin is usually safer than a narrow one for a large quilt.
Understand how the shrinkage allowance is calculated
Quilting draws the three layers together and can reduce their usable dimensions. Washing may cause additional contraction in cotton batting and fabric. The calculator treats the entered quilt-top dimensions as the size you want to preserve after the stated shrinkage. It therefore divides each top dimension by the remaining percentage before adding the trimming margin. For example, with three percent expected shrinkage, the material inside the margins is sized by dividing by 0.97. This reverse calculation is more accurate than merely adding three percent, because a piece enlarged by exactly three percent and then reduced by three percent finishes slightly short. The margin itself is not enlarged for shrinkage: it is working material intended to remain outside the desired quilt size and be trimmed away. Shrinkage values are planning estimates, not guarantees. Fiber content, batting construction, quilting density, thread tension, prewashing, and laundering all affect the real result. Consult the batting manufacturer's guidance and test a layered sample when the final size must be exact, especially for fitted bedding, commissioned work, or wall installations.
Use the result when buying and cutting batting
The batting width and height are the minimum planned cut dimensions under the assumptions you entered. The area is also returned in square units, which is useful for comparing remnants, but batting is normally sold by package size or by linear length from a roll. Before buying, compare the required batting width with the package or roll width. If the roll is wide enough, purchase at least the calculated height along its length; rotate the layout if that uses the roll more efficiently and the batting has no directional restriction. Round a purchase quantity upward to the seller's increment rather than rounding the calculated need downward. Packaged batting should meet or exceed both dimensions in some orientation. When piecing batting is acceptable, include enough overlap or joining allowance for the method recommended by its maker; this calculator does not add seam allowance for joined batting sections. Mark the quilt-top outline only if the batting manufacturer permits it, center the top within the calculated rectangle, and confirm the margin on all four sides before basting or loading. After quilting and any planned washing, square and trim the layers to the intended final edge.
What you can do with it
Prepare a longarm quilt
Calculate batting that includes the frame operator's required margin on every edge plus a realistic quilting shrinkage allowance.
Choose packaged batting
Compare the required cut width and height with standard package dimensions before purchasing.
Plan batting from a roll
Determine the minimum rectangle and test whether rotating it reduces the linear length needed from a fixed-width roll.
FAQ
Is the margin added once or to every side?
The entered margin is added to each edge. The total batting width and height each receive twice the margin.
Why does the calculator divide by the remaining percentage?
It works backward from the desired post-shrinkage size. Dividing by the remaining percentage avoids the small shortage caused by simply adding the same percentage.
What shrinkage percentage should I use?
Use the batting manufacturer's estimate when available and consider your fabric, quilting density, and washing plan. A test sandwich provides the best project-specific estimate.
Can I mix inches and centimeters?
No. Enter the quilt dimensions and margin in the selected unit. The result uses that same unit throughout.
Does the result include allowance for piecing batting?
No. Add any overlap or joining allowance required by your chosen batting-joining method after calculating the basic rectangle.
What does the API request cost?
The price is $0.002 per request. The same deterministic calculator can also run free in the browser.
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/hobby/craft-quilt-batting \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"quilt_width":60,"quilt_height":80}'const res = await fetch("https://api.kit.forhosting.com/hobby/craft-quilt-batting", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"quilt_width": 60,
"quilt_height": 80
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/hobby/craft-quilt-batting",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"quilt_width": 60,
"quilt_height": 80
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/hobby/craft-quilt-batting", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"quilt_width":60,"quilt_height":80}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"quilt_width":60,"quilt_height":80}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/hobby/craft-quilt-batting", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"quilt_width": 60,
"quilt_height": 80
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "hobby.craft_quilt_batting",
"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. |