The Problem
When we deployed Netreach Fiber across a 200+ unit apartment complex, we knew the infrastructure cold — Ubiquiti backbone, 2Gbps uplink, per-unit VLAN isolation, the whole stack. What I hadn't fully accounted for was the support surface that comes with handing 200 households a new internet connection.
The single largest source of anticipated calls was obvious in hindsight: residents asking for their WiFi passwords. Each unit gets its own SSID — two of them actually, a 5GHz network and a 2.4GHz network — with a unique password. There's no shared password to just post on a flyer. Every unit is different.
Without a solution, that's a support call every time a new resident moves in, every time someone gets a new device, every time someone forgets. At 200+ units with normal resident turnover, that adds up fast.
I'd seen this exact problem at a previous job supporting similar deployments. I knew what the call queue looked like. I didn't want to build it.
The Insight
The fix was simple once I framed it correctly: the problem isn't that residents forget their password. The problem is that passwords are the wrong format for this use case. Nobody should have to type a WiFi password in 2024. They should scan a QR code.
So I built a script that does exactly that — takes a spreadsheet of unit numbers, SSIDs, and passwords, and produces a formatted Word document for each unit containing both QR codes, the network names, the passwords in plain text, and instructions explaining which network to try first. The leasing office prints them, puts them in the welcome packet, and the resident scans it on move-in day.
Result: WiFi password support calls dropped to zero.
The Script
The input is a CSV with three columns — the 5GHz SSID, the 2.4GHz SSID, and the shared password for that unit. The script iterates through each row, generates two QR codes using wifi-qrcode-generator, and builds a Word document using python-docx.
import wifi_qrcode_generator.generator
import csv
from docx import Document
from docx.shared import Inches
from docx.enum.text import WD_ALIGN_PARAGRAPH
# pip install wifi-qrcode-generator python-docx
SSID_list = {}
with open('units.csv', 'rt') as csvfile:
reader = csv.reader(csvfile, delimiter=',')
for row in reader:
SSID_list[(row[0], row[1])] = row[2]
# Strip Excel BOM artifact from header row
del SSID_list['SSID', 'SSID2']
del SSID_list['', '']
for SSID in SSID_list:
ssidstr1 = str(SSID[0]) # 5GHz network
ssidstr2 = str(SSID[1]) # 2.4GHz network
WPA2 = str(SSID_list[SSID])
# Generate QR codes
for ssid in [ssidstr1, ssidstr2]:
qr = wifi_qrcode_generator.generator.wifi_qrcode(
ssid=ssid, hidden=False,
authentication_type='WPA', password=WPA2
)
qr.make_image().save(ssid + '.png')
# Build Word document
doc = Document()
doc.add_heading('Connect to your WiFi!', 0).alignment = WD_ALIGN_PARAGRAPH.CENTER
for ssid, img in [(ssidstr1, ssidstr1), (ssidstr2, ssidstr2)]:
p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
p.add_run().add_picture(img + '.png', width=Inches(3))
doc.add_paragraph(
f'SSID: {ssid} Password: {WPA2}'
).alignment = WD_ALIGN_PARAGRAPH.CENTER
doc.add_paragraph(
'Not sure which to scan? The top QR code is your 5GHz network — '
'faster, but shorter range. Try it first. If you have connection '
'issues, use the bottom QR code. Need help? Contact support at '
'877-487-9480 or support@netreach.com'
).alignment = WD_ALIGN_PARAGRAPH.CENTER
doc.save(ssidstr2 + '.docx')
The
del SSID_list['SSID', 'SSID2']line exists because Excel silently prepends a byte order mark to CSV exports, which shows up asin the first cell. Rather than fight the encoding, I just delete the header row by its mangled name. Pragmatic.
The Leasing Office Integration
The script handles batch generation — run it once against the full unit list and every document comes out ready to print. New unit added mid-deployment? Add a row to the CSV, run again, one new document. The leasing office staff don't touch the script at all. They just print from a folder.
The document itself is designed for residents who aren't technically inclined. Both QR codes are large and easy to scan. The plain text credentials are there as a fallback. The instructions explain the difference between 5GHz and 2.4GHz in plain English without using either term.
The Lesson
This script took an afternoon to write. The support calls it eliminated would have taken considerably longer — multiplied across 200+ units and years of resident turnover.
The best solutions to support problems aren't faster responses. They're making the problem not exist. Every time someone picks up the phone to ask for a WiFi password, that's a system design failure, not a support ticket.
I'd seen the call queue at a previous deployment. I knew what it looked like. I built this instead.
The signup flow — where the leasing office enters a new resident's name, email, and unit number and the system sends their QR document automatically via SMTP — is a separate script and will be covered in a follow-up post.