---
title: "Importing your data · BlastoClean docs"
description: "Bring your records over from Jobber or any other system: a spreadsheet for properties, team, visits, schedules and invoices, or a calendar feed for the schedule. What each one needs, what it does with duplicates, and what to check before you commit."
url: "https://www.blastoclean.com/docs/importing-your-data"
---

# Importing your data

Running the company · Web app · 8 min read · Updated November 9, 2026

**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.

1. **Drop the file** or paste the rows straight from a spreadsheet.
2. **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.
3. **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.
4. **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 | Email           | 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.
