Listmonk Exporter
A Prometheus exporter for Listmonk, the self-hosted newsletter and mailing list manager. Monitor your email campaigns, subscriber counts, bounce rates, and more with this lightweight exporter.
Features
- 📊 Subscriber Metrics: Track subscriber counts by status (confirmed, unconfirmed, unsubscribed)
- 📧 Campaign Statistics: Monitor sent, opened, clicked, and bounced emails per campaign
- 📋 List Metrics: View subscriber counts across all your lists
- 🔄 Bounce Tracking: Track bounce counts by type (hard, soft, complaint)
- ⚡ Lightweight: Built with Python and runs as a single process
- 🐳 Docker Ready: Includes official Docker image for easy deployment
- 🔧 Configurable: Flexible configuration via environment variables or CLI arguments
Installation
Via pip
pip install listmonk-exporter
Via Docker
docker pull ghcr.io/meysam81/listmonk-exporter:latest
Configuration
Configure the exporter using environment variables or command-line arguments.
Required Configuration
| Environment Variable | Description | Example |
|---|---|---|
LISTMONK_HOST |
Listmonk instance URL | https://listmonk.example.com |
LISTMONK_API_USER |
Listmonk API username | admin |
LISTMONK_API_TOKEN |
Listmonk API token | your-api-token |
LIST_ID |
List ID to monitor | 1 |
LIST_NAME |
Name of the list | Newsletter |
Optional Configuration
| Environment Variable | Default | Description |
|---|---|---|
SCRAPE_INTERVAL |
60 |
Scrape interval in seconds |
PORT |
8000 |
Port for Prometheus HTTP server |
LOG_LEVEL |
INFO |
Logging level (DEBUG, INFO, WARNING, ERROR) |
Usage
Quick Start with pip
# Set required environment variables
export LISTMONK_HOST=https://listmonk.example.com
export LISTMONK_API_USER=admin
export LISTMONK_API_TOKEN=your-api-token
export LIST_ID=1
export LIST_NAME="Newsletter"
# Run the exporter
listmonk-exporter
Docker Compose
version: "3.8"
services:
listmonk-exporter:
image: ghcr.io/meysam81/listmonk-exporter:latest
ports:
- "8000:8000"
environment:
LISTMONK_HOST: https://listmonk.example.com
LISTMONK_API_USER: admin
LISTMONK_API_TOKEN: your-api-token
LIST_ID: 1
LIST_NAME: Newsletter
SCRAPE_INTERVAL: 60
LOG_LEVEL: INFO
restart: unless-stopped
Docker Run
docker run -d \
-p 8000:8000 \
-e LISTMONK_HOST=https://listmonk.example.com \
-e LISTMONK_API_USER=admin \
-e LISTMONK_API_TOKEN=your-api-token \
-e LIST_ID=1 \
-e LIST_NAME=Newsletter \
ghcr.io/meysam81/listmonk-exporter:latest
Kubernetes
apiVersion: apps/v1
kind: Deployment
metadata:
name: listmonk-exporter
spec:
replicas: 1
selector:
matchLabels:
app: listmonk-exporter
template:
metadata:
labels:
app: listmonk-exporter
spec:
containers:
- name: listmonk-exporter
image: ghcr.io/meysam81/listmonk-exporter:latest
ports:
- containerPort: 8000
env:
- name: LISTMONK_HOST
value: "https://listmonk.example.com"
- name: LISTMONK_API_USER
valueFrom:
secretKeyRef:
name: listmonk-credentials
key: username
- name: LISTMONK_API_TOKEN
valueFrom:
secretKeyRef:
name: listmonk-credentials
key: token
- name: LIST_ID
value: "1"
- name: LIST_NAME
value: "Newsletter"
---
apiVersion: v1
kind: Service
metadata:
name: listmonk-exporter
spec:
selector:
app: listmonk-exporter
ports:
- port: 8000
targetPort: 8000
Exported Metrics
The exporter provides the following Prometheus metrics:
| Metric Name | Type | Description | Labels |
|---|---|---|---|
listmonk_subscribers_by_status |
Gauge | Number of subscribers by subscription status | list_name, subscription_status |
listmonk_subscribers_total |
Gauge | Total number of subscribers in the list | list_name |
listmonk_campaign_stats |
Gauge | Campaign statistics (sent, opened, clicked, bounced) | campaign_id, campaign_name, campaign_status, stat_type |
listmonk_list_subscribers |
Gauge | Total subscribers per list | list_id, list_name, list_type |
listmonk_bounces_total |
Gauge | Total number of bounces by type | bounce_type |
listmonk_scrape_duration_seconds |
Histogram | Duration of scrape operations | operation |
listmonk_scrape_success |
Gauge | Whether the last scrape was successful (1=success, 0=failure) | operation |
listmonk_scrape_errors_total |
Counter | Total number of scrape errors | operation |
Metric Details
Subscriber Metrics:
subscription_statusvalues:confirmed,unconfirmed,unsubscribed
Campaign Metrics:
stat_typevalues:sent,opened,clicked,bouncedcampaign_statusvalues:draft,scheduled,running,paused,finished,cancelled
Bounce Metrics:
bounce_typevalues:hard,soft,complaint
Exporter Metrics:
operationvalues:subscribers,campaigns,lists,bounces
Prometheus Configuration
Add the following to your prometheus.yml:
scrape_configs:
- job_name: "listmonk"
static_configs:
- targets: ["localhost:8000"]
Note: For complete configuration examples including scrape jobs and alerting rules, see the examples directory.
Grafana Dashboard
Import the provided Grafana dashboard (coming soon) or create your own using the exported metrics.
Example queries:
# Total subscribers
listmonk_subscribers_total{list_name="Newsletter"}
# Confirmed subscribers
listmonk_subscribers_by_status{list_name="Newsletter",subscription_status="confirmed"}
# Campaign open rate
(listmonk_campaign_stats{stat_type="opened"} / listmonk_campaign_stats{stat_type="sent"}) * 100
Development
Prerequisites
- Python 3.11 or higher
- pip
Setup
# Clone the repository
git clone https://github.com/meysam81/listmonk-exporter.git
cd listmonk-exporter
# Install dependencies
pip install -e .
# Run locally
python main.py
Building Docker Image
docker build -t listmonk-exporter .
Troubleshooting
Exporter can't connect to Listmonk
- Verify
LISTMONK_HOSTis correct and accessible - Check that API credentials are valid
- Ensure Listmonk API is enabled
Metrics not updating
- Check
SCRAPE_INTERVALsetting - Review logs with
LOG_LEVEL=DEBUG - Verify the list ID exists in Listmonk
High memory usage
- Increase
SCRAPE_INTERVALto reduce scraping frequency - Check Listmonk API response sizes
Contributing
Contributions are welcome! Please feel free to submit a Pull Request. For major changes, please open an issue first to discuss what you would like to change.
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add some amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
License
This project is licensed under the Apache 2.0 License - see the LICENSE file for details.
Support
- 🐛 Issue Tracker
- 💬 Discussions
- 📧 Email: [Your email]
Acknowledgments
- Listmonk - The amazing newsletter manager
- Prometheus - Monitoring and alerting toolkit
- prometheus_client - Python client for Prometheus
Made with ❤️ for the open-source community.
Metadata
Release files for listmonk-exporter 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| listmonk_exporter-0.2.0.tar.gz | 11.9 kB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| listmonk_exporter-0.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 23.8 kB
Release files / listmonk_exporter-0.2.0.tar.gz
| Download URL | listmonk_exporter-0.2.0.tar.gz |
|---|---|
| Size | 11.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
8a2776690cd0a8d91973a96e99e70d9217c9ed65dd69debe44b9593a0c4804b4
|
|
BLAKE2b-256 checksum How to use checksums |
bb6459f495dcf6f52bc6e5244cdd3f3336d928d1a20a448cf659390f9e223880
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 24, 2025.
Transparency logRelease files / listmonk_exporter-0.2.0-py3-none-any.whl
| Download URL | listmonk_exporter-0.2.0-py3-none-any.whl |
|---|---|
| Size | 11.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
38466dd1dc4d58a2f0803d75b709114471e7045b79853e7bdfaa45abb4d3030e
|
|
BLAKE2b-256 checksum How to use checksums |
28e51fe99fe86bd4964975291e6aec5612a72c554df12196e4cfe53d6b43161d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 24, 2025.
Transparency logSecurity for listmonk-exporter 0.2.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for listmonk_exporter-0.2.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 24, 2025.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.