Business cards per sheet calculator
The business cards per sheet calculator turns sheet dimensions, finished card dimensions, and gutter spacing into a practical print grid.
Run — free
It calculates columns, rows, total cards, occupied space, and leftover space, then compares the normal card orientation with a 90-degree rotation. Use one consistent measurement unit throughout—millimetres, inches, points, or another unit—and the result remains valid. This provides a fast planning answer before artwork is imposed or stock is ordered.
Enter dimensions that describe the finished job
Start with the usable width and height of the print sheet, followed by the finished width and height of one business card. All six dimensional inputs must use the same unit. Millimetres are convenient for ISO cards and common commercial stocks, while inches may be more natural for North American card formats. The calculator is unit-agnostic, so it does not convert or reinterpret the values. If a press cannot print to the edge, subtract its required margins from the physical sheet dimensions before entering the usable sheet size. Enter horizontal gutter spacing for the clearance between neighboring columns and vertical gutter spacing for the clearance between neighboring rows. Gutters are not added around the outer edge. This distinction matters: a grid containing three columns has two internal horizontal gutters, not three or four. Use finished card dimensions when you want finished-piece capacity. If the artwork includes bleed, enlarge the entered card dimensions to the full imposed size, or include the necessary separation in the gutters according to the production method. Keeping those production allowances explicit makes the capacity estimate understandable and repeatable.
Understand the orientation comparison and grid result
The calculator evaluates two uniform layouts. The standard layout uses card width across the sheet and card height down the sheet. The rotated layout swaps those dimensions, representing every card turned 90 degrees. For each orientation, it finds the greatest whole number of columns and rows that fit after internal gutters are included. Partial cards never count. The total is columns multiplied by rows, and the orientation with the larger total becomes the recommended result. When both totals are equal, the standard orientation wins the tie so repeated calls remain predictable. The response still includes both layouts, allowing you to choose the rotated version for grain direction, finishing flow, or artwork orientation even when it does not maximize capacity. Used width and height include the cards plus only the internal gutters. Unused width and height show the remaining space on the right and bottom of a grid aligned to the upper-left corner. You may split that remainder across opposing edges to center the grid. These values are planning dimensions, not coordinates for a printer driver, and they do not account for gripper edges or device-specific nonprintable areas unless those areas were removed from the input sheet dimensions first.
Apply the calculation safely in print production
Treat the result as an imposition capacity check before committing to paper quantities or a cutting plan. Confirm that the supplied card dimensions include every allowance required by the actual workflow. A guillotine layout may need enough gutter for two cuts or for crop marks, while a digital cutter may require spacing suitable for its registration and tool path. Bleed can be represented by increasing each card dimension, by increasing gutters, or by a combination chosen by the prepress operator; do not accidentally count the same allowance twice. Paper grain can also outweigh the mathematically best orientation, particularly for folded, laminated, or unusually thick cards. Because both orientation results are returned, production staff can compare throughput against those constraints. Multiply cards per sheet by the planned sheet count for a theoretical run yield, then add setup, spoilage, color-control, and finishing waste separately. The calculator deliberately does not guess a waste percentage because shops and processes differ. If neither orientation fits even one complete card, the total is zero rather than an input error: the dimensions may be valid even though the selected stock is too small. Invalid, non-finite, negative, or zero required dimensions are rejected so an apparently precise answer cannot be produced from physically meaningless input. For automation, the API costs $0.002 per request and returns deterministic JSON suitable for estimating and quoting workflows.
What you can do with it
Plan a print run
Estimate the number of sheets needed for a business-card quantity before ordering stock.
Compare card orientation
See whether rotating every card increases the yield on a particular sheet.
Check cutting space
Include horizontal and vertical gutters and inspect the remaining sheet space.
FAQ
What does the calculator cost?
It is free in the browser and costs $0.002 per API request.
Can I use inches instead of millimetres?
Yes. Use any unit, provided every sheet, card, and gutter value uses that same unit.
Does it rotate individual cards to fill leftover spaces?
No. It compares two uniform rectangular grids: all cards standard or all cards rotated.
Are gutters added at the sheet edges?
No. Gutters are counted only between adjacent cards. Reduce sheet dimensions separately for edge margins.
How should I account for bleed?
Enter the full imposed card dimensions or incorporate the required clearance in gutters, following your printer's workflow.
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/doc/business-cards-per-sheet \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"sheet_width":210,"sheet_height":297,"card_width":85,"card_height":55}'const res = await fetch("https://api.kit.forhosting.com/doc/business-cards-per-sheet", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"sheet_width": 210,
"sheet_height": 297,
"card_width": 85,
"card_height": 55
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/doc/business-cards-per-sheet",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"sheet_width": 210,
"sheet_height": 297,
"card_width": 85,
"card_height": 55
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/doc/business-cards-per-sheet", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"sheet_width":210,"sheet_height":297,"card_width":85,"card_height":55}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"sheet_width":210,"sheet_height":297,"card_width":85,"card_height":55}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/doc/business-cards-per-sheet", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"sheet_width": 210,
"sheet_height": 297,
"card_width": 85,
"card_height": 55
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "doc.business_cards_per_sheet",
"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_mb | 25 |
max_pages | 200 |
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. |