{"id":1936,"date":"2026-08-04T13:00:00","date_gmt":"2026-08-04T18:00:00","guid":{"rendered":"https:\/\/tolinku.com\/blog\/?p=1936"},"modified":"2026-03-07T03:37:49","modified_gmt":"2026-03-07T08:37:49","slug":"qr-code-error-correction","status":"publish","type":"post","link":"https:\/\/tolinku.com\/blog\/qr-code-error-correction\/","title":{"rendered":"QR Code Error Correction Levels Explained"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">QR codes use <a href=\"https:\/\/en.wikipedia.org\/wiki\/Reed%E2%80%93Solomon_error_correction\" rel=\"nofollow noopener\" target=\"_blank\">Reed-Solomon error correction<\/a> to remain scannable even when part of the code is damaged, obscured, or covered by a logo. The error correction level determines how much of the QR code can be missing or corrupted before it becomes unscannable. Choosing the right level affects code size, scannability, and design flexibility.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For QR code design, see <a href=\"https:\/\/tolinku.com\/blog\/qr-code-design-best-practices\/\">QR code design best practices for higher scan rates<\/a>. For the complete guide, see <a href=\"https:\/\/tolinku.com\/blog\/qr-codes-short-links-mobile-apps\/\">QR codes and short links for mobile apps<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><img decoding=\"async\" src=\"https:\/\/tolinku.com\/blog\/wp-content\/uploads\/2026\/03\/screenshot-routes-1772819856524.png\" alt=\"Tolinku dashboard showing route configuration for deep links\">\n<em>Tolinku route configuration with QR code generation for each deep link.<\/em><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The Four Levels<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The QR code specification (<a href=\"https:\/\/www.iso.org\/standard\/62021.html\" rel=\"nofollow noopener\" target=\"_blank\">ISO\/IEC 18004<\/a>) defines four error correction levels:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table>\n<thead>\n<tr>\n<th>Level<\/th>\n<th>Recovery Capacity<\/th>\n<th>Data Overhead<\/th>\n<th>Best For<\/th>\n<\/tr>\n<\/thead>\n<tbody><tr>\n<td><strong>L<\/strong> (Low)<\/td>\n<td>~7%<\/td>\n<td>Lowest<\/td>\n<td>Digital screens, controlled environments<\/td>\n<\/tr>\n<tr>\n<td><strong>M<\/strong> (Medium)<\/td>\n<td>~15%<\/td>\n<td>Moderate<\/td>\n<td>General print, standard use<\/td>\n<\/tr>\n<tr>\n<td><strong>Q<\/strong> (Quartile)<\/td>\n<td>~25%<\/td>\n<td>High<\/td>\n<td>Outdoor use, rough handling<\/td>\n<\/tr>\n<tr>\n<td><strong>H<\/strong> (High)<\/td>\n<td>~30%<\/td>\n<td>Highest<\/td>\n<td>Logo embedding, harsh environments<\/td>\n<\/tr>\n<\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">&quot;Recovery capacity&quot; means the percentage of the QR code&#39;s data modules that can be damaged or missing while the code remains scannable.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">How Error Correction Works<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A QR code stores data in a grid of black and white modules (squares). The total number of modules depends on the QR code version (1-40, where version 1 is 21&#215;21 modules and version 40 is 177&#215;177 modules).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Error correction adds redundant data modules. These redundant modules allow the scanner to reconstruct the original data even when some modules are unreadable.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">The Trade-Off<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Higher error correction means:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>More resilience<\/strong>: The code works even when damaged.<\/li>\n<li><strong>More modules<\/strong>: The code needs more space to encode the same data.<\/li>\n<li><strong>Larger QR code<\/strong>: At the same physical size, modules are smaller and harder to scan.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Example for a URL with 50 characters:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table>\n<thead>\n<tr>\n<th>Level<\/th>\n<th>Version<\/th>\n<th>Modules<\/th>\n<th>Relative Size<\/th>\n<\/tr>\n<\/thead>\n<tbody><tr>\n<td>L<\/td>\n<td>3 (29&#215;29)<\/td>\n<td>841<\/td>\n<td>Smallest<\/td>\n<\/tr>\n<tr>\n<td>M<\/td>\n<td>4 (33&#215;33)<\/td>\n<td>1,089<\/td>\n<td>+29%<\/td>\n<\/tr>\n<tr>\n<td>Q<\/td>\n<td>5 (37&#215;37)<\/td>\n<td>1,369<\/td>\n<td>+63%<\/td>\n<\/tr>\n<tr>\n<td>H<\/td>\n<td>5 (37&#215;37)<\/td>\n<td>1,369<\/td>\n<td>+63%<\/td>\n<\/tr>\n<\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The jump from L to H can increase the QR code complexity by 50-100%, depending on the data length.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Choosing the Right Level<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Level L: Digital Screens<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Use Level L when:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>The QR code is displayed on a screen (phone, monitor, TV).<\/li>\n<li>The display quality is high (no pixelation, no glare).<\/li>\n<li>The environment is controlled (indoor, good lighting).<\/li>\n<li>You want the smallest possible QR code.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Level L is appropriate for:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>App-to-app sharing (one phone screen to another phone camera).<\/li>\n<li>Digital presentations on high-resolution displays.<\/li>\n<li>Websites and emails.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Level M: General Print<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Use Level M (the default for most generators) when:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>The QR code is printed on paper, cardboard, or plastic.<\/li>\n<li>Standard print quality (laser or inkjet).<\/li>\n<li>Indoor use with normal handling.<\/li>\n<li>No logo overlay.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Level M is appropriate for:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Business cards.<\/li>\n<li>Brochures and flyers.<\/li>\n<li>Product packaging (standard materials).<\/li>\n<li>Receipts.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Level Q: Outdoor and Rough Handling<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Use Level Q when:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>The QR code may be partially obscured (dirt, wear, folding).<\/li>\n<li>Outdoor use (weather exposure).<\/li>\n<li>The print medium has quality limitations (newsprint, low-resolution flexography).<\/li>\n<li>The code will be handled roughly (shipping labels, warehouse tags).<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Level Q is appropriate for:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Outdoor signage.<\/li>\n<li>Shipping labels.<\/li>\n<li>Floor stickers.<\/li>\n<li>Construction site materials.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Level H: Logo Embedding<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Use Level H when:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>You want to place a logo or image in the center of the QR code.<\/li>\n<li>The QR code will be printed on unreliable surfaces (textured, curved, or reflective).<\/li>\n<li>Maximum resilience is needed.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Level H is the only level that reliably supports logo embedding, because the logo covers approximately 10-15% of the code area, and the 30% error correction budget provides sufficient margin.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Logo Embedding<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Adding a brand logo to the center of a QR code is the most common reason for choosing Level H.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">How Much Can You Cover?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Level H recovers from up to 30% data loss. However, the logo also covers finder patterns and timing patterns, which cannot be recovered. Practical guidelines:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table>\n<thead>\n<tr>\n<th>Logo Size (% of QR area)<\/th>\n<th>Level H Reliability<\/th>\n<\/tr>\n<\/thead>\n<tbody><tr>\n<td>5-10%<\/td>\n<td>Very reliable<\/td>\n<\/tr>\n<tr>\n<td>10-15%<\/td>\n<td>Reliable (recommended maximum)<\/td>\n<\/tr>\n<tr>\n<td>15-20%<\/td>\n<td>Risky; test thoroughly<\/td>\n<\/tr>\n<tr>\n<td>20%+<\/td>\n<td>Likely unscannable<\/td>\n<\/tr>\n<\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Logo Shape<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Square or circle<\/strong>: These shapes cover the minimum area for their visual impact.<\/li>\n<li><strong>Rectangular<\/strong>: Covers more area for the same visual size; less efficient.<\/li>\n<li><strong>Transparent background<\/strong>: Reduces the effective coverage (only opaque areas matter).<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Best Practices for Logo QR Codes<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Generate the QR code at Level H.<\/li>\n<li>Place the logo in the exact center (over the alignment pattern, which is less critical than finder patterns).<\/li>\n<li>Add a small white border around the logo (2-3 module widths) to prevent the logo edges from merging with adjacent modules.<\/li>\n<li>Test the final QR code on at least 5 different phone models.<\/li>\n<li>Test at the smallest physical size you plan to use.<\/li>\n<li>Test in the worst lighting conditions you expect.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Error Correction and URL Length<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Shorter URLs produce smaller QR codes. This matters more at higher error correction levels because the overhead is proportionally larger.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table>\n<thead>\n<tr>\n<th>URL Length<\/th>\n<th>Level L Modules<\/th>\n<th>Level H Modules<\/th>\n<th>Difference<\/th>\n<\/tr>\n<\/thead>\n<tbody><tr>\n<td>20 chars<\/td>\n<td>21&#215;21 (v1)<\/td>\n<td>25&#215;25 (v2)<\/td>\n<td>+42%<\/td>\n<\/tr>\n<tr>\n<td>50 chars<\/td>\n<td>29&#215;29 (v3)<\/td>\n<td>37&#215;37 (v5)<\/td>\n<td>+63%<\/td>\n<\/tr>\n<tr>\n<td>100 chars<\/td>\n<td>37&#215;37 (v5)<\/td>\n<td>49&#215;49 (v8)<\/td>\n<td>+75%<\/td>\n<\/tr>\n<tr>\n<td>200 chars<\/td>\n<td>53&#215;53 (v9)<\/td>\n<td>69&#215;69 (v13)<\/td>\n<td>+70%<\/td>\n<\/tr>\n<\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">This is why short links are recommended for QR codes. A URL like <code>https:\/\/tolk.ink\/abc<\/code> produces a much simpler QR code than <code>https:\/\/yourdomain.com\/products\/summer-collection-2026?utm_source=print&amp;utm_medium=flyer<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Testing Error Correction<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Damage Simulation<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">To verify that your error correction level is sufficient:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Print the QR code.<\/li>\n<li>Cover parts of it with tape, stickers, or marker (simulating damage).<\/li>\n<li>Try scanning with multiple phones.<\/li>\n<li>Note the point at which scanning fails.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Environmental Testing<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Test in conditions matching your use case:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table>\n<thead>\n<tr>\n<th>Environment<\/th>\n<th>Test Method<\/th>\n<\/tr>\n<\/thead>\n<tbody><tr>\n<td>Outdoor rain<\/td>\n<td>Spray water on the printed code<\/td>\n<\/tr>\n<tr>\n<td>Direct sunlight<\/td>\n<td>Test in bright sunlight (glare)<\/td>\n<\/tr>\n<tr>\n<td>Low light<\/td>\n<td>Test in dim indoor lighting<\/td>\n<\/tr>\n<tr>\n<td>Distance<\/td>\n<td>Test at maximum expected scan distance<\/td>\n<\/tr>\n<tr>\n<td>Curved surface<\/td>\n<td>Attach to a bottle or curved package<\/td>\n<\/tr>\n<\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Common Mistakes<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table>\n<thead>\n<tr>\n<th>Mistake<\/th>\n<th>Impact<\/th>\n<th>Fix<\/th>\n<\/tr>\n<\/thead>\n<tbody><tr>\n<td>Using Level L for print<\/td>\n<td>Fails with minor print defects<\/td>\n<td>Use Level M or higher for print<\/td>\n<\/tr>\n<tr>\n<td>Using Level H unnecessarily<\/td>\n<td>Larger QR code than needed<\/td>\n<td>Only use H for logo embedding or harsh environments<\/td>\n<\/tr>\n<tr>\n<td>Logo covers too much area<\/td>\n<td>Unscannable<\/td>\n<td>Keep logo under 15% of QR area<\/td>\n<\/tr>\n<tr>\n<td>Not testing with a logo<\/td>\n<td>Works in generator but not in print<\/td>\n<td>Test printed versions on multiple phones<\/td>\n<\/tr>\n<tr>\n<td>Long URL with Level H<\/td>\n<td>Extremely complex QR code<\/td>\n<td>Use a short link to reduce data<\/td>\n<\/tr>\n<\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Tolinku for QR Codes<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/tolinku.com\/features\/short-links-qr\">Tolinku<\/a> generates <a href=\"https:\/\/tolinku.com\/docs\/user-guide\/routes\/qr-codes\/\">QR codes<\/a> with configurable error correction levels. Short link URLs from Tolinku produce simpler QR codes that scan more reliably at any error correction level.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For UTM tracking with short links, see <a href=\"https:\/\/tolinku.com\/blog\/utm-parameters-short-links\/\">UTM parameters with short links: campaign tracking guide<\/a>. For the complete guide, see <a href=\"https:\/\/tolinku.com\/blog\/qr-codes-short-links-mobile-apps\/\">QR codes and short links for mobile apps<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Understand QR code error correction levels (L, M, Q, H). Choose the right level for logo embedding, print quality, and scan reliability.<\/p>\n","protected":false},"author":2,"featured_media":1935,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"rank_math_title":"QR Code Error Correction Levels Explained","rank_math_description":"Understand QR code error correction levels (L, M, Q, H). Choose the right level for logo embedding, print quality, and scan reliability.","rank_math_focus_keyword":"QR code error correction","rank_math_canonical_url":"","rank_math_facebook_title":"","rank_math_facebook_description":"","rank_math_facebook_image":"https:\/\/tolinku.com\/blog\/wp-content\/uploads\/2026\/03\/og-qr-code-error-correction.png","rank_math_facebook_image_id":"","rank_math_twitter_title":"","rank_math_twitter_description":"","rank_math_twitter_image":"https:\/\/tolinku.com\/blog\/wp-content\/uploads\/2026\/03\/og-qr-code-error-correction.png","footnotes":""},"categories":[16],"tags":[254,158,132,606,29,584,162,48,49,607],"class_list":["post-1936","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-marketing","tag-best-practices","tag-branding","tag-design","tag-error-correction","tag-mobile-marketing","tag-offline-to-online","tag-print-marketing","tag-qr-codes","tag-short-links","tag-technical"],"_links":{"self":[{"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/posts\/1936","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/comments?post=1936"}],"version-history":[{"count":2,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/posts\/1936\/revisions"}],"predecessor-version":[{"id":2441,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/posts\/1936\/revisions\/2441"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/media\/1935"}],"wp:attachment":[{"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/media?parent=1936"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/categories?post=1936"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/tags?post=1936"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}