Running the company
Importing your data
← All documentation · Running the company
Web app8 min readUpdated
Open web Settings → Import data to bring properties, team members, visits, recurring schedules and invoices in from a spreadsheet or a calendar feed, with a dry run before anything is saved.
Switching from another system should not mean starting from an empty account. The Import data page brings over everything a cleaning business carries with it, with a rehearsal before anything is saved and a re-run that recognizes what it already brought.
What can be imported
| Records | Where it comes from |
|---|---|
| Customers | A spreadsheet. See below for the page. |
| Properties | A spreadsheet |
| Team members | A spreadsheet |
| Visits, past and future | A spreadsheet or a calendar feed |
| Recurring schedules | A spreadsheet |
| Invoices and payments | A spreadsheet |
Quotes are not imported. A quote's number, its status history and the customer's acceptance cannot be recreated honestly from another system's records, so a quote still open when you move is re-sent from here.
Where to find it
An owner, or anyone who can add customers, team members, visits or invoices, opens web Settings → Import data, under Advanced › Developers & data. The page is also linked from the customer importer. Customers keep their own page, web Customers → Import customers, which is where to start: everything else names a customer, so the customers go in first.
The order that works: customers, then properties, then the team, then visits and schedules, then invoices. Every step can be repeated. Rows already on file are recognized and left alone.
From a spreadsheet
Any system that exports a CSV or an Excel file will do. Jobber's reports and exports are recognized by their column names and map themselves; a file from anywhere else maps most of the way, and you correct the rest.
- Drop the file or paste the rows straight from a spreadsheet.
- Check the columns. Each column in your file is matched to a field here. A guess the importer is unsure of is marked, and anything it could not place is set to "Do not import" until you choose. Dates like 3/4/2026 can be read month-first or day-first; say which.
- Review. The page shows how many rows are ready, how many it could not read and why, and runs a rehearsal against your account: how many rows would be new, how many are already on file, how many would fail. Nothing is saved yet.
- Import. Rows go in a batch at a time. When it is done, you get the counts, the rows that failed with their reasons, and a file of just those rows to correct and feed back in.
Cells are read the way a person would read them. "9:00 AM", "9am" and "09:00" are the same time; "$1,250.00" and "1250" the same amount; "2h", "1:30" and "90" are lengths of time; "Okafor, Dana" and "Dana Okafor" are the same person; "Mon, Wed" is two weekdays.
How a row finds its customer
Every row of properties, visits, schedules and invoices says whose record it is. It can do that with our own customer ID (from a customer export), an email, a phone number, or a name, and the importer tries them in that order of certainty. A name that matches two customers fails the row rather than guess; add an email or the ID to say which. Tick Add customers this file names that are not on file yet and a row naming nobody creates the customer with the name, email and phone the row carries, once, however many rows mention them.
What each kind of record needs
- Properties need the customer and a street address (or a name). A property is recognized on re-run by its customer and street line. Type and country are filled in when the file has no column for them, and never changed on a property that already exists.
- Team members need a name and an email. Each new member gets an account with a random password nobody knows; tick Email each new team member a link to choose their password and they get the same email the sign-in page's "forgot password" sends. Leave it off and use "reset password" from the team page when they are ready. Roles are manager, estimator, crew or read-only; blank means crew. A status column that says active or inactive (Jobber's team export has one) is read as whether they still work for you. Owners are never created or changed by an import. Seats count against your plan, as they would one at a time.
- Visits need the customer, a date and a start time (or one "starts at" cell). An end time, "ends at" or a duration sets the length; two hours is assumed otherwise. A visit in the past arrives completed unless the file says otherwise; one in the future arrives scheduled. Crew are matched by name or email among your active team; a name nobody matches leaves the visit unassigned and says so. The property is matched by address; with none, the visit is filed against the customer. A visit is recognized on re-run by its customer and start time.
- Recurring schedules need the customer, how often (weekly, every two weeks, every N weeks, monthly, one time), a start time and a first date, plus the weekdays or the day of the month. Each row is booked through the ordinary scheduling rules, so a crew conflict is reported the same way it would be at the desk. A start date in the past moves to the first visit from today; a schedule that has already ended is skipped.
- Invoices need the customer, a date and a total. The invoice keeps the number your old system gave it when that number is free here, so "invoice 1042" is still invoice 1042. What was paid (an amount paid, a balance, or a status) is recorded as a payment on the day the file says, so paid, partly paid and open balances carry over. A row marked void is written and voided.
Imported past visits are history, not bills: automatic invoicing leaves them alone, because what they were billed comes in with the invoices.
Example files
Each import opens on a table of three example rows under the column names the importer understands, with two buttons: Try it with these rows runs the examples through the columns and review steps so you can see what happens before touching your own data (nothing is saved until you press Import on the last step, and the examples name nobody on file), and Download the template gives you the same rows in a CSV with every column the importer knows, to replace with your own. Columns can be in any order, and only the ones you have are needed. A file that looks like one of these works as is:
Properties
| Customer name | Customer email | Address line 1 | City | Postal code | Property type |
|---|---|---|---|---|---|
| Dana Okafor | dana@example.com | 14 Rue Cler | Ottawa | K1A 0B1 | house |
| Maple Dental | 9 Elgin Street | Ottawa | K1P 5W6 | medical |
Team
| Full name | Phone | Role | Active | Hourly rate | |
|---|---|---|---|---|---|
| Sam Reyes | sam@example.com | (613) 555-0199 | crew | Active | 22.50 |
| Lee Park | lee@example.com | (613) 555-0142 | manager | Active | 28 |
Visits
| Customer name | Property address | Date | Start time | Duration | Assigned to | Status | Price |
|---|---|---|---|---|---|---|---|
| Dana Okafor | 14 Rue Cler | 2026-03-14 | 9:00 AM | 2h | Sam Reyes | completed | 180 |
| Maple Dental | 9 Elgin Street | 12/2/2026 | 6:00 PM | 90 | upcoming | 210 |
Recurring schedules
| Customer name | Property address | Frequency | Days of week | Start time | Starts on | Price per visit |
|---|---|---|---|---|---|---|
| Dana Okafor | 14 Rue Cler | biweekly | Tuesday | 9:00 | 2026-04-07 | 160 |
| Maple Dental | 9 Elgin Street | weekly | Mon, Wed, Fri | 6:00 PM | 2026-04-06 | 210 |
Invoices
| Customer name | Invoice number | Invoice date | Due date | Total | Amount paid | Status |
|---|---|---|---|---|---|---|
| Dana Okafor | 1042 | 2026-01-05 | 2026-02-04 | 180 | 180 | paid |
| Maple Dental | 1043 | 1/31/2026 | 3/2/2026 | 840 | 0 | unpaid |
A Jobber report has different column names ("Client Name", "Property Street 1", "Visit Title", "Permission Level") and the importer knows those too; drop the export as it comes.
From a calendar feed
Every scheduler publishes a calendar, the "subscribe in Google Calendar" link,
and for many it is the easiest export of the schedule to get. Paste that link
(it usually ends in .ics and starts with https:// or webcal://) or upload
an exported .ics file, and the events become visit rows: the title, where,
when and for how long, with a best guess at the customer from the event's
"Client:" line or a "… for Dana Okafor" title. From there it is the same
column check and review as a spreadsheet.
A year either side of today is read. Recurring events are expanded into their occurrences inside that window; the arrangement behind them is a schedule, and schedules come in through the spreadsheet importer.
Coming from Jobber
Jobber's own exports are the way across, and the importer knows their column names. In Jobber, Clients → More Actions → Export Clients gives the customer list; the Visits report and the Invoices report under Reports export to CSV; the team is a short list to type or paste. Drop each file on the matching import above. Attachments, photos, job notes, the message history with customers and quotes do not export as spreadsheets; save anything you need of those before closing the account.
Before you commit
Rehearse first, every time. Read the failures: most are a row that names a customer who is not on file yet, or two customers with the same name, and both have simple fixes. Import a small file before a large one. And keep the old system open for a week after the move: the import can be re-run, and a re-run only adds what is missing.