| A Shopify merchant selling memorial keepsakes engraved photo frames, plaques, metal QR tags needed every physical item to carry a working QR code that opened a memorial page for that specific person. The awkward part is the sequence. The QR is engraved or printed while the order is being made, but the family has not written anything yet. We built a Laravel and MySQL application that reads orders from Shopify, mints a unique memorial link for each one now of purchase, and gives the customer a plain, unhurried form to fill in whenever they are ready. The keepsake ships with a code that already works. |
|---|
Most software problems are about doing something faster. This one was about doing things in unusual order.
A retailer selling memorial products came to us with a straightforward-sounding request. Customers buy an engraved frame or a small metal plaque, and they want the item to carry a QR code. Someone scans it at a graveside or on a shelf at home and reaches a page about the person: their photographs, a few paragraphs, video if the family has any.
The obvious way to build that is: family creates the page, system generates a QR, merchant engraves it. Except that is not how the shop works, and it is not how grief works either.
The problem underneath the problem
The physical item gets made first.
An order comes in. The workshop engraves the metal tag or prints the code onto the frame, and it ships within a few days. But the person who just placed that order may have lost someone three weeks ago. They cannot sit down and write a considered tribute, choose between forty photographs, and upload a video, all before the frame can be made.
So the QR code had to exist and be permanent from the moment of purchase, while the thing it points to could arrive days or months later. Everything else in the build follows from that one constraint.
The design decision was to make the link the primary object rather than the page. Now the order lands, the system mints a unique, permanent URL and its matching QR image. That code goes to the workshop immediately. The memorial page behind it is filled in later, by the customer, in their own time.
How the flow works
| Stage | What happens | Where |
|---|---|---|
| Order placed | Customer buys the keepsake, adds the name to be engraved | Shopify storefront |
| Order retrieved | The application reads the new order through the Shopify API | Laravel backend |
| Link minted | A unique memorial URL is generated and stored against that order | MySQL |
| QR generated | The matching QR image is produced for engraving or printing | Laravel backend |
| Item produced | The workshop engraves the metal tag or prints the code | Merchant |
| Memories added | The customer opens the form and adds photos, video and words | Web form |
| Page lives | Scanning the code opens the completed memorial page | Public URL |
The key point is that the QR is valid from stage four. Scan it before the family has filled in and you reach a page that is waiting, not a broken link. That mattered more than it sounds like it should, because the alternative a code that 404s until someone completes a form would be a genuinely upsetting thing to hand to a grieving customer.
Why Laravel, MySQL and the Shopify API
Nothing exotic. The requirements pointed at boring, durable technology and we did not argue with them.
Shopify was already the shop. The client sells there. The job was not to replace it or wrap it, but to listen to it. The application reads order data through the Shopify API order reference, customer, the personalisation fields and treats each new order as the trigger to mint a link. The merchant’s team carries on working in the Shopify admin they already know.
Laravel handles the order sync, the link generation, the QR image, the upload pipeline and the public page rendering, with queued jobs so a burst of orders does not slow the storefront. It is a well-trodden framework with a long support history, which is a mundane thing to care about until you remember what this product promises.
MySQL holds the mapping that matters most: order reference to memorial link to memorial content. That relationship is the entire product. Everything else could be rebuilt from scratch; that table could not.
Nothing gets thrown away on failure. If Shopify is briefly unreachable or a sync fails, the order is picked up on retry rather than lost. A missed order in most e-commerce integrations is an inconvenience. Here it is a keepsake that ships with a dead code on it.
Designing a form for someone who is grieving
This is the part of the project that took the most thought and shows the least.
The temptation with any content builder is to offer everything layouts, themes, fonts, section ordering. For this audience, that is not generosity, it is a burden. Someone filling this in a fortnight after a funeral does not want a design tool. They want to be asked a small number of clear questions and then be finished.
What we settled on:
Short, plain fields. Name, dates, a place for words, photographs, video. No jargon, no configuration.
Nothing is mandatory that does not have to be. Some families write four paragraphs. Some upload one photograph and a single line. Both should produce a page that looks intentional rather than empty.
No time pressure. There is no countdown, no expiry, no nagging. The link is already engraved on something permanent; the form waits if it needs to.
No cheerfulness. Confirmation messages are quiet. Nothing in the interface congratulates anyone.
Photo and video galleries are the one place we allowed real richness, because that is what families want. Images and video are what people come back to; formatting options are not.
Privacy: who can see the page
A memorial page is public in a very literal sense anyone standing near the headstone can scan the code. That makes privacy a design question rather than a checkbox.
The platform includes privacy controls, so the family decides what the page is: openly visible to anyone who scans or restricts. Some families want a public tribute that distant relatives and old friends can find. Others want something only the immediate family will ever open on an object that happens to sit in a public cemetery.
Both are legitimate, and the point is that the family chooses rather than the software, deciding on their behalf.
The question nobody asks until later: what does “forever” mean?
Memorial products are sold on permanence, and permanence is a technical claim as much as an emotional one. It deserves an honest answer rather than a marketing one.
A QR code engraved into metal will outlast the software behind it. That is simply true, and anyone building in this space should say so plainly. What you can engineer is this:
Stable URLs The link minted at order time never changes. Redesign the page, migrate the server, change the theme the URL that is physically engraved on someone’s keepsake stays valid. This is the single most important constraint in the whole system, and it constrains everything downstream.
Exportable content The words and photographs family uploads are their own. They should be retrievable in a form that survives the platform.
A boring stack. Laravel and MySQL are not fashionable choices. There are choices that will still have maintainers, security patches and hosting options in ten years, which is the relevant question when the product is attached to a headstone.
None of that is a guarantee of forever. It is the difference between a system designed for a decade and one designed for a funding round, and families deserve the former.
What we would tell anyone building something similar
Five things, drawn from this build rather than from general principle.
- Mint the identifier before the content exists. If a physical object carries a code, the code is the product. Design the system around the link, not around the page.
- A code that has not been filled in yet must still be resolved. An unfinished page is fine. A 404 on a keepsake is not.
- Read the order, do not rebuild the shop. The client’s Shopify admin was working. Integrating with it, replacing it, and it kept training to almost nothing.
- Cut options from the customer-facing form until it hurts, then cut one more. Every choice you offer is a decision someone has to make on the worst month of their year.
- Decide what happens to the data if the business stops. Ask it at the start. It is a much harder conversation to have later, and in this category, it is not hypothetical.
Where does this pattern goes next
The underlying mechanism a purchase generates a permanent link and a QR code, the buyer fills in the content afterwards is not specific to memorials. It is the same shape whenever a physical object needs to point at content that does not exist yet now of manufacture.
We have used or scoped the same pattern for:
Digital business cards and printed cards runs, where a batch is printed before the individual profiles are completed
Product authentication and provenance tags, where each unit needs its own permanent, verifiable link
Plaques, awards and commemorative items for institutions and clubs
Pet tags and identification items, where the link matters more than the page design
Event and exhibition signage, where codes are produced ahead of final content
If you sell something physical and you want it to carry a code that leads somewhere specific, this is a solved problem, and it does not need to be expensive.
Frequently asked questions
What is a QR memorial platform?
It is a system that gives each memorial keepsake a plaque, an engraved frame, a metal tag its own permanent QR code linking to a page about one person. Scanning the code opens photographs, video and written memories the family has added. It exists so a physical object placed on a headstone or a shelf can carry more than a name and two dates.
How does the QR code get onto the product before the family writes anything?
The link is generated now of purchase, not now the page is completed. The application reads the new Shopify order, mints a unique permanent URL, and produces the matching QR image straight away so the workshop can engrave or print it. The family fills in the memorial page afterwards, in their own time, and the code works either way.
Can a memorial page be kept private?
Yes. The platform includes privacy controls, so the family decides whether the page is openly visible to anyone who scans the code or restricts to the people they choose. That choice matters because a code on a headstone is physically accessible to any passer-by.
What technology was the QR memorial platform built with?
Laravel with a MySQL database, integrated with Shopify through its order API. The Shopify store remains the shop; the Laravel application reads orders from it, generates the memorial links and QR codes, and hosts the memorial pages themselves.
Will the QR code still work in twenty years?
The engraved code will outlast any software, so what matters is whether the URL behind it stays stable and who is maintaining the platform. This system is built so the link minted at order time never changes regardless of redesigns or server migrations, on a technology stack chosen for longevity rather than fashion. No vendor can honestly promise forever, and any that does should be asked how.
Can this be built for products other than memorials?
Yes. The mechanism purchase generates a permanent link and QR code, buyer adds the content later applies to digital business cards, printed card runs, product authentication tags, commemorative plaques, pet tags and event signage. Anywhere a physical item is produced before its content is finalised.
If you are considering a memorial portal, a QR-linked product range, digital cards, or any build where a printed or engraved code needs to lead somewhere permanent, we are happy to talk it through including telling you if it is simpler than you think.
Talk to us about your project →
Fly IT Solution builds custom software and white-label platforms from Mohali, India and Minneapolis, Minnesota, with more than a decade of delivery across e-commerce, healthcare, EdTech, logistics and field services. This project was delivered for a Shopify merchant in the memorial keepsake trade. Client details and commercial terms are withheld at their request




