CSV import format
Bulk-add workers to your roster from a spreadsheet.
The columns
Three columns, in order: name, phone, tags. One
worker per row.
Alice Anderson,+13125551001,line cook
Bob Bell,555-123-4568,"line cook, prep cook"
Carol Chen,(416) 555 0199,server A header row is optional. If the first row contains the word name or phone,
we skip it. Otherwise we treat the first row as data.
Blank lines are ignored.
Tags: two ways, same result
A worker can have any number of tags. There are two ways to write them, and they produce the same result:
- One column, quoted. Put every tag inside double quotes, separated
by commas:
Alice,+13125551001,"line cook, prep cook, closer" - Or spilled across extra columns. Each tag is its own column, no
quotes needed:
Alice,+13125551001,line cook,prep cook,closer
Both parse to three tags: line cook, prep cook, closer.
Use whichever your spreadsheet exports.
Spaces are fine. Commas are the separator.
A tag can contain spaces, hyphens, apostrophes, whatever reads naturally. So line cook works. What you can't do is put a
comma inside a tag, because that's the field separator. If you want a tag with a
comma in it, don't. Use a different word.
Tags are how ShiftRobin knows who to text for what. When you create a shift, you pick the required tags, and only workers with those tags get offered the shift.
Phone numbers
We strip everything that isn't a digit, then normalize. So all of these end up at the same place:
4165551234(416) 555-1234416.555.1234+1 416 555 1234
Ten digits gets a +1 prefix. Eleven digits starting
with 1 is treated as already-prefixed. Anything else
is passed through with a leading +, which mostly
means don't put international numbers in during alpha.
Fewer than ten digits and the row fails.
Alpha constraint: worker numbers must be Canadian (except Quebec, per the Terms). US routing goes live after our 10DLC carrier vetting clears.
Consent
Every worker on your roster requires explicit consent to be texted. See the consent section on the reference page for the two consent paths.
CSV imports default to "admin confirmed." That means: by uploading the file, you're attesting that you've already asked each of these workers in person or in writing, and they said yes. If you're not sure about someone, take them out of the CSV and add them one at a time via the roster form. That form lets you pick double opt-in per worker, which sends them a YES/STOP check first.
When rows fail
Rows are validated independently. A row with a missing name or a phone under ten digits is rejected and reported ("Line 4: invalid phone for Bob Bell"), but the good rows still import. You can fix the bad rows and re-upload just those.
Uploading the same worker twice doesn't duplicate them. We match on normalized phone.
Getting from a spreadsheet
Google Sheets: File → Download → Comma-separated values (.csv).
Excel: File → Save As, pick CSV UTF-8 (Comma delimited). Excel
can be persuasive about wanting .xlsx. Say no.
Numbers on macOS: File → Export To → CSV.
Where to upload
In the app, go to Roster → Import CSV. You get a drag-and-drop, a preview of the parsed rows, and a summary of any errors before the import commits.
Not sure whether to bulk-import or hand-add? For your first ten workers, add them one at a time. You'll get a feel for the consent flow, and it costs you five minutes. Move to CSV once the pattern's obvious.
Broken parse or a case we don't cover? Email hello@shiftrobin.com with the file and we'll take a look.