Skip to main content

Listmonk Exporter

CI PyPI PyPI - Downloads Python Version License Code style: ruff GitHub stars GitHub forks GitHub issues GitHub pull requests GitHub last commit GitHub contributors Maintenance PRs Welcome

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_status values: confirmed, unconfirmed, unsubscribed

Campaign Metrics:

  • stat_type values: sent, opened, clicked, bounced
  • campaign_status values: draft, scheduled, running, paused, finished, cancelled

Bounce Metrics:

  • bounce_type values: hard, soft, complaint

Exporter Metrics:

  • operation values: 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_HOST is correct and accessible
  • Check that API credentials are valid
  • Ensure Listmonk API is enabled

Metrics not updating

  • Check SCRAPE_INTERVAL setting
  • Review logs with LOG_LEVEL=DEBUG
  • Verify the list ID exists in Listmonk

High memory usage

  • Increase SCRAPE_INTERVAL to 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.

  1. Fork the repository
  2. Create your feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add some amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

License

This project is licensed under the Apache 2.0 License - see the LICENSE file for details.

Support

Acknowledgments


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)

Source distribution for listmonk-exporter 0.2.0
File Size Uploaded Provenance
listmonk_exporter-0.2.0.tar.gz 11.9 kB With provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for listmonk-exporter 0.2.0
File Interpreter ABI Platform
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 log

Release 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 log

Security 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.

Select from 2 files

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 log

A 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.

Release history Release notifications | RSS feed

This release

0.2.0 This release

2 release files Full provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page