Barcode generator
Ten kinds of barcode, drawn in your browser and downloaded as SVG or PNG. No account, no watermark, and the check digit is checked before you print a thousand labels.
Any text or number. The default for shipping labels and internal part numbers.
Loading the barcode engine…
The barcode engine is still loading.
- Free, no account
- Check digits verified
- SVG and PNG
- Same file every time
The ten, and the job each one is for
Chosen because people actually print them, not because a library could draw a hundred.
- Code 128
- Any text or number. The default for shipping labels and internal part numbers.
- EAN-13
- The 13-digit number on retail packaging outside North America.
- UPC-A
- The 12-digit number on retail packaging in North America.
- Code 39
- Older equipment and asset tags. Capitals, digits and a few symbols only.
- ITF-14
- The carton and case code, printed on corrugated board where fine bars fail.
- GS1-128
- Code 128 carrying GS1 application identifiers: batch, expiry, serial.
- ISBN
- The barcode on the back of a book, with its price add-on if it has one.
- Data Matrix
- A square that stays readable when small or marked directly onto a part. The one GS1 is moving retail towards.
- PDF417
- The stacked block on a driving licence or a boarding pass. Holds a lot of text.
- Aztec
- Transit and event tickets. Needs no quiet zone, so it fits a crowded ticket.
The check digit is checked by the code that checks our GTINs
The last digit of a retail number is arithmetic on the ones before it. That is the whole point of it.
EAN-13, UPC-A and ITF-14 are all GTINs, and the same function validates them here and on the GS1 Digital Link codes we put on product packaging. When a digit is wrong we say which one it should have been, because a transposed pair is the single most common error a check digit exists to catch, and naming the expected digit usually shows you where it happened.
ISBN is not a GTIN and is checked separately. Its check character is modulo eleven rather than ten and can be the letter X, so running it through the retail arithmetic returns a plausible number rather than an error — the kind of wrong that gets printed. Type the ISBN-10 with its dashes; the barcode a scanner reads back is the Bookland EAN-13 derived from it, which is why the thirteen digits look nothing like what you typed.
What we do not do is issue numbers. A UPC or EAN belongs to whoever registered it with GS1. We can tell you a number is internally consistent; we cannot tell you it is yours.
Download it again next year and get the same file
For anyone who has been asked whether the artwork changed since the last print run.
Nothing in the output carries a timestamp, a generated identifier or a version number, and every coordinate passes through one three-decimal formatter. The same value with the same settings produces the same bytes, so two downloads a year apart can be compared directly rather than eyeballed.
The digits printed under the bars are drawn as outlines rather than set in a typeface. No font travels with the file and none can be substituted, which is the same property the SVG QR codes have — and it matters more on a barcode, where the characters under the bars are what a human reads when a scanner will not.
What a barcode cannot do
Worth knowing before you choose one over a QR code.
It cannot be changed after printing. The digits are the data. There is no short link in the middle, so nothing can be re-pointed later — which is exactly why this tool is free and needs no account. If the destination might move, you want a dynamic QR code instead.
It cannot be counted. A till scanning an EAN tells us nothing; there is no request to record. Scan analytics need a code that routes through a server, which is what a dynamic QR code is.
A 1D barcode holds very little. Code 128 comfortably carries a part number, not a URL. If you need a web address on a small label, Data Matrix or a QR code will fit where a strip of bars will not.
Barcodes, answered
- Which barcode do I need?
- For a retail pack, the number on it decides: EAN-13 outside North America, UPC-A inside it. For a shipping or warehouse label, Code 128. For a carton, ITF-14, which survives printing on corrugated board. For a small part or anything laser-marked, Data Matrix. If none of those describes the job, Code 128 carries any text and is read by everything.
- Do you issue the numbers as well?
- No, and nobody should tell you otherwise. A UPC or EAN belongs to whoever bought it from GS1, and a barcode drawn from a number you do not own scans as somebody else’s product. We check that the number you type is internally valid and draw it; where the number comes from is between you and GS1.
- Why does it say my check digit is wrong?
- The last digit of a GTIN is arithmetic on the ones before it, so a single mistyped or swapped pair fails it. We say which digit the number should have ended in, because that is usually enough to spot what went wrong. The same code checks the GTINs on our packaging page, so a number that passes there passes here.
- Can I print the file I download today again next year?
- Yes, and it will be the identical file. Nothing in the output carries a date, a random id or a version, and every coordinate goes through one formatter, so the same value and the same settings produce the same bytes. If a print supplier asks whether the artwork has changed since last time, you can answer by comparing files.
- Does the text under the bars need a font installed?
- No. Those characters are drawn as shapes, not set in type, so nothing travels with the file and no print shop can substitute a different font. It is the same reason our SVG QR codes carry no font.
- Is it really free?
- Yes. No account, no watermark, no limit on how many you make. A barcode holds its data in the bars themselves, so unlike a dynamic QR code there is nothing of ours in the middle and nothing to charge for.
Last reviewed , against the product as it works today.
The rest of the toolbox
Open a row to see the screen and which plan has it.
Custom domains
Short links on your own domain, chosen code by code.Starter and up
Codes open go.yourbrand.com/menu rather than a link with our name in it, so the address under the code is yours. You add two DNS records and we check them. Then pick the domain for each code as you make it, or move a whole list of codes onto it at once.
Starter and up
QR codes on your own domain
Bulk QR code generator
A spreadsheet in, one dynamic code per row out.Starter and up
Paste or upload a list of names and links, match the columns, and get a dynamic code for every row - one per table, stall, badge or product - each with its own scans and destination.
Starter and up
The bulk generator
Change many codes at once
Tick the codes, then pause, tag, file or move them together.Pause and resume on every plan · folders and tags on Starter and up
Tick codes in the list, or pick every code with a tag, and pause or resume them, add or remove tags, move them to a folder or onto your own domain, or add campaign tags, in one go. The API does the same in one request.
Pause and resume on every plan · folders and tags on Starter and up

Short links, with your own ending
The link on its own, for a bio, an email or an ad.Every plan · custom endings on Business
Paste a link and get a short one you can change, route and count, with no QR code unless you want one. Every dynamic code already has its short link beside it, and a short link gets its QR code in one click - the same link, so clicks and scans count together. On Business you choose how the link ends, like /spring-menu, instead of random letters.
Every plan · custom endings on Business
The URL shortener
GS1 Digital Link for products
The retail code that carries your GTIN and still opens a web page.Every plan, Free included
Your domain and the GTIN from under the barcode, with batch, serial and dates if you want them, in the link format GS1 set for retail. A phone opens your page; the product data rides along in the address. The GTIN’s check digit is checked before anything is made.
Every plan, Free included
QR codes for packaging
Wi-Fi, contact cards, email, phone and SMS
Networks, contacts, calendar dates and places, not only links.Every plan, Free included
A website, plain text, a Wi-Fi network, an email, a phone number, a text message, a contact card, a GS1 Digital Link, a PDF, a location, a calendar event and more. Most download free, with no account; the few marked “Editable only” need one.
Every plan, Free included
Contact card codes
PDF codes you can update
Upload a PDF, print the code, swap the file later.Every plan, Free included
We host the file and the code opens it. Upload a new version and the same printed code opens that one, with the old file kept in its history in case you need it back.
Every plan, Free included
PDF to QR code
Your logo in the middle
Upload any image; we size it so the code still scans.Every plan, Free included
PNG, JPEG, WebP or GIF, up to 15 MB - we shrink it ourselves, so nobody has to compress a file first. Error correction goes up to make room, and the logo is never allowed to cover more of the pattern than the code can lose.
Every plan, Free included

Print-ready downloads
PNG and SVG on every plan, and a PDF for the printer.PNG and SVG on every plan · PDF on Starter and up
PNG for screens and quick jobs, SVG for anything that gets scaled, and a print-ready PDF on Starter and up.
PNG and SVG on every plan · PDF on Starter and up

Folders and tags
Keep one location’s or one campaign’s codes together.Starter and up
Put codes in a folder per shop, listing or campaign and filter the list by it. Deleting a folder never deletes a code - they move to No folder, and you can undo it.
Starter and up

Campaign presets
Saved UTM parameters, so printed scans are not “direct”.Starter and up
A printed code arrives in your web analytics as direct traffic. A preset fills in source, medium and campaign in one click, so the flyer and the table tent show up as themselves.
Starter and up

City-level scan locations
Which towns the scans came from, not only which countries.Pro and Business
Scans by city and region for each code, and towns on the live map. Coarse on purpose: the place the phone’s network reports, never a street or a precise position.
Pro and Business

CSV export
Daily scans per code, in a spreadsheet.Pro and Business
Download scans and unique visitors by day for one code or all of them - with each code’s name and short link - as CSV for your own reports, or for whoever asked how the campaign did.
Pro and Business

Webhooks
Your server hears about every scan and every change.Business
Pick the events - a scan, a code made or changed, a form answered, a QR Menu edited - and give us an address. Each one arrives as a signed POST, retried if your server is down, and every delivery is listed with the response it got.
Business
The API and webhooks
Separate workspaces
One subscription, a workspace per brand or client.Business
Each workspace has its own codes, team and analytics, so a client never sees another client’s. Up to 10 under one subscription.
Business

Priority email support
Paid plans’ emails are answered first.Starter and up
A person reads every message. On a paid plan yours is answered before free accounts’ - an order we keep, not a promised hour. Your plan and workspace go along with it, so nobody has to ask which account is yours.
Starter and up

Your data, to take or delete
A full export any time, and deletion you can take back.Every plan, Free included
Download everything - codes, history, scans, form answers and the files you uploaded - as one .zip with spreadsheets inside. Deleting the account gives you 30 days to change your mind, and your printed codes keep working until then.
Every plan, Free included

An API for the codes you print
A REST API for your own code: make dynamic codes and short links, change where they go, render SVG, PNG or PDF, add your domains and change hundreds of codes in one request. No-code tools like Zapier, Make and n8n can call it too, with a plain HTTP step. The API comes with Pro and up, and every request carries your key.
Render a code · Pro and up
curl -o code.svg \
-H "Authorization: Bearer $QRSALT_KEY" \
"https://app.qrsalt.com/api/qr?data=https://example.com"An SVG back, ready for a label, a template or an image tag.
Re-point a printed code · Pro and up
curl -X PATCH https://app.qrsalt.com/api/v1/codes/{id} \
-H "Authorization: Bearer $QRSALT_KEY" \
-H "content-type: application/json" \
-d '{"destination":"https://example.com/winter"}'The printed code opens the new page, and the old one is kept in its history. Keys can only ever touch their own workspace.
Change many codes at once · JavaScript
// Move a campaign's codes onto your own domain
await fetch('https://app.qrsalt.com/api/v1/codes/bulk', {
method: 'POST',
headers: {
authorization: `Bearer ${process.env.QRSALT_KEY}`,
'content-type': 'application/json',
},
body: JSON.stringify({ ids, action: 'domain', domain: 'go.example.com' }),
})Pause, tag, file or move codes in one call. The answer lists what changed and what was skipped.
