Staff iOS, offline on move-in day

OXP Mobile Move-In Scanner

On move-in day at a student property, hundreds of residents walk away with keys while Entrata still says they never moved in. I designed the phone flow that records the move-in while the resident is still standing at the table, even when the Wi-Fi is gone.

Open live walkthrough →

RoleProduct Lead (PM + UX + prototype handoff)
TimeframeMar – May 2026
CollaboratorsCustomer Workflows engineering, the OXP mobile team, about 20 student-housing operators from industry interviews, and Entrata’s data team
SurfaceA SwiftUI module inside Entrata’s OXP staff iOS app, shipped as a package with a demo target

Feel free to try it out.

Move-In is a Quick Action on the home screen staff already open, because burying it under lease admin would have failed the breezeway.

Open the full walkthrough

Problem

Keys went out. Entrata never heard about it.

Peak student turn moves 100 to more than 500 residents in a day, from a breezeway, the office, or a drive-through. The Wi-Fi is unreliable, and the line does not stop for it.

So staff marked a spreadsheet and caught Entrata up later, or fought desktop Entrata on a phone. Either way, the resident felt moved in and the system of record did not.

An audit of May through August 2025 at a large student operator put numbers on that gap.

~21%

Student move-ins processed in Entrata in real time on move-in day

~36%

Move-ins with zero Entrata activity in the window, then caught up overnight

~0%

Peak-month use of desktop Bulk Move-In at the largest operator in the set

Why that gap matters to Entrata

Student housing was a majority of Entrata’s clients, and move-in week is their busiest week of the year. If that week runs on a spreadsheet, Entrata is optional on the days that matter most, for the customers who make up most of the book.

A phone in the line writes the record while the resident is still there. That was the bet: a property that can move someone in offline, in seconds, has a reason to run the day in Entrata.

Process

The first answer was an overnight upload

The pain we could measure first was the morning after. A 300-resident property spent about eight hours re-keying a spreadsheet into Entrata. So I designed an agent that matched each row to a lease and showed its work before writing anything.

Site visits moved the bet. The failure happened while the resident was still in line, and a faster catch-up still left Entrata wrong all day. The upload stayed as the next-morning bridge, and the main bet moved to the table.

Before anything was written, the upload sorted the file into people who would move in, people who needed a follow-up, and rows it would skip.

Wrong first. Then the table told us.

My first spec assumed a QR scan would lead, open optional items would block the move-in, and offline could wait for a later release. Site visits at three properties and interviews with about 20 operators corrected all three.

Operators described the line as “Smith, 315,” not a code on a phone. Optional items could not hold up a couple hundred people outside. Breezeway Wi-Fi fails often enough that offline had to ship first. I rewrote the requirements within 48 hours.

What I tried firstWhat replaced it, and why
Name-only searchA unit search returns every roommate, because staff move roommates in back to back.
Offline in a later releaseOffline in the first release, with the next 30 days of move-ins cached on the device.
A large offline bannerA quiet Offline chip. The banner looked safe in mocks and would have been ignored outdoors.
A manager PIN overrideNo override in the first release. It would be too easy to burn on a busy Saturday.

Search replaced the camera

The first SwiftUI build opened on a QR scanner, and search was the button at the bottom. Operators described the line as a name and a unit, so I made the roster the first screen and moved the scanner to an icon in the header.

In the first build, staff landed on a camera and had to tap out of it to search.
The roster and its search field became the first screen, with QR as a secondary icon.

Making Ready the loudest badge

In the first roster, Ready was gray and every open required item was red, so the people who could not move in were the ones that caught the eye. The express line needs the opposite. I made Ready green and turned every other state neutral.

Before, the red blockers were the loudest thing on the list.
After, a glance down the list finds the residents who are ready to go.

The success message after confirm

I tried three versions of the moment after confirm. A custom toast let staff start the next student right away. A system alert was more familiar, but it made staff tap OK before anything else, and that stops a line. The toast came back, and it now dismisses itself.

The first toast confirmed the move-in without blocking the roster.
The system alert made staff tap OK before they could search again.
The final toast returns on the later roster and disappears on its own.

The optional-items warning

Once optional items stopped blocking the move-in, the screen still treated them like a problem. An orange warning sat at the top, and the escalation task competed with Move in on the same row. The warning became a calm note, and the follow-up became a second action under Move in, as shown in Solution.

The orange warning and the side-by-side buttons made a resident who could move in look like an exception.

An offline chip on the roster

The cached roster already worked without a network, but nothing on screen said so. Staff could not tell whether a confirm had reached Entrata or was waiting on the device. I added a small chip that says Offline and how many confirms are queued.

Before, the offline roster looked exactly like the online one.
After, the chip says the device is offline and two confirms are waiting.

Solution

Name, checklist, confirm, next

The flow follows the line staff already ran. They type the name they just heard, glance at the checklist, check a photo ID, and confirm. What used to take minutes in desktop Entrata, or overtime the next day, now takes seconds.

The Ready badge is not a new policy. Operators already ran an express line for ready residents and a cleanup line for everyone else, and the roster puts that rule on a screen.

The roster shows who is ready before staff open anyone.
A ready resident gets a checklist glance, not a profile review.
Confirm puts the photo ID check above the button.

Keep the line moving, and still stop when you must

Optional items that were still open at confirm used to disappear once the person was moved in. Now staff can move the resident in and leave themselves a follow-up task, so someone comes back to those items after the rush.

Required items and hard blocks stop the line, with no override. Staff send that person to the resolution station, which is how properties already handled exceptions.

Optional items are open, and Move in is still available.
Required items are open, so Move in is gone.

Offline is the day, not a later cut

Staff are on company iPads in a breezeway, and the Wi-Fi drops. The next 30 days of move-ins are cached before they walk outside. When the network goes, home collapses to Move-In, the roster still searches, and confirms wait for a connection.

Offline, home shows a short note and Move-In, and nothing else.
A small Offline chip tells staff the writes are waiting.

What the mobile team received

I worked out the states in an Expo prototype, then rebuilt the flow as a SwiftUI package with a demo target the OXP mobile team could drop into their app. Their review found five real defects in about half an hour, and the fixes went back the same day.

The rewrite cost time. It also meant the native team reviewed a module they could run, not a stack of frames.

What's next

How we would know it worked

Pilot results are not in yet, so these are the targets that would prove the bet or disprove it. If same-day completion stays near one in five, the spreadsheet won.

SignalWhat we already knewTarget
Same-day completion at pilot propertiesAbout 21% processed in Entrata on the day95% or more
Move-ins caught up the next morningAbout 36%Near zero
Staff overtime during turnAbout 8 hours of re-key on a 300-resident propertyDown 60%
Time to process someone at the tableAbout 90 seconds, anecdotalUnder 20 seconds
Share of pilot move-ins done on the deviceAbout 0% peak-month use of desktop Bulk Move-In30% or more
Wrong-resident incidentsA known risk when roommates share a unitZero

What I would change

  • I would put offline in the first release from week one, instead of waiting for interviews to force it.
  • I would bring the engineering partner in by the end of week one. Week three was too late to learn the live app’s constraints.
  • I would move to SwiftUI sooner. Expo was right for arguing about states and wrong for a native team’s final review.

Sibling case: The spreadsheet upload was the first answer

Built with — Field research and SQL. Expo to argue about states, then SwiftUI for handoff to the OXP mobile team.

  • Field research
  • SQL
  • SwiftUI
  • Offline

← All work