Skip to content

Migrate from listmonk

How-to guide
For:
Publishers and marketers, Workspace admins
Needs permission:
subscribers:import
In the app:
Import contacts

To migrate from listmonk, you give ReputeCast your listmonk server’s address and an API user, then import each listmonk list into a ReputeCast list with its subscribers’ attributes and statuses. ReputeCast only reads from the listmonk API; nothing changes on your listmonk server.

  • You need the subscribers:import permission (Owner, Admin and Editor have it).
  • Create an API user in listmonk 4.0 or later under Admin › Users. API users get a generated token instead of a password. Give the user a role that can read every list and every subscriber (lists:get_all and subscribers:get_all). Sources: listmonk, User roles and permissions and listmonk API introduction (checked October 2026).
  • ReputeCast must reach the listmonk server over HTTP or HTTPS. A server on a private or internal network (for example 10.0.0.5 or a .internal name that resolves to one) is refused unless the instance turns on providers.allow_private_networks (see the configuration reference).
  • Read how a migration carries consent if this is your first import.
  1. Open Import contacts and choose listmonk.

  2. In Server address, enter the address you open listmonk at, such as https://lists.example.com, without credentials, a query string or a fragment; ReputeCast adds /api itself. Enter the API user’s name in API user and its token in API token, then select Connect.

    The wizard lists every listmonk list with its subscribed, unsubscribed and pending counts.

  3. Tick the lists to import and pick the ReputeCast list each one goes into. Keep pulling suppressions from your sending providers on, then continue to field mapping.

  4. Map the fields. email is required; name goes into first and last name, and each attribute becomes a field named after its key.

  5. On the consent step, check what each status becomes (see the next section).

  6. Run the preview and start the import.

  • Lists become the ReputeCast lists you chose.
  • Name is split into first and last name.
  • Attributes (attribs) become contact fields. The wizard offers the attribute keys it finds on the first 100 subscribers of each chosen list; a key that only appears on later subscribers isn’t offered.
  • Dates: the subscriber’s creation date becomes the contact’s creation date. listmonk has no opt-in IP, so none is stored.
listmonk status Becomes in ReputeCast
confirmed on the list Subscribed · confirmed (or pending, or Skip)
unconfirmed on a single opt-in list Subscribed · confirmed (or pending, or Skip)
unconfirmed on a double opt-in list Subscribed · pending, with a re-permission email (or Skip)
unsubscribed from the list Suppressed · unsubscribed: no Broadcasts or Automations, System mail allowed (locked)
Subscriber blocklisted in listmonk Suppressed · unsubscribed (locked)

A suppression belongs to the address: a subscriber unsubscribed from one listmonk list gets no Broadcasts or Automations on any ReputeCast list.

listmonk has no separate status for bounced addresses, so an address it blocklisted after bounces arrives as an unsubscribe, which still allows System mail. To block such addresses on every stream, add them with Add address on the suppression list after the import: addresses added there get no mail on any stream.

Campaigns and their statistics, templates, bounce records, media and settings are not imported. Rebuild templates in the composer.

listmonk runs on your own server, so how fast it answers depends on that server. ReputeCast reads 1,000 subscribers per request, one request at a time, and backs off when the server answers 429 or a 5xx error:

SettingDefaultHow to change
Largest CSV or XLSX file100 MB and 500,000 rows (XLSX reads the first sheet)Fixed
Source API rate limit (429)Up to 5 retries, each after the source's Retry-After (2 s when absent, at most 60 s); then the import pauses and resumes by itself after 1 minuteResume now, or Slow down to 3 req/s on the paused import
Source server or network errorsUp to 5 retries, after 1, 2, 4, 8 and 16 sFixed
  • The summary shows how many contacts were imported, merged, suppressed, left pending and skipped, and how many each list now has. Download full report · CSV lists every row with what happened to it.
  • Open Audience, then Suppression list and check that unsubscribed and blocklisted addresses are there.
  • “Use the full address, like https://lists.example.com.”: the address has no http:// or https://.
  • “Use only the server’s address … no credentials, query or fragment.”: remove user:password@, ?… or #… from the address.
  • “That address is on a private or internal network.”: the server resolves to a private, loopback, link-local or metadata address. Use its public address, or have the operator turn on providers.allow_private_networks. The check runs again on every connection, so a public name that later resolves to a private address is refused too.
  • “listmonk redirects to another address (301). Enter the address it answers at.”: ReputeCast doesn’t follow redirects. Enter the final address, often the https:// one.
  • “listmonk rejected the API key”: the API user or token is wrong, or the user’s role can’t read lists and subscribers.
  • “Couldn’t reach listmonk: …”: ReputeCast can’t open a connection to the server. Check DNS, the firewall and the TLS certificate.