Product Features

⬇️ Scan the Sticker, Take the Record: Importing a Unit From a Live QR Code

August 18, 2026 · 8 min read · By Jonathan Curtis

A live QR code on a rooftop unit is a pointer to a page somebody else keeps current. Scan it with the app on a Pro account and you can pull that unit into your own database: the specs, the parts with their sizes, the service history and the site address. If you already have the unit, the same scan pulls in only what has changed since the last time you looked. Here is exactly what crosses over, what does not, and what a free or logged-out scan gets instead.

There are three kinds of QR code the app can print, and only one of them is a pointer. A text code carries the specs as readable text and a JSON code carries them as data. Either way the data is printed onto the sticker, so the sticker is finished the moment it comes out of the printer. A live URL code carries neither. It carries an address, and that address only resolves because the app publishes a page for that record and keeps it up to date.

That difference is what you are choosing between in the QR Creator. A sticker with the data printed into it tells you what was true the day it was printed. A sticker with an address on it tells you what is true now — including the service visit somebody logged last Tuesday, on a phone you have never seen.

What happens when the app scans one

The scanner reads the URL, pulls the record id out of the path, and then does two things at once: it looks for that unit in your own database, and it reads the published copy from the cloud.

It reads the cloud even when the unit is already yours. The lookup used to be skipped whenever a local match was found, so every unit anybody had ever received stayed frozen at the moment it was sent. A unit pushed to a vendor in June, with two service logs added in July, still showed June for ever, and nothing on screen said why.

The id comes from the sticker, not from whatever the scan matches locally. A unit received by push is re-created in your account under your own id, so your copy matches on its serial or its model number rather than on the id printed in the code. If the app only captured the id on the branch that matched by id, it would never fetch the published copy for those units.

The two dialogs you can get

If the unit is not on your device, you get "Found in Cloud" with the name and the site, and a note: specs, parts, service history and the site address come across, and photos stay with the owner. One button imports it.

If the unit is on your device, you get the ordinary match dialog with one extra button on it. It makes no difference whether your copy sits under the same id or is your own copy of a unit somebody pushed you. It reads "Import Updated Info" when the published copy holds something yours does not, and "Check For Updates" when it does not. The button is there either way. If it only appeared when the comparison found something, every failure before the comparison would look the same as "nothing new".

That is also why the dialog now names which step it reached. One message says "Checked the live code — nothing new to bring in". Another says "Nothing is published under this code". A third says "Could not read the live copy for this code. Check the signal and scan again." Three separate causes hid behind one silence through two rounds of fixes; each has its own line now.

What actually crosses over

The specs, from a fixed list that the first import and the later updates both use: name, type, manufacturer, model and serial numbers, floor, unit, location inside the building, address, city, state, voltage, phase, BTU, refrigerant and charge, horsepower, FLA/MCA, MOP, filter size, belt size, capacitor size, install date, manufacture date, warranty expiry, asset tag, last service date and notes.

The parts, with their sizes and their resolved stock. The service history. The spare units. And the building record itself, when your device does not have that site yet. The first version of the import wrote one equipment row and nothing else, so the unit arrived filed under a location name with no address and no contact behind it. It never overwrites a site you already have. That is the record you maintain, and a scan is not the moment to rewrite it.

  • ▸ Your building name is never taken. Every part, PM schedule and work order you own is keyed on it, so overwriting it would detach all of them.
  • ▸ Photographs never cross over. The import dialog says so up front, because an import that brings everything else and quietly skips the pictures looks broken.
  • ▸ Cost, labour hours, labour rate and materials cost are absent from the published copy entirely. The person scanning your sticker might be a competitor; publishing your margin to a smaller audience is the same mistake as publishing it to the world.
  • ▸ A site contact and address are withheld if that building has its site information switched off. The toggle governs what leaves the account, so it governs this copy too. Otherwise switching it off would hide the contact on the page and still hand it to an importer.

What it refuses to do, and why

You cannot import from yourself. Scanning your own sticker reaches a page your own device published, so the page can only ever be the same as your copy or older than it. Some published fields are derived rather than stored: a last-service date computed from the logs, an address folded in from the building. Left to the comparison, a scan would work most of the time and then offer to "update" a unit from its own reflection. A teammate is the same account by design, so their scan of your sticker behaves the same way.

Things you deleted do not come back. Deleted parts are matched by id. Deleted service logs are matched by their content — the date, the description, the technician — against the unit you deleted them on. Two rooftop units genuinely get the same quarterly PM on the same day from the same tech, and matching across the whole device suppressed the log on both. If either list cannot be read, nothing is added at all rather than everything you deleted coming back.

Nothing arrives twice. A part is recognised by its id. A published part with no id is skipped rather than added, because nothing could tell it apart from one you already have, so it would arrive again on every scan. A service log with no date is skipped for the same reason. The import has to put something in the date column, so it would write today’s date. The stored row would then differ from the published one, and differ again tomorrow, and the same visit would be added on every scan.

Where the Pro gate actually is

Not on the button. The importable copy of a record is a separate document from the page a sticker resolves to. The security rules open that document only to a reader who is signed in and is Pro themselves. The server refuses a free account, and it refuses a Pro account whose entitlement has not settled yet. The public page answers instead, with less on it. A modified app gains nothing by skipping the check, because the check is not in the app.

There are two more refusals in front of it, in this order. A Viewer on somebody else’s workspace is stopped first, and told why. No amount of entitlement lets a read-only role write, and the subscription belongs to the workspace owner, so showing them the paywall would be advice they cannot act on. The Pro gate comes next, and it has three answers rather than two: allow, refuse, and wait. Entitlement reads as false for the first moment of every cold start, and a plain check would eject a paying subscriber who scanned a code two seconds after opening the app.

There is one wrinkle. A technician working on somebody else’s Pro workspace inherits entitlement from the owner, so the app has already decided they are Pro and drawn the button without a padlock. Their own subscription document is not marked Pro, though, and the rules read that document. The read is refused and the scan falls back to the public page. Rather than quietly comparing against less data and reporting "nothing new", the dialog says so: "Only the public page could be read on this account."

What a free or logged-out scan gets

A free scan gets a great deal, and it matters most if you are the one printing the stickers. The page a live code points at is world-readable by design. A tenant, a contractor or an inspector with no account and no app points a plain phone camera at the sticker and a browser opens the unit: what it is, where it is, its specs, its service history and its parts.

That page is not a static snapshot either. It renders the stored copy immediately, so somebody standing in a plant room is not looking at a spinner. Then it asks the server to reassemble the record from the live data and folds the result in. The merge can only improve the page: nothing may disappear, nothing may be blanked, and a response for a different asset is discarded rather than partially applied.

A free scan does not get the import. Reading is free. Taking somebody else’s record into your own database is the paid part, and the refusal says exactly that: "Reading the page is free — scan it again to view the specs, service history and parts without importing."

When it will not offer you anything

Four cases, and the app names each one. The code has no live link at all — a text or JSON sticker, or a barcode — so there is nothing to check against. Nothing is published under that code, which is what a retired or deleted unit looks like. The copy could not be read, which usually means no signal. Or it was read and there is genuinely nothing new.

There is a fifth case. The importable copy only exists for units published since the app started writing it. An older sticker still resolves to its page and still imports from that, with less on it than a sticker published today. Any edit that touches the unit republishes it, and that fills the gap.

Try it

One sticker, two phones

Look at one of your own live codes from the outside, then have somebody else scan it.

1

Print a live code

On a unit, open Share Options from the share icon in the header and tap QR Code. That opens the QR Creator; choose the Link mode there. Text and JSON are free; the live URL mode is the Pro one, because it publishes and maintains a hosted page for the record.

2

Scan it with a plain camera

Not the app — the phone’s own camera. That is what a tenant or a contractor sees: the unit, its specs and its service history, with no account and nothing installed.

3

Scan it with the app, on another account

A Pro account that does not already have the unit gets Found in Cloud and an import. One that does gets the match dialog with Import Updated Info or Check For Updates on it.

4

Change something and scan again

Add a service log on the publishing device, then scan the same sticker on the other one. The dialog should name what is newer before you press anything.

Frequently Asked Questions

Do I need Pro to import a unit from a scanned QR code?

Yes. Only an account that is signed in and Pro can read the importable copy of a record. The database security rules enforce that, not the app, and the import is gated again in the app. Reading the page a sticker points at is free and needs no account.

What comes across when I import a unit?

You get the specs from a fixed list of 28 fields, the parts with their sizes and stock, the service history, the spare units, and the building record if your device does not have that site yet. Photos, costs, labour hours, labour rates and materials costs do not come across.

Will scanning overwrite the copy I already have?

Everything newer, and never your building name. Every part, PM schedule and work order you own is keyed on it. Service logs and parts you do not have are added, and anything you deleted on purpose is not brought back.

Why does scanning my own sticker never offer an import?

By design. The page was published by your own device, so it can only ever be the same as your copy or older. A teammate shares the same account and gets the same answer.

What does a tenant or a contractor see if they scan the same code?

The unit’s public page in an ordinary browser: what it is, where it is, its specs, its parts and its service history. No app, no account, no login. They cannot import it.

I scanned a code and it said nothing was published under it. Why?

Either the unit was unpublished or deleted, or the sticker is a text or JSON code with no live link. The app distinguishes those from "nothing new to bring in" and from "could not read the live copy", because they are three different problems.

Does the import work offline?

No. It reads a published copy from the cloud, so it needs a connection. Everything the app does with records already on the device — reading them, editing them, logging maintenance, scanning a code to look one up locally — works with no signal.

Why did an older sticker import less than a new one?

The full importable copy is written when a record is published, and it only exists for units published since the app started writing it. An older sticker resolves to its public page and imports from that. Editing and re-saving the unit republishes it and fills the gap.

👷

Jonathan Curtis

HVAC Technician & Founder · Equipment Tracker Pro

Jonathan Curtis is an HVAC technician and the founder of Equipment Tracker Pro. He built the app to solve real problems he encountered in the field, including the daily frustration of faded nameplates and administrative double-entry.

Try Equipment Tracker Pro Free

Core equipment tracking is free forever. Pro features include AI nameplate scanning, condition assessment, invoice scanning, cloud sync, and more.

💳 Secure billing via App Store, Google Play & Stripe 🔒 Encrypted hosting & database by Firebase

More in Product Features