Skip to main content
OpenQRS
Tools
Current language: English
100% Private

App download QR code generator

100% Private & Local — Your data never leaves your browser. These QR codes are permanent and will never expire.

App download settings

One code carries one address. The landing page option is the only one that reaches iPhone and Android users from the same printed code.

A page on your domain with both store buttons, or your own server-side redirect that reads the user agent.

Enter the address of the page that offers both stores, or choose a single store link instead.

Design

Module shape
Presets
Corner frame
Add a centre logo
Choose an image, or drop one herePNG, JPEG, WebP or GIF, up to 1000 KB

The image is read in this page and embedded in the code as a data: URL. It is not uploaded, and it stays inside the file you download.

More design options

The dark half of the code. Keep it well below the background in lightness.

Covers the quiet zone as well as the gaps between modules. A transparent background leaves it out of the file, so nothing is drawn with it.

Contrast 11.5:1 between the modules and the background.

Presets

PNG and WebP keep an alpha channel; the SVG simply omits the background rectangle. Whatever the code is placed on becomes the light half of the contrast.

Gradient

A gradient fills the dark modules only. Its lighter end sets the contrast a scanner actually gets, so both ends have to stay dark.

The second colour, used only while a gradient is selected. It is measured for contrast alongside the first.

45°

Degrees clockwise from a left-to-right sweep. A radial gradient spreads from the centre outwards, so the angle applies to a linear one only.

Module shape

Rounded shapes cover less of each cell. The centre stays covered, which is where a decoder samples, but a small print of a dense code reads more reliably as squares.

Corner frame

The ring of the three finder patterns.

Corner centre

The eye inside each finder pattern.

4 modules

The blank margin around the code, measured in modules. 4 is the specified minimum.

Higher recovery survives more damage and costs capacity, so the same content produces a denser symbol.

A logo sits at the centre and holds the level at H. Its width limit follows the symbol: 14% on the smallest code, 30% on a dense one.

Live preview & export

Export

Export

Raster, for screens

Complete the form to enable the downloads.

Export size and encoded text
Payload
Nothing encoded yet
Symbol
Not built yet
Recovery
M

Waiting for input

Export size

Between 64 and 4096 pixels. Exporting at 1024 px.

Encoded text

Encode an App Store link, a Google Play link, or a page of your own that offers both. Which of the three the code carries is your choice, made explicit below because a single code cannot make it for you.

When someone scans it

The phone opens the URL you selected. A store link normally hands off to the App Store or Play Store app; a link to your own page opens in the browser.

Why one code cannot send iPhones and Android phones to different stores

A QR code is a fixed string of characters. The pattern that gets printed encodes that string and nothing else — there is no logic inside it, no variables, and no way for it to inspect the phone that reads it.

Products that appear to branch by operating system do it one step later. The code carries a link to a redirect service, the service receives the request, reads the User-Agent header the phone sends, and answers with a redirect to the matching store. The branching happens on a server.

This site has no server. Every page is a static file and the encoding runs in your browser, which is what keeps the data local and the codes free of an expiry date — but it also means there is nothing here that could receive a scan and decide where to send it. Rather than pretend otherwise, this tool encodes exactly one address and asks you which one.

Using a landing page you control

If you need one printed code to serve both platforms, the redirect has to live somewhere you own. Two approaches work, and neither requires anything from this site.

The simplest is a plain page — example.com/get-the-app — with an App Store button and a Play button on it. The visitor picks. It costs one extra tap, it works on desktop browsers and on platforms neither store covers, and it never breaks. The alternative is a server-side redirect on that same path that inspects the User-Agent and issues a 302 to the right store, falling back to the two-button page when the header is unfamiliar.

Either way the printed code points at your own URL, so you can change stores, add a third platform or swap the app entirely without reprinting anything.

  • Two-button page: no server logic, works everywhere, one extra tap
  • User-Agent redirect: one tap, needs a server, needs a fallback for unknown agents
  • Both keep the printed code pointed at a path you own

Store link formats worth knowing

Apple listings live at apps.apple.com/app/id followed by the numeric app identifier, often with a country segment such as /gb/ or /us/ before it. Including a country locks the link to that storefront; leaving it out lets Apple choose by account region, which is usually what a printed code wants.

Google Play listings are play.google.com/store/apps/details?id= followed by the package name, for example com.example.app. Both stores append campaign and referral parameters when you copy a link from a marketing dashboard. Those parameters lengthen the payload and make the printed grid denser, so strip anything you do not need before encoding.

Questions and answers

Every other generator offers an iOS-and-Android code. Why not this one?

Because those codes point at the generator's redirect service rather than at a store. That works while the service runs and while your subscription is current, and the code dies with either. The trade is real and it is yours to make — this site simply cannot offer the service half of it, so it does not sell the appearance of one.

Does an App Store link work when an Android phone scans it?

It opens, but not usefully. The Android browser loads the App Store web page, which shows the listing and cannot install anything. The reverse is the same: a Play link on an iPhone renders a web listing with no install path. That is exactly the case the landing page option exists to cover.

Can I add a campaign tag to see where installs came from?

You can — both stores accept their own attribution parameters, and you paste the finished URL here. Be aware that the parameters lengthen the string, which raises the QR version and makes the modules smaller at any given printed size. Check the code still scans from your intended distance after adding them.

What if my app is not in either store?

Encode the download page directly with this tool's landing page option, or use the URL tool if that is all you need. A direct link to an installer file is a poor choice for a printed code: browsers on both platforms warn about or block sideloaded packages, and the file path tends to change with every release.

How a static QR code works

Every code on this site is static: the payload is written into the black and white modules themselves. Nothing is looked up when the code is read, no server of ours takes part, and no subscription holds the printed code up. The same property is the limit — once it is printed, what it contains cannot be changed.

Three things then decide whether a printed code reads: how many bytes the payload came to, which recovery level absorbs the damage, and how wide a single module ends up on paper. These guides work through each of them with the numbers.