All guides
Teacher guide

Daily classroom attendance with QR codes and Google Sheets

How a teacher takes daily class attendance with QR codes: print one card per student, scan the room from your phone, read absences in Google Sheets.

10 min readUpdated 4 October 2026

Short answer

Daily classroom attendance works by printing one QR code per student, then having the teacher scan each student with a phone so every scan appends a timestamped row to a Google Sheet.

A free Google Form with a printed QR code is the no-cost alternative, but it needs every student to have a phone, is self-reported, and loses submissions when school wifi drops.

Teacher scanning takes roughly one student per second, so a class of thirty is under a minute, and QR to Sheets is free for 300 scans then 7 USD per month for the one device.

Taking the register is the most repeated administrative task in teaching. Five minutes a day, five days a week, thirty-nine weeks a year is roughly sixteen hours of calling out names — and it still produces a paper sheet that gets lost, or a spreadsheet someone types up in the evening.

This guide is written for an individual teacher setting this up themselves, without waiting for a school system, an IT ticket, or a procurement decision. Everything here works with a Google Sheet you own and a phone you already have.

Why does the free Google Form approach struggle in a classroom?

The standard advice is a Google Form with a printed QR code on the wall: students scan it, type their name, and submit. It is free and it genuinely works for some settings, so start there if it fits. The free Google Form method for QR attendance is set out step by step in the school guide.

In a real classroom it usually breaks for reasons that have nothing to do with the software:

The self-reporting problem is the one that matters. If your register carries any consequence, a method a fourteen-year-old can trivially game is the wrong method regardless of price.

Invert it: the teacher scans the students

Give each student a printed code and have the adult do the scanning. This single change fixes almost every problem above at once.

QR to Sheets is built for exactly this shape, and its QR attendance system for schools page covers the whole-school version, so read this section as interested but specific. You connect your own Google Sheet, create a scanner link, and open that link on your phone. Each scan appends a row. Nothing is installed, and if a cover teacher takes your class you send them the same link and it works immediately — no account, no setup, no explaining.

QR Code Attendance in Google Sheets: Scan with Any Phone (No App) (4:02, hosted by Pip). Pip, the QR to Sheets assistant, walks through this set-up from connecting a Sheet to scanning from a phone, including what happens when a student is scanned twice.Watch on YouTube Chapters and transcript

How do I scan student ID cards into Google Sheets?

If your school already issues ID cards with a barcode or a QR code on them, you do not need to print anything. Where a card has a code, it usually holds the student number as a QR code or a 1D barcode such as Code 128 or Code 39, and a phone camera reads it as it is, with no reprinting. Scan one card into a test row first and check the value matches the ID your school's systems use; some cards add a prefix or a check digit that is worth knowing about before the first real register.

On the free route a Google Form has no scanner of its own, so the number still has to be typed or pasted into the form. With QR to Sheets you open the scanner link and point the phone at each card: it reads QR codes and the common 1D formats (Code 128, Code 39, EAN, UPC and ITF), and the value lands in the Sheet exactly as encoded, leading zeros included. A worn or scratched card that will not read can be typed into the manual entry field.

What it costs, honestly

The free tier covers 300 scans in total, which is enough to trial the whole thing with a real class for a couple of weeks. Beyond that it is $7 per month for the device you scan with, with unlimited scans.

For a single teacher scanning their own classes, that is one device. Thirty students scanned twice a day, five days a week is roughly 1,200 scans a month, and the price does not move — you are paying for the phone, not the scans or the students. It is also small enough to be a personal decision rather than a procurement one, which for most teachers is the difference between doing it this term and never doing it.

Google Forms / Apps Script (DIY) compared with QR to Sheets
CapabilityGoogle Forms / Apps Script (DIY)QR to Sheets
CostFreeFree to 300 scans, then $7/month for one device
Who needs a phoneEvery studentJust you
Proof of presenceSelf-reportedYou witnessed it
Time for a class of 305-10 minutesUnder a minute
Works with no signalNo, submission lostBuffers on device, syncs later
Separate periodsOne form, needs cleanupOne link per class or session
Cover teacher can run itYes, but no accountabilityYes — send them the link
Where the data livesYour Google SheetYour Google Sheet

Turning scans into a register you can report from

Keep the scan log untouched and build everything on top of it. In practice:

Privacy, because this is data about children

Attendance records about identifiable pupils carry obligations under GDPR, FERPA, or your local equivalent, whichever tool you use. A few practical things make compliance easier rather than harder:

The same setup covers more than the register

Once the codes are printed and the habit exists, the same scanner handles the other things that quietly eat a teacher's time: device and textbook loans, club and detention sign-in, trip headcounts, exam room entry, and equipment checkout. Only the destination Sheet changes.

What happens when the same student gets scanned twice?

This will happen in your first week. A student joins the queue again because they were not sure it worked, you scan a desk label twice while walking a row, or a card is lying face up and gets read as you pass. The question is not how to prevent it but what you want the register to do about it, and there are only two sensible answers.

A scanner can refuse the second scan, or it can record it and tell you. Refusing looks tidy on the phone and costs you information: once a scan has been discarded you cannot tell it apart from a scan that never happened, and you cannot reconstruct what occurred if a mark is queried later. Recording it keeps the log complete and moves the decision into the spreadsheet, where it is reversible.

QR to Sheets does the second, so read this as one design rather than a universal rule. Scan the same value again within twelve hours and an amber badge shows the repeat count alongside the words "Saved anyway". By default both scans are saved and the repeat is flagged. If the repeat lookup is unavailable the scanner fails open, meaning the badge does not appear and you carry on scanning rather than being stopped mid-register. A link can be set to refuse repeats instead (Accept duplicate scans off), but that refuses a code for good, so a register reused every day should keep it on.

For a daily register this is usually a non-issue, because the pivot table you already built counts scans per student per date and a student with two scans still reads as present. If you want an explicitly deduplicated tab, wrap the log in UNIQUE or QUERY and leave the log itself untouched. The badge is more useful as a live signal than as a data problem: two scans of the same code in quick succession is worth looking up for.

Can I use one shared phone or tablet at the door?

Yes, and for a classroom it is often the better setup than scanning with your own phone. An old tablet propped at the door, or a spare phone on a stand, means the register is taken by whoever is standing there rather than by whoever owns the right phone. It also gets your own phone out of your hand at the exact moment a class is arriving.

A scanner link makes this straightforward because it is a public URL with no login. Open it once on the shared device, allow the camera, and bookmark it or set it as the home page so the next person to pick it up is already on the scanner. Because there is no account attached, there is nothing sensitive sitting on a device that lives in a classroom, and nothing to log out of at the end of the day.

The same property is what makes cover so easy. A cover teacher does not need the shared device set up for them, because there is nothing personal in it to set up. They open the link, or pick up the tablet that is already on it, and scan. Setting up a QR check-in kiosk on a shared tablet covers the station in more detail.

What happens to the register when the wifi drops?

School wifi is the weak link in most classroom systems, and corridors and mobile classrooms are usually the worst of it. This is where the free Google Forms route fails hardest: a form submitted with no signal is simply lost, and the student who submitted it believes they are marked present. You find out at the end of the week, when the numbers do not add up.

A scanner link handles it differently. Scans are written to the device first, into a local CSV backup and a retry queue, and then synced to the Sheet when signal returns. You keep scanning the whole class with a dead connection and the rows catch up afterwards. The register you took is not at the mercy of the access point in the corridor.

The part worth understanding is what happens on retry. Each scan carries its own identifier, so when the queue drains and a scan is sent again after a partial failure it lands on the same row rather than creating a second one. That matters because the obvious naive fix for offline capture, retry until it works, is exactly what produces mystery duplicate rows a fortnight later.

Will the timestamps match my school day?

Only if the timezone is set correctly, and this is the single most common reason a late-mark formula produces nonsense. It is worth two minutes of attention on setup day because it is invisible when wrong: the rows arrive, the register looks fine, and only the lateness column is quietly incorrect by a fixed number of hours.

There are two separate traps. The first is the offset itself: if a scan is recorded in UTC and your school day starts at 08:40 local, every comparison against a period start is wrong by however far you sit from UTC, and wrong by a different amount either side of a daylight saving change. The second is subtler. If a timestamp is written as a raw ISO string, Google Sheets stores it as text rather than as a date. Sorting then goes alphabetical, filters by date range return nothing, and any formula that does arithmetic on it fails silently.

QR to Sheets writes YYYY-MM-DD HH:MM:SS in the timezone set for your workspace under admin settings, which Sheets reads as a real date-time. Set that once when you connect the Sheet. If you are building the register with a different tool, check the same two things: that the offset is your local one and that the column right-aligns as a date rather than left-aligning as text. If your times are already off, why Google Sheets timestamps show the wrong timezone walks through each cause.

Step by step

  1. 1

    Print one QR code per student

    Paste your class list into a bulk QR generator and print the sheet. Encode the student ID if your school uses one, otherwise the name is fine. Tape each code inside the front of a planner, onto an ID card, or onto the corner of a desk.

  2. 2

    Make a Google Sheet with one row per scan

    Not one row per student per day. One row per scan: timestamp, student, class. A register is a pivot table built on top of that log, and keeping the log append-only is what lets you fix mistakes later without destroying history.

  3. 3

    Set up a scanner you open on your own phone

    You want something that opens as a web page, because anything requiring an install will not survive a school device policy and cannot be handed to a cover teacher.

  4. 4

    Take the register by walking the room

    Scan each student as you pass their desk, or scan them at the door as they come in. Roughly one student per second, so a class of thirty is under a minute.

  5. 5

    Build the register view once, reuse it forever

    A pivot table keyed on student and date turns the scan log into the grid you actually report from. Build it once in September and it fills itself in for the rest of the year.

Frequently asked questions

Do students need phones or an app for QR attendance?+

Not with a teacher-scanning setup. Students only need their printed code — no phone, no app, no account. Only the teacher uses a device, and that runs in a normal phone browser.

How long does it take to take the register this way?+

Roughly one student per second in practice, so a class of thirty is under a minute. The limit is how fast you can walk the room, not the scanner.

Is a Google Form good enough for daily attendance?+

For a low-stakes optional session, often yes, and it is free. For a daily register it is weak: it is self-reported, so a student can submit for an absent friend, and it has no offline handling when school wifi drops.

What does it cost for one teacher?+

Free for the first 300 scans, then $7 per month for the one device you scan with, including unlimited scans. Because you pay per device rather than per student, a class of thirty and a class of three cost the same.

What if a student forgets or loses their code?+

Keep a manual fallback and expect to use it regularly. A good scanner lets you type the ID by hand, and you can reprint a single code in seconds. Plan for the exception rather than treating it as a failure.

Can a cover teacher take the register?+

Yes, and this is a real advantage of the link-based approach. You send them the same URL, they open it, allow the camera once, and scan. There is no account to create and nothing to install, so it works on the day with no handover.

Should the QR code contain the student name or their ID?+

The ID where you have one. It is stable across name changes, it disambiguates two students with the same name, and a lost card exposes nothing personal.

What happens if I scan the same student twice by accident?+

With the default settings the row is still written and nothing is blocked. QR to Sheets shows an amber badge with the repeat count and "Saved anyway" when the same value is scanned again within twelve hours. Your register pivot counts scans per student per date, so a double scan still reads as present and needs no cleanup.

Does QR attendance work without internet in the classroom?+

Yes with a scanner link. Scans are saved to the device first as a local CSV backup and retry queue, then synced when signal returns, so you can scan a whole class offline. Each scan carries its own identifier, so a retry updates the same row rather than creating a duplicate.

Can I leave a shared tablet at the door instead of using my own phone?+

Yes. The scanner link is a public URL with no login, so you open it once on the shared device and bookmark it. Nothing sensitive is stored on the device and there is nothing to log out of. Billing is per registered device, so a tablet shared by four teachers counts as one.

How do I mark a student late rather than just present?+

Compare the scan timestamp against the period start time with a formula on a separate tab. This only works if the timestamps are real date-times in your local timezone. QR to Sheets writes YYYY-MM-DD HH:MM:SS in the workspace timezone you set, which Sheets reads as a date rather than as text.

Can a student get a friend to scan their card for them?+

Yes, if you are not looking. A scan proves a code was presented, not who presented it. Teacher scanning is what limits it in practice, because you see the face while the camera reads the card. Treat a repeat-scan badge as a prompt to glance up rather than as an error to fix.

Do I need a separate scanner link for every class?+

One link per class or session is the usual setup, because it keeps periods separated with no weekly cleanup. The free plan allows one active link, which is enough to trial with a single class. One link can be opened on any number of phones, so you are never limited by devices per link.

Try it on your own Google Sheet

Connect Google, create a scanner link, and share the URL with your team. The free tier covers 300 scans, and nobody you share it with has to install anything.

Start for free

No credit card required

Keep reading