ChatbotX
Open-source ManyChat alternative, built for AI. Omnichannel marketing across WhatsApp, TikTok, Facebook, Instagram, Telegram, Zalo, Email, API, and Webchat 🤖
Self-hosted marketing: social posts, ads, print, letters and spots in campaigns with one brand.
MarketingTypeScript · CSSGitHub @SchulzOliOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Self-hosted social media scheduling. Connect your accounts with one click, write a post once, publish it everywhere — now or later.
Taken from the repository README
Loading the full README.
Read the full README ↗Self-hosted marketing for a business: social media posts, online ads, print, letters by post and video or radio spots, planned in campaigns with one brand and one recurring brand character. Connect your accounts with one click, write once, publish everywhere.
Documentation: schulzoli.github.io/MarketingAsAService: getting started, configuration, a guide for every network, and the marketing tools.
/canvas#n=network:instagram, /canvas#@x,y,zoom).| Flow builder | Composing through a flow |
|---|---|
| Calendar | Auf Deutsch |
|---|---|
| A campaign | A print-ready flyer | AI drafts |
|---|---|---|
| Aurora | Paper | Blueprint |
|---|---|---|
Phases 0 (foundation), 1 (uploads, editing, calendar, teams, email, Bluesky sign-in, German and English) and 2 (the bridge: every network without app reviews, through Zernio) are done, and so is marketing beyond social media (brand kit, campaigns, print and letters, spots, paid ads, the AI studio). Phase 3 is prepared: every network integration is implemented, and each server's admin chooses per network between their own developer app, the Zernio bridge, or switching it off (guide). Every server registers its own apps; the project applies for none on anyone's behalf. MarketingAsAService serves the about, privacy, terms, imprint and data deletion pages the reviews ask for (docs/legal.md). Networks become "live-verified" as operators run them with their own apps (docs/platforms.md). The canvas with flows is the main interface (the classic list pages remain under “List view”); its look comes from theme plugins. Roadmap: docs/plan.md.
Requirements: Node 22+, Docker.
npm install
cp .env.example .env
sed -i "s|^ENCRYPTION_KEY=.*|ENCRYPTION_KEY=$(openssl rand -base64 32)|" .env
npm run services:up # Postgres on localhost:5432
docker compose exec postgres psql -U maas -c "CREATE DATABASE maas_test" # for tests
npm run db:migrate
npm run dev # web on http://localhost:3000 + worker
Sign up, add a Sandbox account and schedule a post. Put #fail or #flaky in the text to see error handling.
cp .env.example .env # set ENCRYPTION_KEY, APP_URL, POSTGRES_PASSWORD
docker compose --profile app up -d --build
This starts Postgres, runs migrations, and launches the web app (port 3000) and the worker. Put a reverse proxy with HTTPS in front of the web app and set APP_URL to the public URL — OAuth callbacks and links in emails depend on it. The proxy should set X-Forwarded-For; login rate limits per IP rely on it (limits per email address do not).
| Variable | Required | Description |
|---|---|---|
DATABASE_URL | yes | Postgres connection string |
ENCRYPTION_KEY | yes | 32 random bytes, base64 (openssl rand -base64 32). Encrypts account tokens; do not change after accounts are connected |
APP_URL | yes | Public URL without trailing slash |
ENABLE_SANDBOX | no | true shows the fake Sandbox network |
WORKER_POLL_INTERVAL_MS | no | How often the worker checks for due posts (default 10000) |
MEDIA_STORAGE | no | local (default) keeps uploads in MEDIA_DIR (a Docker volume), s3 uses any S3-compatible storage (S3_ENDPOINT, S3_BUCKET, S3_ACCESS_KEY_ID, S3_SECRET_ACCESS_KEY, see .env.example) |
MEDIA_MAX_VIDEO_MB | no | Largest video upload (default 512; images up to 20 MB) |
SMTP_URL | no | Outgoing mail for password resets, invites, email confirmation and failed-post alerts, e.g. smtp://user:[email protected]:587. Without it, emails are printed to the log |
MAIL_FROM | no | Sender address, e.g. MarketingAsAService <[email protected]> |
OPERATOR_NAME, OPERATOR_EMAIL | for app reviews | Who runs the server. Turns on /about, a privacy policy, terms and data deletion instructions; with OPERATOR_ADDRESS also an imprint. LEGAL_*_URL links your own pages instead. See docs/legal.md |
<NETWORK>_CLIENT_ID / _CLIENT_SECRET | no | Operator developer apps, e.g. INSTAGRAM_CLIENT_ID. See docs/platforms.md |
apps/web Next.js app: canvas (components/world), list pages, server actions, OAuth callbacks
apps/web/messages UI texts in English and German, one catalog per area
apps/worker Worker: publishes due posts, sends letters, reads ad numbers
packages/core Posts, accounts, flows, campaigns, print, ads, AI studio, theme plugins, publishing loop, encryption
packages/db Drizzle schema + SQL migrations
packages/providers Network and ad platform integrations behind common interfaces
docs/ Documentation website: guides per network, marketing, plan, screenshots
The UI is in English and German. Texts live in typed catalogs — apps/web/messages/*.ts for the app, packages/core/src/messages.ts for errors and emails, packages/providers/src/messages.ts for validation and network texts. Each catalog has an en and a de object, and TypeScript refuses a German catalog that misses a message or takes other values. To add a language, add it to locales in packages/providers/src/i18n.ts and follow the type errors.
| Command | What it does |
|---|---|
npm run dev | Web app + worker with hot reload |
npm test | Unit tests; integration tests run when TEST_DATABASE_URL is set |
npm run typecheck | TypeScript across all packages |
npm run build | Production builds of web and worker |
npm run db:generate | Create a migration after changing packages/db/src/schema.ts |
npm run db:migrate | Apply migrations |
Contributions are welcome — bug reports, ideas, translations and code. Read CONTRIBUTING.md for the setup, checks and conventions, and report security problems privately as described in SECURITY.md. Everyone taking part follows the code of conduct.
MarketingAsAService is open source under the MIT License. Its dependencies have their own licenses, almost all MIT, Apache-2.0, ISC or BSD; the image library sharp that Next.js installs includes libvips under LGPL-3.0.
HIDE_NETWORKS | no | Network ids you don't offer at all, e.g. x,tiktok |
ZERNIO_API_KEY | no | Connects every network without a developer app through Zernio. ZERNIO_NETWORKS limits or forces the list, ZERNIO_ACCOUNT_PRICE (e.g. 6 or 5.50 EUR) shows cost estimates. See docs/bridge.md |
PINGEN_CLIENT_ID / _CLIENT_SECRET | no | Sends letters and postcards by post through Pingen. See docs/marketing/print.md |
GOOGLE_ADS_DEVELOPER_TOKEN, ENABLE_META_ADS | no | Turn on paid ads on Google Ads and Meta Ads with the Google and Facebook apps. See docs/marketing/ads.md |
ANTHROPIC_API_KEY | no | Turns on the AI studio (AI_MODEL picks the Claude model). See docs/marketing/ai-studio.md |