The pattern itself never expires — a QR code is just geometry. Whether scanning keeps working depends on one thing: is the destination encoded directly (static) or routed through a vendor's redirect server (dynamic)?
A static code encodes the final data — your URL, WiFi credentials, vCard — directly in the modules. Nothing sits between the scan and the destination, so the code works as long as the destination itself exists. Print it on a gravestone and it will scan in fifty years. Everything generated on this site is static, deliberately.
A dynamic code encodes a short redirect URL on the vendor's domain (qr-vendor.com/abc123), which forwards to your real destination. That enables editing the target and counting scans — genuinely useful features — but it means every scan depends on that vendor's server, business model, and your subscription. Lapse the plan, or watch the vendor fold, and every printed code dies simultaneously. This is the mechanism behind most "my QR code stopped working" stories.
Scan it and look at the URL before it redirects (most phones preview it): if it shows a domain that isn't yours or your destination's, it's dynamic. Auditing old marketing materials this way is worth an afternoon — especially anything printed permanently.
Honest answer: campaigns where you must change the destination after printing, or need per-scan analytics, are legitimate dynamic use cases — go in with eyes open about the dependency and pick a vendor accordingly. For menus, WiFi cards, product links, business cards and anything long-lived, static wins. If you control the destination domain, you can have both: encode your own short URL (yourbrand.com/menu) statically and change where that path points whenever you like.