date-website

Attendance Admin Guide

What this is for

The attendance list is the digital replacement for the paper list at a meeting. You create an event, the site gives it a public page, and the participants check themselves in and out with a short code that the site shows on a page only the attendance readers can open, and rotates by itself. Nobody has to be checked in by an editor, and no paper has to be passed around, so a room with a screen or a projector can run the whole thing from the site.

The list is a record of who was in the room at a meeting. It is not the association’s minutes, and it does not replace them.

Creating an event

  1. Open the attendance events list (Närvaroevenemang, under Närvaro in the sidebar) in /admin and use the add button above the list. It shows each event’s title, whether it is Inte startat, Pågår or Avslutat, its start and end time and whether guests may check in, and each row carries Visa möteskoden for the overview page and Rapport for the record. The status is coloured: green while the meeting is running, amber before it starts and grey once it has ended, which is how the meeting that is running now is found in a list ordered by start time. It opens on the newest event, and can be searched by title or narrowed by date.
  2. Fill in:
    • Titel: the name the participants see, and the name the admin list shows.
    • Beskrivning: one optional line shown under the title.
    • Slug: the URL segment. An event with the slug hostmote lives at /attendance/hostmote/. It has to be unique and can contain only letters, digits, hyphens and underscores, so write hostmote rather than höstmöte. The form says the same under the field.
    • Starttid and Sluttid: when the event begins and ends. Sluttid is optional. With it, the event leaves the public list once that moment has passed; without it, the event leaves the list 24 hours after its Starttid. Sluttid has to be later than Starttid, and the form refuses a pair the other way round rather than saving it, because the status, the public list and the report all read the two together. The form explains what an empty Sluttid means. A meeting whose end is not known in advance is the ordinary reason to leave it empty: the event page then prints “Slutar: -“, the meeting stays on the list for 24 hours from its start, and the report labels its headcount differently (see The report after the meeting, and docs/dev/attendance.md for what the number is computed from).
    • Tillåt icke-medlemmar att delta: unticked by default, which means the event page asks a visitor without an account to log in. Tick it and save to open the meeting to guests, and a guest can then see the check-in form and write their name. The switch takes effect on the next page load, so tick it before the meeting if guests are expected.
    • Kodens giltighetsperiod (sekunder): how long each code is shown before it rotates. 30 is the default, and the field refuses anything below 1 second, because a period of zero breaks the code calculation. A meeting that needs longer to read or scan the code can be given more; a shorter period is harder to pass on to somebody outside the room.
    • Kodens genereringsnyckel: the value the codes are computed from. The site fills in a random one, and you can leave it as it is.
  3. The form is grouped so the meeting comes first and the code machinery second: Mötet holds the fields above, a small section under it holds the three links, and Koden holds the two code fields folded away, which is where to look when the code has to change. Under the links, Öppna incheckningen opens the page the participants use, Visa möteskoden opens the overview page with the current code, and Visa ändringarna opens this meeting’s own change list; all three open in a new tab, so a half-filled form is not left behind. The two times are one field each with a calendar picker, the same widget the events and polls forms use, and a change row’s time is edited with it too. The admin’s own View on site button in the top right opens the same participant page.
  4. Save. The event appears on /attendance/ immediately unless its Sluttid has already passed, or it has none and started more than 24 hours ago. Its page is at /attendance/<slug>/ either way, and so is its code.

Running the check-in at the meeting

  1. Open the event’s page at /attendance/<slug>/, and follow Till översiktsvyn near the top. Only a reader who holds the attendance permission sees that link.
  2. The overview page at /attendance/<slug>/overview shows the current code in large digits with a QR code below it, the Närvarande list under that, and the Närvaroflöde feed last. The code and the QR code change every Kodens giltighetsperiod (sekunder) seconds, and the page updates itself, list, feed and headcount included, so leave it on a screen where the participants can see or scan it. Under the attendee list, the feed is a table with a line per check-in and check-out as it happens, newest first: the time, the name, and whether the person arrived or left. An arrival is written in green and a departure in amber, and the word in the last column says the same thing, so the colours are a shortcut rather than the only signal. A departure followed by a fresh arrival is the same person stepping out and coming back, which is what to point at when somebody asks whether a member really left the room and returned. The feed opens on the ten most recent changes and a Visa fler button reveals the next twenty each time, so the page does not scroll on for ever; when the changes the page brought with it run out, the button gives way to a line linking to the meeting page, whose Närvaroändringar list shows the same changes as a snapshot, and the report holds the whole record and downloads it as a timeline CSV.
  3. The overview page is for readers who hold **Närvaroevenemang Can view närvaroevenemang**, and staff status on its own is not enough. An anonymous visitor who opens the address is asked to log in, and a signed-in member without the permission gets an error page whether they are staff or not. That is deliberate: the code is the whole check-in control, so the page that shows it stays with the people running the meeting. See Permissions for how to grant it.
  4. Read the code from the screen rather than copying it onto a whiteboard or a printout. It is only valid for its window, so anything written down is stale within seconds.

The headcount in the room

Both the event page and the overview page print how many people are present in the Närvarande heading itself, as in “Närvarande: 7”. On the event page the number is a snapshot from the moment the page was opened, so reload to refresh it, and the names under it are drawn only for a reader who holds the attendance permission. On the overview page the number and the names are live: the number moves as people check in and check out, and it is always the length of the list under it, so the heading and the rows cannot disagree.

The live headcount describes who the attendance log currently counts in the room. It is useful context while a poll is running, but it is not the poll’s exact turnout denominator: guests and members who are not eligible to vote can be present, and attendees may enter or leave between votes. A higher headcount than voter count does not by itself mean that someone eligible has not voted. See docs/admin/polls.md for the poll rules.

Reaching the event page

The site’s menus are editor content, not code, so the attendance page reaches them the way any other link does: add a Static URL entry (under a Static Page Nav category) pointing at /attendance/, and it appears in that dropdown. Until such an entry exists, the address is something you give to the participants.

The event list at /attendance/ is public, and each event has its own address at /attendance/<slug>/. The QR code on the overview page is the shortest route to one event: it encodes the event’s address as a full link, the kind any phone camera app offers to open, with the current code in it, so a participant who scans it lands on the event page with the code already filled in. Nothing needs to be installed for that, and the page’s own Skanna QR-kod button reads the same code. The address it carries is the one the overview page is being served from, so open that page at the site’s own address, which is where the admin is normally reached anyway: a page opened through an internal server name and not through the site would put that name in the code, and a phone in the room could not follow it. Put the event’s address in the meeting invitation if people should be able to find it without the QR code, and remember that a guest still needs Tillåt icke-medlemmar att delta ticked to use it; the switch is off on a new meeting.

Checking people in and out

The change log

The report after the meeting

Once the meeting is over, the attendance events list (Närvaroevenemang, under Närvaro) has a Rapport button on every row. It opens a page for that one meeting. Nothing on the page is stored: it is computed from the check-in rows every time it is opened, so there is nothing to maintain and nothing that can go stale.

The page shows the meeting itself (title, description, start and end, slug, whether guests may check in, and its status), then four numbers:

The status names one of three states. Inte startat is a meeting whose Starttid is still ahead, Pågår is one that has started and has no end or has not reached it, and Avslutat is one whose Sluttid has passed. A meeting without a Sluttid is therefore Pågår from its start onwards and never Avslutat: there is no end to compare against, which is the same reason its headcount carries the last-change label below.

The Tidslinje table below is the whole log, oldest first: local time, the name, whether the row is an arrival or a departure, and whether the person is a member or a guest. A meeting with more than a thousand changes draws the first thousand and says so under the heading; both downloads still carry every row. It is the same data as the Närvaroändringar list on the event page, but in the order the meeting happened, which is the order to read it in when writing the minutes. The time column prints a short local date and time on one line, as in 2026-10-16 23:51, so a narrow window does not fold it over several lines.

Under that, every poll attached to the meeting is printed with its question, whether voting has ended, each choice with its votes and share, and three numbers beside each other:

The headcount is contextual, not an exact denominator for a particular poll. It is read at the meeting end or last change, not when each vote was cast, and it can include guests and members who are not eligible to vote. A Flerval poll can also have more ballots than voters, and Vem som helst lets one member vote more than once. Do not read the headcount as the poll’s eligible population. While a vote is running, the poll’s own page shows the current room count and voter count (docs/admin/polls.md), which still are not an exact denominator.

The page is laid out for the screen as well as for paper, in both admin themes. The action links at the top are styled as buttons, and they wrap onto another row on a narrow window instead of being cut off at the edge; Mötet and Visa ändringarna lead back to the meeting and to its change list, so there are five of them, or four when the reader may not see poll questions. Each part of the report sits in its own bordered section under a heading, the number lists run across the line and wrap, and every table fills the width with padded cells and can be scrolled sideways when the window is too narrow for it, so no column is lost and nothing is clipped. On a phone-width window the meeting details stack into one column with a gap between the pairs rather than as a dense block.

Taking the report away

Two buttons at the top of the report download it:

Both files are named after the meeting, for example narvaro_hostmote_2024-05-01.csv, and both open directly in Excel. They use a semicolon between columns and start with a byte-order mark, so Swedish Excel reads the UTF-8 names correctly. String data cells beginning with =, +, - or @ get a leading apostrophe so Excel treats them as literal text; that check looks past leading spaces, tabs and line breaks, so a cell cannot slip a formula in behind one. The column headers and numeric values are unchanged.

Printing the report

The report prints from the browser’s own print dialog, with the usual Ctrl+P (Cmd+P on a Mac). The page carries a print stylesheet, so the printed sheet leaves out the admin’s header, the Unfold header, user menu, breadcrumbs, sidebar and the sidebar’s own toggle control, footer and the report’s own download buttons. It prints black text on a white page whatever colours the admin uses on screen, so a dark theme does not carry its backgrounds onto paper. It keeps a heading with the content that follows it, keeps a table row, a list item and a heading from being cut in half by a page break, and repeats a long table’s header row on every page. It does not number the pages, add a header or footer of its own, or make a PDF: that is what a print dialog or a phone’s “save as PDF” is for, and the stylesheet deliberately does no more than what is listed above.

To keep a meeting’s report for the file, print it while the page is open. The address can also be bookmarked and opened later, because the numbers are computed from the stored rows every time the page is loaded.

Non-members in the admin

Guests have a page of their own, Icke-medlemmar under Närvaro: one row per name, with how many change rows carry it, searchable by name. A guest’s row is created the first time their name is used on the public check-in form and is reused for every later event, so an editor adds a guest by having them check in, not by creating anything, and only on a meeting with Tillåt icke-medlemmar att delta ticked. On that page a name can be corrected and nothing else: there is no add, and no delete, because deleting the row would take every change recorded under that name with it, including past meetings and the report. A rename onto a name another guest already has is refused. The row is shared, so a correction appears everywhere the name does.

Deleting events and members

Permissions

Troubleshooting

“Fel kod” is shown over the code box.

The page says “För många felaktiga koder. Försök igen om N sekunder.”

“Du kan inte gå in i ett evenemang var du redan är närvarande”

“Du kan inte gå ut ur ett evenemang var du inte är närvarande”

An event is missing from the public list.

The code on the overview page is not changing, or the page says “Anslutningen till servern bröts”.

A participant has no account.

A participant is missing from the Närvarande list even though the change log shows them.