AltFreeStack
Marketing

The Growth Marketing & Automation Stack

Newsletters with no contact limit, workflow automation, short links with your own analytics and an omnichannel support inbox — a team's growth marketing engine, self-hosted with no per-contact or per-seat fees.

Combined minimum RAM

~7GB

Estimated savings

Mailchimp charges by contact; Listmonk sends unlimited for the cost of your VPS

Overlapping tools

  • Alternatives to each other for Zapier: n8n, Activepieces. You may only need one of them.
  • Alternatives to each other for Make: n8n, Activepieces. You may only need one of them.

Tools in this pack (5)

listmonk

Newsletters and email campaigns, an alternative to Mailchimp with no per-subscriber cost.

Dev Tools100% FOSS🟡 Standard · ~1GB
docker-compose.yml
version: "3.9"
services:
  listmonk:
    image: listmonk/listmonk:v6.2.0
    restart: unless-stopped
    ports:
      - "9000:9000"
    environment:
      - LISTMONK_db__host=listmonk-db
      - LISTMONK_db__user=listmonk
      - LISTMONK_db__password=change-me-postgres-password # must match POSTGRES_PASSWORD below
      - LISTMONK_db__database=listmonk
    depends_on:
      - listmonk-db
  listmonk-db:
    image: postgres:15-alpine
    restart: unless-stopped
    environment:
      - POSTGRES_USER=listmonk
      - POSTGRES_PASSWORD=change-me-postgres-password # REQUIRED: generate a random secret before first run
      - POSTGRES_DB=listmonk
    volumes:
      - listmonk_pg_data:/var/lib/postgresql/data
volumes:
  listmonk_pg_data:
View listmonk's full profile
n8n

Workflow automation, an alternative to Zapier.

Dev ToolsFair-code🟡 Standard · ~1GB
docker-compose.yml
version: "3.9"
services:
  n8n:
    image: n8nio/n8n:1.123.83
    restart: unless-stopped
    ports:
      - "5678:5678"
    environment:
      - N8N_HOST=n8n.yourdomain.com # CHANGE THIS TO YOUR DOMAIN (required for webhooks to work)
      - DB_TYPE=postgresdb
      - DB_POSTGRESDB_HOST=n8n-db
      - DB_POSTGRESDB_USER=n8n
      - DB_POSTGRESDB_PASSWORD=change-me-db-password # REQUIRED: generate a random secret before first run
      - N8N_ENCRYPTION_KEY=change-me-super-secret # REQUIRED: generate a random secret before first run
    volumes:
      - n8n_data:/home/node/.n8n
    depends_on:
      - n8n-db
  n8n-db:
    image: postgres:15-alpine
    restart: unless-stopped
    environment:
      - POSTGRES_USER=n8n
      - POSTGRES_PASSWORD=change-me-db-password # must match DB_POSTGRESDB_PASSWORD above
      - POSTGRES_DB=n8n
    volumes:
      - n8n_pg_data:/var/lib/postgresql/data
volumes:
  n8n_data:
  n8n_pg_data:
View n8n's full profile
Activepieces

Workflow automation with 200+ integrations, an alternative to Zapier.

Dev ToolsOpen-Core🔴 Full · ~2GB
docker-compose.yml
services:
  activepieces:
    image: activepieces/activepieces:0.92.1
    restart: unless-stopped
    ports:
      - "8080:80"
    environment:
      AP_ENCRYPTION_KEY: change-me-32-char-key # REQUIRED: generate a random secret before first run
      AP_JWT_SECRET: change-me-super-secret # REQUIRED: generate a random secret before first run
      AP_FRONTEND_URL: http://localhost:8080 # CHANGE THIS TO YOUR DOMAIN
      AP_POSTGRES_HOST: activepieces-db
      AP_POSTGRES_USERNAME: activepieces
      AP_POSTGRES_PASSWORD: change-me-postgres-password # REQUIRED: generate a random secret before first run
      AP_POSTGRES_DATABASE: activepieces
      AP_REDIS_HOST: activepieces-redis
    depends_on:
      - activepieces-db
      - activepieces-redis
  activepieces-db:
    image: postgres:15-alpine
    restart: unless-stopped
    environment:
      POSTGRES_USER: activepieces
      POSTGRES_PASSWORD: change-me-postgres-password # must match AP_POSTGRES_PASSWORD above
      POSTGRES_DB: activepieces
    volumes:
      - activepieces_pg_data:/var/lib/postgresql/data
  activepieces-redis:
    image: redis:7-alpine
    restart: unless-stopped
volumes:
  activepieces_pg_data:
View Activepieces's full profile
Shlink

URL shortener server with API and analytics, an alternative to Bitly.

Marketing, Forms & Emailing100% FOSS🟡 Standard · ~1GB
docker-compose.yml
services:
  shlink:
    image: shlinkio/shlink:stable
    restart: unless-stopped
    ports:
      - "8080:8080"
    environment:
      DEFAULT_DOMAIN: localhost # CHANGE THIS TO YOUR DOMAIN
      IS_HTTPS_ENABLED: "false"
      DB_DRIVER: mysql
      DB_HOST: shlink-db
      DB_NAME: shlink
      DB_USER: shlink
      DB_PASSWORD: change-me-mysql-password # REQUIRED: generate a random secret before first run
    depends_on:
      - shlink-db
  shlink-db:
    image: mysql:8
    restart: unless-stopped
    environment:
      MYSQL_DATABASE: shlink
      MYSQL_USER: shlink
      MYSQL_PASSWORD: change-me-mysql-password # must match DB_PASSWORD above
      MYSQL_ROOT_PASSWORD: change-me-mysql-root-password # REQUIRED: generate a random secret before first run
    volumes:
      - shlink_db_data:/var/lib/mysql
volumes:
  shlink_db_data:
View Shlink's full profile
Chatwoot

Omnichannel support inbox, an alternative to Intercom/Zendesk.

CRM & SupportOpen-Core🔴 Full · ~2GB
docker-compose.yml
version: "3.9"
services:
  chatwoot:
    image: chatwoot/chatwoot:v4.18.0
    restart: unless-stopped
    ports:
      - "3000:3000"
    environment:
      - SECRET_KEY_BASE=change-me-super-secret
      - POSTGRES_HOST=chatwoot-db
      - POSTGRES_USERNAME=chatwoot
      - POSTGRES_PASSWORD=change-me-postgres-password # REQUIRED: generate a random secret before first run
      - REDIS_URL=redis://chatwoot-redis:6379
    depends_on:
      - chatwoot-db
      - chatwoot-redis
  chatwoot-db:
    image: postgres:15-alpine
    restart: unless-stopped
    environment:
      - POSTGRES_USER=chatwoot
      - POSTGRES_PASSWORD=change-me-postgres-password # REQUIRED: generate a random secret before first run
    volumes:
      - chatwoot_pg_data:/var/lib/postgresql/data
  chatwoot-redis:
    image: redis:7-alpine
    restart: unless-stopped
volumes:
  chatwoot_pg_data:
View Chatwoot's full profile