Skip to content

How syncing works

Your contacts are the users in your own database. Rowsend connects with a login that can only read, copies your users to your computer, and keeps that copy up to date. It never writes to your database.

There’s no CSV import and no way to add a contact by hand. That’s on purpose:

  • Every contact signed up for your product, so bought or scraped lists can’t hurt your sending reputation.
  • The copy on your computer can always be rebuilt from your database. Losing a computer loses no contacts.
  • Each teammate’s computer syncs its own copy, so contact data never passes through Rowsend Cloud.

To email someone, add them to your database.

On SQL databases (Postgres, MySQL, MariaDB), Rowsend reads a view that you create with the setup SQL it gives you. The view must return three columns:

Column What it is
id Your user’s id. Numbers and text both work.
email Their email address
updated_at When the row last changed. Each sync reads rows changed since the last one.

These columns are optional and have their own place in Rowsend: name, created_at (signed up), last_sign_in_at and email_confirmed_at. Any other column becomes a custom field you can filter on and put in emails.

You don’t have to write the view yourself. The connect dialog lists your tables and columns so you can pick them, including a second table to join, such as a profiles table. It writes the SQL for you.

MongoDB and Firebase have no views. You pick the fields in Rowsend instead. See MongoDB and Firebase.

Rowsend reads with a login that can’t change anything:

  • On Supabase, Postgres, MySQL and MariaDB, the setup SQL creates a login called rowsend_reader. The SQL contains only a hash of its password, never the password, so it’s safe to paste into an SQL editor or hand to a teammate.
  • On Neon, PlanetScale and MongoDB, you create a read-only login yourself and paste its connection string. Before connecting, Rowsend checks that the login can’t write, and refuses one that can.

Rowsend stores the login on your computer, encrypted with your system keychain.

Rowsend syncs every connected project when it starts, then on a schedule, every 15 minutes by default. Sync now on the Contacts page syncs straight away.

  • To change the schedule for every project, open Settings → Companion → Contact sync.
  • To give one project its own schedule, or turn its syncing off, open Project settings → Database → Sync this project.

Choices run from every 5 minutes to once a day.

Rowsend has to be running to sync. Contacts deleted from your database disappear from Rowsend at the next sync.

Project settings → Database also shows the last 20 syncs, with how many contacts each one added or updated and removed, and any error.

Project settings, Database: the connected Postgres host, 240 contacts, the extra fields being synced, the sync schedule and recent syncs

Unsubscribes, bounces and spam complaints live in Rowsend, not in your database, so a sync never undoes them. They’re kept by your user’s id: a contact who’s deleted from your database and later comes back with the same id is still unsubscribed.

Someone can unsubscribe from everything, or only from one topic, such as product updates. The Subscription column on the Contacts page shows where each contact stands. Click a contact to unsubscribe or resubscribe them yourself, from everything or one topic at a time.

To add or remove a field, open Project settings → Database and click Edit view (or Edit fields for MongoDB and Firebase). On SQL databases you run the updated SQL yourself, the same way as when you connected. Rowsend keeps the same login and resyncs every contact. You don’t need to disconnect.

Disconnect in Project settings → Database deletes Rowsend’s copy of your contacts from this computer and forgets the login. Nothing in your database changes. To remove the login too, delete it in your database: drop role rowsend_reader; on Postgres, or drop user 'rowsend_reader'@'%'; on MySQL and MariaDB.