Use a dynamic code rather than a static one. A static code encodes the destination permanently, so if that page moves the printed code is dead. A dynamic code points at a redirect you control, which means you can change the destination later and see how many scans it received. Since the whole point of printing something is that you cannot easily reprint it, this is the decision that matters most, and it is the one free generators get wrong by default.

Send it somewhere built for the arrival rather than to your home page. Somebody scanning a code on a flyer, a vehicle, or a table has a specific expectation, and dropping them on a general page makes them navigate. A page that continues the thought they had when they scanned converts many times better, and it can be simple.

Test before printing at the actual size and distance. Codes need adequate contrast, a quiet margin around them, and enough physical size for the scanning distance, which is roughly a tenth of the distance the reader will stand away. A code that works on your monitor and fails on a window at three metres is a common and expensive discovery.

Add a line of text saying what happens when they scan it. Bare codes get ignored because nobody scans an unexplained square. Scan for the menu, or scan to book, converts materially better than the code alone.

Watch the scan numbers for the first few weeks, because they answer a question you cannot otherwise ask: whether the physical placement works. A code getting almost no scans is usually positioned somewhere people do not pause, not evidence that codes do not work. Moving it to where somebody is already standing still, such as beside a till or on a table rather than on a door, typically changes the result more than any redesign of the code itself.

Print it larger than feels necessary and check the scanning distance in the actual location. The rule of thumb is that a code needs roughly a tenth of the reading distance in width, which means a code intended to be scanned from three metres needs to be substantially bigger than one on a table. Codes that fail in place are usually a sizing problem rather than a generation problem.