A multi-session event asks a different question from a reception desk. The desk wants to know who arrived. A conference, a CPD seminar series, a corporate training programme or a university faculty seminar wants to know who was in which session, and often for how long, because that is what a continuing-education record, a training compliance file or a sponsor report is built from. This guide covers that per-session question. If you have one door and one list, the QR code sign-in sheet guide is the shorter read.
Written by QR to Sheets, which makes one of the tools described below, so weigh that accordingly. The free route and every spreadsheet formula here work whichever tool wrote the rows, including a Google Form's response sheet.
Why is session attendance harder than a sign-in sheet?
- Several rooms run at once, so the record has to say where as well as who and when.
- The same person is scanned once per session, many times a day, so a repeat is normal.
- Credit often depends on staying, not arriving. Many CPD and CE schemes credit time present or set a minimum share of a session, and an arrival time alone cannot answer that.
- The report is per session, not per person: how many attended the 11:00 workshop, and which registrants never turned up to anything.
Can I take session attendance free with Google Forms?
Yes, and for an internal lunch-and-learn or a single informal seminar it may be all you need. Make one Google Form per session with name and email fields, link it to a Google Sheet, and show its QR code on the opening slide or a poster by the door. Attendees scan with their own phone camera and submit. Each response lands in the Sheet with a timestamp, it costs nothing, and there is no cap on responses.
The weakness is the one that matters for CPD and training compliance: every response is the attendee's own claim.
- The link travels. A photo of the slide in a group chat lets someone at their desk submit, and nothing in the response shows where it came from.
- Anyone can type anyone's name, so one person can sign in a colleague who left at the coffee break.
- Limit to 1 response is not a fix. Google's own help (read 2026-10-06) says that to fill out a form with this setting, users must sign in to their Google Account, so it limits accounts rather than people and adds a sign-in step for every external delegate.
- One form with a session dropdown invites the wrong pick; one form per session means a separate form, QR code and poster for every slot on the agenda.
- A response at 09:05 says nothing about whether the person stayed until 12:30, which is the question a minimum-attendance rule asks. A second leaving form is the fix, and most people never submit it.
- In a basement room with no signal the submission fails, and people who are unsure whether it went through submit again.
Switching off Accepting responses soon after the session starts narrows the window but does not change who creates the record. If an auditor may ask how attendance was verified, a record made by staff at the door is the better answer.
How do I record attendance with one scanner per room?
Turn the direction round: attendees carry a code on their badge, and whoever is on each door scans it. In QR to Sheets, our product, that door scanner is a scanner link, a web address that opens the camera in a phone browser. The person scanning installs nothing and needs no account, so a volunteer or temp can be handed the link on the morning. Each scan becomes one row in your Google Sheet with the time, the scanned code and the name of the link that recorded it.
The link name does the work. The scanner column of every row reads link: followed by the name, for example link:Hall B or link:Day 2 - Ethics workshop, so the session is recorded without anyone typing it. Point every link at the same Sheet tab and one log holds the whole event in time order. Choose the names before the day: renaming a link later changes the name on new rows only.
One link per room, or one link per session?
- One link per room suits conference tracks where sessions change every 45 minutes. Door staff never switch links, and a small schedule tab in the Sheet maps room and time to the session title (formula below).
- One link per session suits training days, CPD workshops and faculty seminars with a few long sessions. The session title is in every row with no lookup, and it is the cleaner choice whenever exits are scanned too. Print each session's link QR on the door sheet so the next shift opens the right one.
| Capability | Google Form per session (free) | QR to Sheets |
|---|---|---|
| Cost | Free | Free for 300 scans, then 7 USD per registered device per month |
| Who creates the record | The attendee, on their own phone | Door staff, scanning the badge |
| Can be submitted from outside the room | Yes, by anyone with the link | Only if someone brings the badge, or a photo of it, to the door |
| Which session | Which form, or a dropdown the attendee picks | The link name, written into every row |
| Time present for CPD | A second form most people skip | A separate out link, scanned at the door |
| Same person scanned twice | A second response, no warning | Saved and flagged by default |
| No signal in the room | Submission fails | Kept on the phone, sent later with its scan time |
| Certificates or credits | No | No; you decide from the Sheet |
How do I print a QR code for every attendee badge?
Start from your registration export, one row per person. Give each person a short ID in its own column: the attendee or order number from your registration tool if it has one, or a simple sequence such as D0001, D0002. The code on the badge carries that ID, and the Sheet does the rest.
Copy the ID column into the free bulk QR code generator. It makes up to 500 codes at a time in the browser, with no account, and lays them out 24 or 8 to a sheet, the larger 8-up size being a practical badge sticker. It can print the encoded text under each code, which helps the door staff find a badge on the roster when a code will not read.
- Encode an ID, not a name or email. A short value scans faster at a busy door, and anything in the code can be read by any phone camera in the room.
- Keep a Roster tab with ID, name, email and organisation, and pull names into the report with XLOOKUP on the ID.
- If you want the name in the log itself, encode ID|Name and use column mapping to split it into two columns. Mapped rows always start with three tracking columns, so the ID lands in column D and the name in column E. Mapping is free on every plan.
- Print one badge first and scan it with the actual door phone, under the actual room lighting, before printing the batch. Keep codes at 18mm square or larger.
The generator makes codes, not badges: a branded badge with a logo and a large printed name still comes from a mail merge or an event platform, and the sticker goes on it.
How do I build a per-session attendance report in Google Sheets?
Leave the tab the scans land in alone, call it Log, and build everything else on other tabs. The examples assume the standard row: the timestamp in column A, the badge code in column B and the link name in column C. If you use column mapping, the link name is in column B and the ID in column D, so adjust the letters.
- Pivot table: Insert, Pivot table, over the Log range. Rows: column C. Values: column B, summarised by COUNTUNIQUE. That is distinct attendees per session, and a badge scanned twice still counts once. Add a date helper column, =INT(VALUE(A2)) formatted as a date because the timestamp arrives as text, and put it under Columns for a multi-day event.
- One session in one cell: =COUNTUNIQUEIFS(Log!B:B, Log!C:C, "link:Hall B")
- Every attendee and session pair, once each: =UNIQUE(FILTER(Log!B2:C, Log!B2:B<>""))
- An attendance matrix: roster IDs down column A of a Report tab, link names such as link:Hall B across row 1, and in B2 =IF(COUNTIFS(Log!$B:$B, $A2, Log!$C:$C, B$1)>0, "Yes", "") filled across and down.
- Registrants who attended nothing: =FILTER(Roster!A2:A, Roster!A2:A<>"", COUNTIF(Log!B:B, Roster!A2:A)=0)
When one room link hosts several sessions
Add a Schedule tab with the link name in column A exactly as it appears in the log, with its prefix (link:Hall B), the session title in B, and the start and end date-times in C and D. Use the door-opening time as the start so early arrivals count. Leave the Log tab alone: on a Sessions tab put =FILTER(Log!A2:C, Log!A2:A<>"") in A2 to mirror the log, then name the session for every row in D2, filled down:
- =IFERROR(INDEX(FILTER(Schedule!B:B, Schedule!A:A=C2, Schedule!C:C<=VALUE(A2), Schedule!D:D>=VALUE(A2)), 1), "Outside a session")
- Build the pivot table on the Sessions tab, using column D instead of the link name.
QR to Sheets writes each timestamp as YYYY-MM-DD HH:MM:SS in the timezone set for the workspace. The VALUE() wrappers in these formulas turn it into a date-time Sheets can compare, whether the cell holds a date or text, so the formulas work either way. Set that timezone to the venue before the first session, because rows already written are not rewritten, and an event logged in the organiser's home timezone puts the 09:00 keynote at the wrong hour.
How do I check minimum attendance and CPD hours?
The rules belong to your accrediting body or your training policy, not to a spreadsheet: some credit time present, some require a minimum share of each session, some only a sign-in. If time matters, record two scans. Give each session that carries credit an in link and an out link, such as Day 2 - Ethics - in and Day 2 - Ethics - out, both writing to the Log tab. Scan in at the door as people arrive and out as they leave, with a second phone at the exit if the room empties quickly.
On a CPD tab with roster IDs in column A, four formulas give a decision per person:
- First in, B2: =IFERROR(MIN(ARRAYFORMULA(VALUE(FILTER(Log!$A$2:$A, Log!$B$2:$B=$A2, Log!$C$2:$C="link:Day 2 - Ethics - in")))), 0)
- Last out, C2: =IFERROR(MAX(ARRAYFORMULA(VALUE(FILTER(Log!$A$2:$A, Log!$B$2:$B=$A2, Log!$C$2:$C="link:Day 2 - Ethics - out")))), 0)
- Minutes present, D2: =IF(OR(B2=0, C2=0), "Check", ROUND((C2-B2)*1440, 0))
- Against a 90-minute minimum, E2: =IF(ISNUMBER(D2), IF(D2>=90, "Qualifies", "Short"), "Check")
A zero in B or C means a missing scan, which is why the formulas show Check rather than a number: it is a person to ask, not a person to fail. First in to last out also overstates the time of someone who left for an hour in the middle. If that matters, scan the mid-session exit and the return too, and pair each in with the next out using the method in calculating hours from scan rows.
This records presence, not qualification. QR to Sheets does not issue certificates, award credits or report to an accrediting body, and nor does a Google Form. You decide from the Sheet who qualifies, then issue certificates the way you already do: a mail merge, a certificate tool or your learning system. A scan also shows that a badge was presented, not who was wearing it; staff at the door who look at faces are the control that covers that gap.
What happens when someone leaves and comes back?
By default every scan is saved. When the same code is scanned again on the same link within 12 hours, the door phone turns amber, says Already scanned with the count, and adds Saved anyway, so the delegate who stepped out for a call is scanned back in without an argument at the door. The repeat is a second row in the log and the COUNTUNIQUE report still counts that person once. A badge held in front of the camera is accepted once and has to leave the frame before it can be read again, so a slow hand does not create a pile of rows.
For a one-off session where each badge should count exactly once on that link, you may switch off Accept duplicate scans on that session's link. The link then records each code once, ever: a repeat shows Already scanned with the time it was first scanned, and nothing is added to the Sheet. That is reasonable here because the link serves one session and is retired afterwards. Leave it on for any room link reused across sessions or days, for every out link, for anywhere you want to see re-entry, and always for daily attendance or check in and check out, where the setting would refuse the next legitimate scan.
How many phones does a large conference need?
One for each door that is scanning at the same moment. Scanning a badge is quicker than finding a name on a printed list, but a full keynote hall with one door still queues, so give the main hall two doors and two phones and open them ten to fifteen minutes early. A runner covering two small rooms in turn is one phone.
- Free: 300 scans in total (not per month), one scanner link, one Sheet and one phone. Enough for a pilot or a single seminar room; a 100-person workshop scanned in and out of two sessions uses 400 scans and is past it.
- Premium: 7 USD per registered device per month, with unlimited scans and unlimited links. Each phone that scans takes one device slot, so six rooms with one phone each is 42 USD for that month. Billing is monthly and can be cancelled, keeping access to the end of the paid period.
- There is no per-attendee or per-session fee, and the people scanning need no accounts.
- Venue wifi fails in exactly the rooms conferences use. Scans are kept on the phone and sent when the signal returns, with their original scan time, though the report will not show them until that phone reconnects.
- Bring a battery pack per phone and a printed roster per room as the fallback.
When is an event platform the better buy?
Conference platforms are built for this job, and for some events they are the right purchase. Two examples, read on their own pages on 2026-10-06:
- Dryfta's session check-in page says organisers can set CE credits for each session or workshop and have Dryfta award credits to checked-in attendees automatically, and that its kiosks can print badges and participation certificates on site. If you need credits awarded and certificates printed without a spreadsheet step, that is the stronger fit.
- idloom's check-in per session page describes scanning guests' badges at the entrance of each session or workshop, checking them in and out, and seeing who attended which sessions and how long they stayed, in check-in lists and a statistics dashboard inside its own platform.
- Platforms also cover what this route does not: session booking with capacity limits, an agenda app, badge design and printing, and paid ticketing.
The spreadsheet route fits when registration already lives somewhere else (a Google Form, Eventbrite, an HR or learning system), you need a per-session record in a Google Sheet you own rather than inside a vendor dashboard, the door is staffed by volunteers or temps who should not need accounts, and you run a handful of events a year rather than a conference programme. A certificate tool can sit on the end of it: Certifier's guide to attendance sheets in Google Sheets (read 2026-10-06) describes turning Sheet rows into certificates, so the scanned log decides who qualifies and the certificate tool issues.
Step by step
- 1
Give every attendee one code
Export the registration list with a short ID per person and print one QR code per ID onto a badge or sticker. The same badge is scanned at every session, so it is printed once.
- 2
Create one scanner link per room or per session
Name each link exactly as it should appear in the report, such as Hall B or Day 2 - Ethics workshop. Point every link at the same Google Sheet tab so one log holds the whole event.
- 3
Put a phone on each door
Staff scan badges as people walk in. For sessions that carry CPD or CE credit, add an out link and scan again at the end, because time present needs two scans.
- 4
Test one badge on every link before doors open
Scan a spare badge on each phone and each link, then check the rows arrived with the right link name and a local time. Delete nothing; the test rows are easy to filter out by ID.
- 5
Build the report on its own tab
Leave the raw log untouched. A pivot table counts distinct attendees per session, and a CPD tab works out minutes present from the in and out scans so you can decide who qualifies.
Frequently asked questions
How do I track attendance at each session of a conference?+
Give every attendee one QR code on their badge, create one scanner link per room or per session, and have door staff scan badges as people enter. Every scan writes a row to one Google Sheet with the time and the link name, and a pivot table with COUNTUNIQUE gives distinct attendees per session.
Can I use a Google Form for CPD attendance?+
Yes, and it is free, but each response is the attendee's own claim: the link can be shared outside the room and anyone can type a colleague's name. Limit to 1 response requires respondents to sign in to a Google Account, and a single form gives no leaving time. It suits informal sessions better than audited CPD.
How do I record CPD minutes or hours with QR codes?+
Use two scanner links per session, one for in and one for out, both writing to the same Sheet. The FILTER formulas in the CPD section give each person's first in-scan and last out-scan as real date-times; subtract and multiply by 1440 for minutes. Treat a missing scan as a person to check, not a fail.
Does QR to Sheets issue CPD certificates or award credits?+
No. It records who was scanned, where and when, in your own Google Sheet. You decide who qualifies from that record and issue certificates through your existing route, such as a mail merge, a certificate tool or your learning system. Event platforms such as Dryfta state that they award CE credits automatically.
What if an attendee forgets their badge?+
Door staff can type the attendee's ID into the scanner's manual entry field after finding them on the printed roster, or hand over a spare numbered badge and note it on the Roster tab. Both write the same kind of row as a scan, so the report needs no special case.
Should I turn off Accept duplicate scans for a training session?+
Only on a link used for one session, where each badge should count once. With it off, a repeat shows Already scanned and adds no row. Keep it on for room links reused across sessions or days, for out links, and always for daily attendance or check in and check out.