# Label Sheet Maker with CSV Mail Merge > Address labels, name badges and product labels from a CSV, for any sheet layout. Fill a sheet of labels from CSV rows with a {Column} template: address labels, name badges, jar and product labels. Use a generic sheet layout or enter your own geometry, skip labels already used, add a QR code or barcode per label and print a true-size PDF. Part of usefulweb.app (https://usefulweb.app/). Part of [Printshop](https://printshop.usefulweb.app/) (ownerApp: printshop). Results are deterministic calculations from the inputs and the listed assumptions; the API returns exactly what the web page shows. ## Use it - Human interface: https://printshoplabelsheet.usefulweb.app/ (interactive tool at https://printshoplabelsheet.usefulweb.app/tool) - JSON API: POST https://printshoplabelsheet.usefulweb.app/api/v1/calculate with a JSON object of inputs (schema: https://printshoplabelsheet.usefulweb.app/api/v1/tool) - OpenAPI: https://printshoplabelsheet.usefulweb.app/openapi.json - MCP (Streamable HTTP): https://printshoplabelsheet.usefulweb.app/mcp - tool `printshop_label_sheet` ## Inputs - sheet (select): Sheet layout - paper (select): Paper size (custom layout) - cols (integer): Columns (custom) - rows (integer): Rows (custom) - labelW (number): Label width (mm, custom) - labelH (number): Label height (mm, custom) - top (number): Top margin (mm, custom) - left (number): Left margin (mm, custom) - pitchX (number): Horizontal pitch (mm, custom) - Distance from the left edge of one label to the left edge of the next. - pitchY (number): Vertical pitch (mm, custom) - template (textarea): Label text - Use {Column} for values from the CSV header. - csv (textarea): CSV data (first row = column names) - code (select): Code on each label - codeTemplate (text): Code content - Template for the code, for example {SKU} or https://example.com/{Id}. - fontSize (number): Font size (mm) - The text shrinks automatically when it does not fit. - align (select): Alignment - startAt (integer): Start at label number - Skip labels already used on a partly used sheet (counted row by row). - copies (integer): Copies of each label - outlines (boolean): Draw label outlines - Useful for a test print on plain paper; usually off for real label sheets. ## Method - CSV is read after RFC 4180 (quoted fields, doubled quotes, line breaks inside quotes); comma, semicolon or tab is detected from the header line. Each row fills the {Column} placeholders of the template. - Label n sits at left + column × horizontal pitch, top + row × vertical pitch, filled row by row; “start at” skips used positions on the first sheet. Presets are generic dimension sets (no brand or product numbers). - Text is wrapped to the label width and reduced in 10 % steps until it fits; labels whose text still does not fit are counted as overflow. A QR code takes up to 45 % of the width; barcodes sit at the bottom. ## Limits - Printers shift paper by up to a millimetre or two. Print one test page on plain paper, hold it against a label sheet and adjust the margins before printing on labels.