GuidesBusiness and monitoringInstead of Zendesk/Freshdesk

Self-hosted alternatives to Zendesk and Freshdesk: Zammad and FreeScout compared

Zammad and FreeScout on one Debian 13 server, each fed the same 40 support emails in Swedish with attachments, with three agents in two groups, notes, canned answers, SLAs and a customer replying by email, compared on memory, search in Swedish, permissions, automation, GDPR deletion and cost, next to what Zendesk and Freshdesk offer.

Tested on Zammad 7.2.2 and FreeScout 1.8.247 on Debian 13 (trixie) on a Melonslab server Updated October 14, 2026

Recommended server for this guide

SSD RAID 1 · ECC DDR4 · 10 Gbit

VC-P Alloy · 2 vCPU · 8 GB Memory · 60 GB Storage

Month to month, no lock-in 7-day money-back guarantee

€8.99/mo

Deploy now
On this page

The short answer

Pick FreeScout for a small team that answers email from one or a few shared addresses and wants it light: it ran in under 200 MB, threads email well and has a Swedish interface, but in the free version it has no canned answers, no automation, no knowledge base, no reports and no API, each a paid module from 2 to 20 US dollars once per server, and no SLAs at all. Pick Zammad for a larger team that needs groups, SLAs, triggers, macros, a knowledge base, a web form, reports, an API with webhooks and a proper GDPR deletion, all free: it does everything on this page without paying, but it needed about 2.4 GB of memory at rest, most of it for Elasticsearch.

What we tested

We installed both on the same fresh Melonslab VC-P Alloy (2 vCPU, 8 GB) with Debian 13, side by side, each under a user of its own, behind the same Caddy. Zammad followed our guide Zammad with rootless Podman step by step. We have no guide for FreeScout, so we ran it the same way: a pod under its own user, Quadlet units, passwords as Podman secrets and our Caddy in front (How we ran FreeScout has the files). Both fitted on the server at once, with about 4 GB to spare.

Mail never left the server. A test mail server on the same machine, GreenMail, played both the support mailbox, which each helpdesk read over IMAP, and the customers' mailboxes. Then we gave both the same work:

  • 40 emails from 20 customers, 38 in Swedish and 2 in English, such as "Fel på fakturan för september", "Glömt lösenordet" and "Fråga om räksmörgås på menyn", 15 of them with a PDF, a PNG or a text file attached, and later 40 more;
  • three agents in two groups: Bertil in Support, Cecilia in Fakturering and David in both, and Anna as admin;
  • an invoice ticket assigned to Cecilia, with an internal note, an answer by email, and the customer's reply to that answer;
  • canned answers, macros, SLAs and a rule that sends invoice emails to Fakturering, where the app has them;
  • the same 23 searches, a knowledge base, a web form and reports where built in, the interface in Swedish, and deleting a customer with her tickets.

We rebooted the server, measured memory at rest and while both took in mail and answered searches, and ran a backup and restore.

Zendesk and Freshdesk themselves were not tested. We did not sign up for either. What this page says about them comes from their own pricing and help pages, linked where we use them and read on 14 October 2026.

The numbers

Zammad 7.2.2FreeScout 1.8.247
Containers8, and a setup job: Zammad ×4, PostgreSQL 17, Redis 8, Memcached, Elasticsearch 9.52: FreeScout, MariaDB 12.3
Memory at rest after a reboot2.43 GB (Elasticsearch 1.46 GB)168 MB (MariaDB 129)
Memory at the peak of use3.04 GB177 MB
Images on disk3.05 GB0.91 GB
Data after the test215 MB166 MB
From useradd to the login page6 minutes2 minutes 36 seconds
Groups and permissionsgroups, roles, per-group accessaccess per mailbox; teams are a paid module
Canned answers, macros, triggersyespaid modules
SLAsyesno; Office Hours and Workflows are paid modules
Knowledge base, web form, reportsyespaid modules
API and webhooksyespaid module
Import from Zendesk or Freshdeskbuilt in, beta, needs the live accountnone; a paid migration service through the paid API module
Delete a customer and her ticketsone action, loggedtickets only; the customer stays
LicenceAGPL 3.0AGPL 3.0, modules sold separately

Memory is the sum of each app's containers, measured with podman stats four and a half minutes after a reboot, with each app opened once. The peak is the highest reading while each took in the second batch of 40 emails and answered our searches. Times are how long the commands took to run, mostly downloading images: Zammad's are about 3 GB. Most of the data is the empty databases themselves; our 80 emails with attachments take a few megabytes.

Setup

Zammad's guide has eight containers and a setup job that creates the database and the search index, which took about five minutes on the first start. The first visitor creates the admin account, so the guide does it over an SSH tunnel before Zammad goes online. The mailbox is then a form under Channels > Email, where Zammad sends itself a test email and waits for it before it saves.

FreeScout is two containers. The image creates the database and the first admin from its settings on the first start, which took about a minute, so there is no setup page to protect. The mailbox is set up per mailbox under Connection Settings, with buttons that check IMAP and send a test email.

One thing to know: FreeScout refuses mail servers on private or local addresses, to keep the app from being used to probe your network. Our test mail server ran on the same machine, and saving the settings failed with "Domain or IP address is not allowed: 169.254.1.2. Whitelist it via APP_REMOTE_HOST_WHITE_LIST .env parameter." With your email provider's servers, that does not come up.

Email in, email out

Both did the basic job well. Every one of the 40 emails became a ticket within about a minute, with its attachments, and Swedish letters in subjects, text and file names, such as kvitto-åäö-4.txt, came through intact. Cecilia's answer reached the customer's mailbox, and when the customer answered it, the reply landed in the same ticket in both.

  • Zammad puts the ticket number in the subject, as in "Fel på fakturan för september Ticket#22002", and signs answers as "Cecilia Agent via Exempel Support". Its default trigger sends the customer an automatic reply for each new ticket.
  • FreeScout keeps the subject as the customer wrote it, with "Re:", and sends from the mailbox's name. Automatic replies are off until you write one under Auto Reply.

A moved ticket changes sender in FreeScout: our invoice ticket, moved to the Fakturering mailbox, was answered from faktura@, and the customer's reply came back there and still found the ticket.

Day-to-day work

Assignment and internal notes are in both, and worked as expected: Cecilia owned the invoice ticket, and the internal note never reached the customer, who got only the answer. The rest differs.

  • Canned answers. Zammad has text modules: typing ::tack in an answer listed ours, and Enter filled in "Hej Björn! Tack för ditt mejl..." with the customer's first name. In FreeScout, saved replies are the Saved Replies module, 4.99 US dollars.
  • Macros. Zammad's macro button applied ours in one click: the ticket was closed and tagged löst. FreeScout has nothing like it in the free version.
  • Merging and moving. Both have Merge on a ticket, which we did not try. FreeScout moves a ticket to another mailbox, as we did; Zammad changes its group.

Groups and permissions

Zammad has groups, roles and per-group access, either full or only parts, such as read or create. Bertil, in Support only, got 403 when he opened an invoice ticket in Fakturering, and his searches did not show those tickets. Admin is a role, not a key to everything: Anna saw no Fakturering tickets until we gave her access to that group.

FreeScout has no groups. Agents get access per mailbox, so we made two: Support, which read the support address, and Fakturering with its own address. Bertil got "Access denied" on a ticket in Fakturering, and his searches left it out. Grouping agents into teams that tickets can be assigned to is the Teams module, 11 US dollars.

SLAs and automation

Zammad has triggers, schedulers, SLAs and calendars in the free version:

  • Our trigger "ticket title contains faktura" moved the 7 matching tickets to Fakturering and tagged them as they came in. "Fakturor till fel e-postadress" stayed in Support, since "Fakturor" does not contain "faktura".
  • Our SLA, a first answer within 4 hours on a business-hours calendar, showed "escalation in 6 hours" on open tickets right away.
  • A trigger called our webhook on every ticket update, with the whole ticket as JSON.

Check the calendar SLAs use: Zammad created ours as "France", in Paris time, and we changed it to Swedish time under Manage > Calendars.

FreeScout has none of this in the free version. Rules that route, tag or answer tickets are the Workflows module (14.99 US dollars), opening hours Office Hours (2 dollars) and reminders Snooze (5). There is no SLA module in FreeScout's list. Without Workflows, we moved the 7 invoice tickets to Fakturering by hand.

Search, in Swedish

We ran the same searches in both, after the first 40 emails. Both found words in subjects and text, ignored å, ä and ö when we left them out, and kept agents' results to what they may see. Neither understood Swedish word forms: faktura did not find "Fakturor" in either.

SearchZammadFreeScout
faktura, fakturan, fakturor7, 5, 17, 5, 1
lösenord, losenord, lösenordet3, 3, 23, 3, 2
räksmörgås, raksmorgas4, 41, 1
återbetalning, aterbetalning4, 42, 2
kvitto103
Växjö, vaxjo, HÖST251, 1, 11, 1, 1
A number inside an attached PDF, and inside a text file1, 10, 0
betalning, smörgås1, 04, 1

Two real differences:

  • Attachments. Zammad searched inside our PDFs and text files; that is where its extra hits for kvitto, räksmörgås and återbetalning came from. FreeScout did not look inside attachments.
  • Compound words. Zammad matches the start of words, so betalning did not find "återbetalning" or "Delbetalning", and smörgås did not find "räksmörgås". FreeScout looks for the letters anywhere, which suits Swedish compounds, and found both.

FreeScout's search reads the database directly; the Faster Search module, 20 US dollars, is for large helpdesks.

Knowledge base, web form and reports

Zammad has all three. We created a knowledge base in Swedish under Manage > Knowledge Base, with a category and an answer about invoices, and it was public at /help/sv-se as "Exempel AB Kunskapsbank". Its web form, switched on under Channels > Form, is a script you put on your own site; a submission became ticket 22042, with a hidden honeypot field against spam and an optional CAPTCHA. Reports showed 42 tickets created and 1 closed this month, and can be downloaded. Customers can also log in to see and open their tickets, as its guide describes.

FreeScout has none of these in the free version: Knowledge Base (12 US dollars), End-User Portal with a contact form and a customer login (12.99), Reports (14.99) and Satisfaction Ratings (8.99) are modules.

API, webhooks and imports

Zammad has a REST API for everything we did here, with a token or a password, and webhooks under Manage > Webhook. We set up most of the test through the API. Webhooks refuse link-local addresses, but accept others on the same server.

FreeScout has no API in the free version. API & Webhooks is a module, 12.99 US dollars.

Imports. Zammad's first page offers Or migrate from another system: Freshdesk, Kayako, OTRS and Zendesk, each marked "Beta". The Zendesk import asks for the URL of your Zendesk, the Freshdesk import for your subdomain on freshdesk.com, and both then use the service's API. We could not run them without a real Zendesk or Freshdesk account, so we did not test the importers. FreeScout has no importer. Its migration page points to Help Desk Migration, a paid outside service, which needs the paid API & Webhooks module.

Swedish

Both come in Swedish, chosen per user.

  • Zammad: Svenska under the avatar > Profile > Language, or as the default under Settings > Branding > Locale. Its database had 4,304 of 5,101 texts translated, against 4,915 for German, so a few English labels remain, such as "Related tickets".
  • FreeScout: Svenska under Your Profile. To make it the default, add Environment=FREESCOUT_APP_LOCALE=sv to its unit file and restart it; the login page then showed in Swedish. Its Swedish file has 807 texts, against 833 for German. Bertil saw "Brevlåda", "Ej tilldelad" and "Stängd", and also a few rough ones, such as "27 minr sedan".

Paid modules translate on their own terms; we did not buy any.

GDPR: deleting a customer

A customer, Märta, asked us to delete her data. She had two tickets.

  • Zammad has this built in, under System > Data Privacy; we used the same action through its API. It deleted Märta, both tickets and their articles in the background, and kept a log with her name masked as "Ma Nm". Searching for her name or address found nothing afterwards.
  • FreeScout deletes tickets, not people. We deleted her two tickets and emptied Deleted in both mailboxes, and they were gone, with their attachments, but Märta's name and email address stayed in the customer list. Deleting customers is part of the Customers Management (CRM) module (10.99 US dollars), and FreeScout also sells a GDPR module (5 dollars). We did not test either.

Resources

FreeScout is a PHP app. At rest it used 168 MB, 129 MB of it MariaDB, and it barely moved while it took in 40 emails and answered searches: 177 MB at the peak.

Zammad is a Ruby on Rails app with four processes of its own, and Elasticsearch for search and reports. At rest it used 2.43 GB, of which Elasticsearch 1.46 GB, and at the peak 3.04 GB, when its background worker grew from 314 to 683 MB while it took in mail. That fits on 8 GB with other apps next to it. Zammad can run without Elasticsearch, as its guide's Troubleshooting shows, in about 800 MB, but its reports need it, and you lose the search inside attachments.

Updates and backups

Zammad's guide follows the 7.2 tag, so patch releases install by themselves with podman auto-update, and the setup job updates the database before Zammad starts. Zammad comes from Zammad GmbH's own image. Its backup is a database dump: 45 MB in our test, since the attachments and every translation are in the database.

FreeScout publishes no image of its own. Its installation guide's "Docker Image" link leads to nfrastack/freescout, made by Nfrastack, which took over from the well-known tiredofit/freescout. It is updated within days of each FreeScout release: its version 2.2.18, with FreeScout 1.8.247, came out on 10 October 2026, the day FreeScout released it. Its README calls updates "best-effort". FreeScout itself releases often, about every week or two, and the image updates FreeScout's files and database when it starts with a new version. We did not test an update between versions. Its backup is a database dump and the freescout-data volume, which holds the attachments, the settings and FreeScout's application key: 166 KB and 773 KB in our test. We restored both into empty volumes, and the tickets, attachments and logins came back.

Both came back by themselves after a reboot.

Licence and cost

We read the licence texts, the module list and the pricing pages on 14 October 2026.

  • Zammad is open source under the AGPL 3.0, developed by Zammad GmbH in Berlin; the code belongs to the Zammad Foundation. Everything on this page is free. Zammad GmbH sells hosted Zammad in German data centres at 7, 16 or 25 euros per agent a month billed yearly (Starter up to 5 agents, Professional up to 35, Plus unlimited), and support for your own installation at 2,999, 5,999 or 9,999 euros a year, according to its pricing page.
  • FreeScout is open source under the AGPL 3.0. The core is free; its module list sells 71 modules as "Lifetime licenses for a single FreeScout instance (lifetime updates included)", non-refundable. What this test needed: Saved Replies 4.99, Workflows 14.99, Teams 11.00, Knowledge Base 12.00, End-User Portal 12.99, Reports 14.99, API & Webhooks 12.99, Customers Management (CRM) 10.99, Office Hours 2.00 and Satisfaction Ratings 8.99 US dollars, about 106 dollars in all, once per server. LDAP is 17.99, SAML 10.00 and two-factor logins 5.99. All 71 together came to about 540 dollars.

For a company running its own support, both licences allow it at no cost, and on your own server the tickets stay in Sweden.

Zendesk and Freshdesk today

What follows is from Zendesk's and Freshworks' own pages, read on 14 October 2026, not from our tests. Prices are in US dollars per agent a month.

Zendesk, according to its pricing page: Support Team at 19 dollars billed yearly (25 monthly), Suite Team at 55 (69), Suite Professional at 115 (149), and Suite Enterprise at a price you ask for. Macros and triggers are in every plan; SLAs start at Suite Professional, and so does more than one help centre language. Zendesk can keep the data in the EEA with its Data Center Location feature, which is "available and free of charge for Zendesk Suite Professional or higher plans" but "not automatically activated", according to its help centre; you ask Zendesk to switch it on.

Freshdesk, according to its pricing page: Growth at 19 dollars, Pro at 55 and Enterprise at 89, billed yearly, with a 14-day trial; the page listed no free plan when we read it. Automations, a knowledge base and reports are in every plan; several SLA policies and custom dashboards start at Pro. Freshdesk has data centres in the US, the EEA, the UAE, India and Australia, and "You can choose your preferred data location when you sign up for your account", according to its help article; moving later goes through its support.

What you give up compared with Zendesk and Freshdesk

Moving to your own server keeps the tickets in Sweden, and the cost is a server instead of a price per agent: for five agents, Zendesk Suite Professional is 575 dollars a month, billed yearly. But be honest about what you leave behind:

  • Channels and AI. Zendesk and Freshdesk build chat, messaging and AI agents into their plans. Zammad has a chat, SMS, Telegram, WhatsApp and Facebook under Channels, which we did not test; FreeScout sells chat, WhatsApp, Telegram and SMS as modules.
  • The migration. Zammad's importers are marked beta and need your live account, and FreeScout has no importer. Plan time for it, and keep the old account until you have checked the result.
  • Marketplace. Both services have large app stores and ready-made integrations. Here, integrations are the API, webhooks and what you build.
  • Running it. Updates, backups, the server and the mail delivery are yours. Our guide makes Zammad a few commands, but someone has to own it.
  • Search. Neither understood Swedish word forms in our test.

How we ran FreeScout

FreeScout's installation guide describes a manual install with PHP and a web server, and links to nfrastack/freescout as its Docker image. We used that image, with MariaDB as in the MariaDB guide: version 12.3, the image's health check and MARIADB_AUTO_UPGRADE, in its own container in the pod. Two things to know about the image:

  • It writes FreeScout's settings, including the database password and the application key, to a file in the freescout-data volume. The secrets stay out of the unit files, but the volume and its backups must be kept safe.
  • Every variable that starts with FREESCOUT_ goes into FreeScout's settings without the prefix, so FREESCOUT_APP_LOCALE=sv sets APP_LOCALE=sv.

As root, create the user as in step 1 of the Zammad guide, with freescout instead of zammad. As freescout, create the secrets:

openssl rand -hex 24 | tr -d '\n' | podman secret create freescout-db-password -
printf %s "$(openssl rand -base64 18)" | podman secret create freescout-admin-password -

~/.config/containers/systemd/freescout.pod:

[Pod]
PodName=freescout
# Only Caddy, on this server, can reach FreeScout: the port is not open to the internet.
PublishPort=127.0.0.1:8124:80

[Install]
WantedBy=default.target

freescout-db.container:

[Container]
ContainerName=freescout-db
Image=docker.io/library/mariadb:12.3
Pod=freescout.pod
Volume=freescout-db:/var/lib/mysql
Environment=MARIADB_DATABASE=freescout MARIADB_USER=freescout MARIADB_RANDOM_ROOT_PASSWORD=1 MARIADB_AUTO_UPGRADE=1
Secret=freescout-db-password,type=env,target=MARIADB_PASSWORD
HealthCmd=healthcheck.sh --connect --innodb_initialized
HealthInterval=10s
Notify=healthy
AutoUpdate=registry

[Service]
Restart=always

freescout-app.container, with your own address, server IP and admin email:

[Unit]
Requires=freescout-db.service
After=freescout-db.service

[Container]
ContainerName=freescout-app
Image=docker.io/nfrastack/freescout:latest
Pod=freescout.pod
Volume=freescout-data:/data
Volume=freescout-logs:/logs
Environment=APP_URL=https://help.example.com
Environment=FREESCOUT_APP_TRUSTED_PROXIES=203.0.113.10
Environment=TIMEZONE=Europe/Stockholm FREESCOUT_APP_TIMEZONE=Europe/Stockholm
Environment=DB_TYPE=mariadb DB_HOST=127.0.0.1 DB_PORT=3306 DB_NAME=freescout DB_USER=freescout
Environment=ADMIN_EMAIL=you@example.com ADMIN_FIRST_NAME=Your ADMIN_LAST_NAME=Name
Secret=freescout-db-password,type=env,target=DB_PASS
Secret=freescout-admin-password,type=env,target=ADMIN_PASS
AutoUpdate=registry

[Service]
Restart=always
TimeoutStartSec=10min

Start it, and read the admin password:

systemctl --user daemon-reload
systemctl --user start freescout-pod
systemctl --user enable --now podman-auto-update.timer
podman secret inspect --showsecret --format '{{.SecretData}}' freescout-admin-password; echo

Add help.example.com to Caddy as in step 5 of the Zammad guide, with reverse_proxy 127.0.0.1:8124, and log in. The admin account is only created on an empty database, so if you ever change the secret, change the password in FreeScout too. FREESCOUT_APP_TRUSTED_PROXIES lets FreeScout log each visitor's real address, which it did in our test. FreeScout fetches mail every minute, through the scheduler inside the container.

Mail for FreeScout's own messages to agents, such as invites and password resets, is set under Manage > Settings > Mail Settings; we did not test it. To back up, as freescout:

umask 077
mkdir -p ~/backup
podman exec freescout-db sh -c 'mariadb-dump -ufreescout -p"$MARIADB_PASSWORD" --single-transaction freescout' > ~/backup/freescout-db.sql
podman volume export freescout-data > ~/backup/freescout-data.tar

And to restore into an empty pod:

systemctl --user stop freescout-pod
podman volume rm freescout-db freescout-data
podman volume create freescout-data
podman volume import freescout-data ~/backup/freescout-data.tar
systemctl --user start freescout-db
podman exec -i freescout-db sh -c 'mariadb -ufreescout -p"$MARIADB_PASSWORD" freescout' < ~/backup/freescout-db.sql
systemctl --user start freescout-pod

latest follows the newest build of the image. To update by hand instead, use a version tag from its changelog, such as 2.2.18, and remove AutoUpdate=registry.

Which one to pick

A small team on a small server: FreeScout. Two or three people answering email from a shared address get a fast, light helpdesk with assignment, internal notes, threading that works and a Swedish interface, in under 200 MB, next to other apps on a VC-P Alloy. Its weak points: canned answers, automation, teams, a knowledge base, reports and an API all cost extra, there are no SLAs at all, deleting a customer's data needs a module, search skips attachments, and the image comes from Nfrastack rather than FreeScout, maintained on a best-effort basis. Buy the modules you need once, about 5 to 15 dollars each, and they stay yours. Follow How we ran FreeScout above.

A larger team that needs SLAs and reporting: Zammad. Several groups, rules that route and tag tickets, SLAs on business hours, macros, text modules, a public knowledge base, a web form, reports, an API with webhooks, customer logins and a GDPR deletion are all in the free version, and its search looks inside attachments. Its weak points: about 2.4 GB of memory at rest and 3 GB of images, eight containers to look after, a 45 MB database dump, importers still marked beta, word-start search that misses Swedish compounds, and an admin who sees no tickets in groups she is not in. Follow the Zammad guide, on a VC-P Alloy.

Both together used under 3.3 GB at their peaks, so one VC-P Alloy runs either, or both, as on our test server.

Run it on your own server

SSD RAID 1 · ECC DDR4 · 10 Gbit

VC-P Alloy

€8.99/mo

vCPU
2
Memory
8 GB
Storage
60 GB
Transfer
10 TB
Performance
SSD · RAID 1
  • Full root access
  • Native /64 IPv6
  • RAID-protected storage
  • Malmö, Sweden
  • Month to month, no lock-in
  • 7-day money-back guarantee
All guides