How to print a sheet of identical QR codes

Last updated: July 2026 · About 6 minutes

There is a whole category of QR code job that has nothing to do with bulk data: one URL, printed many times. A menu code for every table in a restaurant. A review link for a stack of receipts. A wifi code for each room. A feedback form on the bottom of a hundred flyers.

The usual approach is to generate one code, drop it into a Word document, and copy-paste it into a grid by hand — which is tedious and produces wildly inconsistent spacing. The generator on this site has a copies field for exactly this.

The short version

  1. Open the generator and switch to the Enter manually tab.
  2. Paste your URL into the first row.
  3. Set Copies to how many you want on the sheet — say 20.
  4. Set QR codes per image to the same number, 20.
  5. Generate. You get one PNG containing a 5 × 4 grid of that code.

Why both numbers

The two settings do different jobs, and understanding the split is what makes the tool flexible:

So if you want two pages of twenty, set copies to 40 and codes per image to 20. If you want twenty separate image files of the same code — occasionally useful when a design tool wants individual assets — set copies to 20 and leave codes per image at 1.

Choosing a grid that matches your paper

Codes are arranged in as close to a square as the count allows: the layout uses the square root of the number of codes, rounded up, as the column count. In practice:

Codes per image Grid Typical use
4 2 × 2 Large table tents, window signs
6 3 × 2 Half-page handouts
9 3 × 3 Postcard-sized cuts
12 4 × 3 Standard label sheets
20 5 × 4 Small stickers, receipt inserts
30 6 × 5 Shelf-edge labels

Each cell is 300 × 300 pixels, plus a 44-pixel strip underneath for the label if labels are on. A 20-code sheet is therefore 1500 × 1376 pixels, which prints crisply at A4 or US Letter.

Labels: on or off

When more than one code goes on an image, a checkbox appears: "Print a label under each QR code". It is on by default, and it prints the row's filename underneath each code — or the URL itself if you did not give the row a name.

For a sheet of identical codes, labels are usually the wrong choice. Every cell would carry the same text, which wastes space and looks odd on a table tent. Untick it and the label strip disappears entirely rather than being left blank — a 20-code sheet drops from 1376 to 1200 pixels tall.

Leave labels on when the sheet has different codes on it, which is the case covered in generating codes in bulk from a CSV. There, the label is the only thing that tells you which cut-out square is which.

Mixing repeats and unique codes

Copies are set per row, so a single batch can contain both. A restaurant might want ten copies of the menu code and one code per table:

URL Filename Copies
https://example.com/menu menu 10
https://example.com/table/1 table-01 1
https://example.com/table/2 table-02 1

With one code per image that produces twelve files: menu.png, menu_2.png through menu_10.png, then table_01.png and table_02.png. The numeric suffixes come from the duplicate handling, which keeps every copy as its own file instead of overwriting.

Printing the sheet

The output is a PNG inside the downloaded ZIP. Extract it and print it directly from your image viewer, or drop it into a document if you need margins and crop marks.

Three things worth getting right:

How small can they go?

The practical floor for a phone camera is around 2 cm (0.8 in) square for a short URL scanned at arm's length. Longer URLs pack more modules into the same square, making each module smaller, so a long tracking URL needs a physically larger code than a short one. Sizing for print has the full distance-to-size arithmetic, and combining different codes on one sheet covers the case where each code on the page points somewhere different.

The rule of thumb used in signage is that the code should be about a tenth of the scanning distance: readable from 1 metre means roughly 10 cm square. If your codes will be scanned from across a room, generate fewer per image so each one prints larger.

Shortening the URL is the cheapest way to make a code more scannable. A code encoding https://ex.co/m has far fewer modules — and therefore much chunkier, more forgiving squares — than one encoding a URL with a long query string attached.

Always scan-test one printed code at the real size, on the real paper, under the lighting where it will live. A code that scans perfectly on a monitor can fail on matte recycled stock in a dim corridor.

Open the generator