Skip to content
No per-contact pricing, ever

Manage Unlimited Contacts for Free

Every person you deal with, searchable in one box, with the fields your business actually uses rather than the ones a vendor decided on.

Unlimited contacts and unlimited users. MIT licensed, self-host it anywhere.

Find anyone in one box

Type a surname, a company, a partial phone number or a city. Then narrow it with filters when one box is not enough.

  • Search Name, email, phone, city, all at once A single box matches across the fields you would actually search by, plus dedicated filters for each one when you want to be precise about it.
  • Do not call A flag the record carries Set it once and it travels with the contact everywhere it appears, rather than living in a note somebody else will not read.
  • Accounts A contact can sit on more than one There is a primary account on the record and a separate many-to-many that lets one person belong to several. Both are real, and the list shows what the contact is actually attached to.
  • Saved views Your filters, back in one tap Filter the list, save it under a name, and open it again with one tap, on the web or the phone. A view saved on one opens on the other, and it is yours alone.
[ APP.BOTTLECRM.IO/CONTACTS ]
Moving in

An import you can undo by not committing it

The part of a CRM migration that goes wrong is the first bulk load. This one shows you the damage before it happens.

The spreadsheet you already have

An .xlsx or a .csv, straight out of Excel, Google Sheets, Google Contacts, Outlook or another CRM. There is no template to copy your data into first.

Columns matched for you

Each column is matched to a field from its header, with sample values beside it, and you can change or ignore any of them before anything is read.

Preview before anything is written

See how many people will come in and which rows will be skipped and why, from the Import button on the web or the phone. Nothing is saved until you import.

Duplicates checked on the way in

Incoming rows are compared against your existing contacts, and against each other, on email address, then phone number, then full name when a row has neither.

A bad value does not sink the row

A malformed email or date is dropped and counted, and the person still comes in. Importing the same file twice creates nobody new.

Skipped rows come back as a file

Download a CSV of the rows that were skipped, each with its reason, so you fix them in your spreadsheet rather than reading a log.

Moving from another CRM

What is not built yet

None of these stops you getting your list back out: the contact list exports to CSV, and the API and your own database give you everything else.

If any of these matter to you, the repository takes pull requests.

  • Dynamic segments
  • Auto-tagging and tag hierarchies
  • Scheduled or automated exports
  • Contact photos
  • An engagement or activity score
Questions

Before you move your list

Check it yourself

The contact model, the importer and the duplicate matcher are all in the open repository.

How many contacts can I store?

There is no limit in the software and no per-contact price. You are bounded by the database you run it on, which is Postgres, and by nothing else. Self-hosting means the capacity question is yours to answer.

Can I import contacts from another CRM?

Yes. Export a spreadsheet from whatever you are leaving, as .xlsx or .csv, and run the import from the web app or the phone. Each column is matched to a field from its header, and the headers of Google Contacts, Outlook and HubSpot exports are recognised. The preview shows who will come in and which rows will be skipped and why before anything is saved. Duplicates are checked against your existing contacts on email, phone and name. Up to 5,000 rows a file.

Can I get my contacts back out?

Yes. The Export button on the contact list, on the web or the phone, downloads a CSV of the list as you have it filtered, every page of it, and only the contacts you are allowed to see. A cell that starts like a spreadsheet formula is written as plain text, so a value somebody typed into a form cannot run when the file is opened. The REST API and, if you self-host, your own Postgres database are there for anything the list does not show.

What can I add beyond the built-in fields?

Custom fields per organisation, in text, number, date, dropdown and checkbox types. They render in the web and mobile forms, they filter in the list, and they come back through the API. The built-in set already covers job title, department, company, address, LinkedIn, a do-not-call flag and free-text notes.

Your contacts, on your own database

No per-contact fee, no seat count, no trial clock. Host it yourself, or let RunCode run it.

MIT licensed Unlimited contacts 100% data ownership