Ackee is a self-hosted, cookieless alternative to Google Analytics that tracks pageviews and custom events through a clean UI and native GraphQL API.
Google Analytics routes visitor telemetry into a proprietary advertising ecosystem and demands intrusive cookie consent banners on every client property. Ackee records web traffic statistics and interaction events on your own Node.js server, replacing third-party tracking with an anonymous, cookie-free pipeline. All metrics stay inside your private infrastructure, accessible through a clean web interface and a centralized GraphQL API.
Google Analytics ties site tracking directly into third-party advertising networks. While that integration feeds turnkey dashboards in Google Ads and BigQuery, extracting raw metrics into custom agency tools demands navigating complex OAuth scopes, rate quotas, and changing API schemas. Ackee exposes a native GraphQL API behind its entire interface. Developers embed tracking through framework hooks like use-ackee for React, Gatsby plugins, or WordPress extensions, then query traffic data directly into internal client portals and automated ops pipelines without third-party API keys or external platform limits.
The operational trade-off centers on feature scope and data custody. Google Analytics provides multi-channel attribution and predictive funnels tailored for enterprise marketing departments. Ackee strips analytics down to pageviews, referrers, visit duration, and custom click events, discarding cookies entirely. However, your team manages the host environment: a Node.js process backed by MongoDB. That removes GDPR cookie banner requirements across client sites, while requiring ops leads to oversee database backups, CORS configurations, and runtime upgrades directly.
Is Ackee free for commercial use? Yes. It is published under permissive MIT terms without seat fees, allowing agencies and commercial businesses to host client analytics without software costs.
Ackee vs Google Analytics — which should a team pick? Choose Google Analytics for multi-channel ad attribution, e-commerce checkout funnels, and Google Ads integration. Choose Ackee for self-hosted data ownership, a flexible GraphQL API, and essential traffic stats without cookie consent banners.
Can Ackee run with PostgreSQL or SQLite instead of MongoDB? No. Ackee relies strictly on MongoDB for document storage and aggregation pipelines, requiring MongoDB 4.4 or higher alongside the Node.js service.
Ackee is an effective choice for small teams and agencies that want full ownership of essential web traffic statistics through a modern GraphQL layer, provided they are comfortable operating a Node.js and MongoDB stack. Its permissive MIT terms permit agencies to bundle or embed the service for clients without software licensing fees, while active development with updates through September 2026 ensures continued container and dependency maintenance.
We started this exact setup from scratch in a clean Linux machine on Nov 3, 2026 and checked it through Ackee's own API: every check passed. Recipes are re-checked regularly and removed if they stop working.
mkdir -p ackee && cd ackee
curl -fsSL https://open-source.store/tools/ackee/compose.yml -o compose.ymlcat > .env <<EOF
ACKEE_USERNAME=admin
ACKEE_PASSWORD=$(openssl rand -hex 12)
EOFACKEE_USERNAME — Username for the administrator account.ACKEE_PASSWORD — Password for the administrator account. Generated above; keep it secret.docker compose up -dservices:
ackee:
image: electerious/ackee:3.7.1
restart: always
ports:
- "3000:3000"
environment:
ACKEE_MONGODB: mongodb://mongo:27017/ackee
ACKEE_USERNAME: ${ACKEE_USERNAME}
ACKEE_PASSWORD: ${ACKEE_PASSWORD}
depends_on:
mongo:
condition: service_healthy
healthcheck:
test: ["CMD-SHELL", "wget -q -O /dev/null http://127.0.0.1:3000/ || exit 1"]
interval: 5s
timeout: 5s
retries: 10
mongo:
image: mongo:8.0.20
restart: always
volumes:
- ackee-mongo-data:/data/db
command: ["mongod", "--noauth", "--wiredTigerCacheSizeGB", "0.5"]
healthcheck:
test: ["CMD", "mongosh", "--quiet", "--eval", "db.adminCommand('ping')"]
interval: 5s
timeout: 5s
retries: 10
volumes:
ackee-mongo-data:
Free IDE for Java, Kotlin, Go, TypeScript and Python. Built on IntelliJ Community, fully open source, 300+ plugins.
Show that Ackee is listed as an open-source alternative. Paste into your README:
Ubuntu 24.04 · Apple container, Docker 29.1.3, Compose 2.40.3+ds1-0ubuntu1~24.04.1. Images pulled in 40 s: electerious/ackee:3.7.1, mongo:8.0.20.
Based on the upstream setup. Official compose pinned to 3.7.1; MongoDB pinned to 8.0.20 with healthchecks and credentials moved to env.
ackee-1 | 2026-11-03T03:36:58.684381551Z [Ackee] › ⚠ warning `/wp-admin/admin-ajax.php?action=woot_get_smth&what={%22call_action%22:%22x%22,%22more_data%22:%22\u003cscript%3Ealert(document.domain)\u003c/script%3E%22}` not found
ackee-1 | 2026-11-03T03:36:58.684464551Z [Ackee] › ⚠ warning `/nagioslogserver/install` not found
ackee-1 | 2026-11-03T03:36:58.684572092Z [Ackee] › ⚠ warning `/installer/` not found
ackee-1 | 2026-11-03T03:36:58.685034842Z [Ackee] › ⚠ warning `/rest/api/2/user/picker?query` not found
ackee-1 | 2026-11-03T03:36:58.685128676Z [Ackee] › ⚠ warning `/settings/settings.py` not found
ackee-1 | 2026-11-03T03:36:58.688221342Z [Ackee] › ⚠ warning `/settings.php.old` not found
ackee-1 | 2026-11-03T03:36:58.688880801Z [Ackee] › ✖ fatal BadRequestError: This operation has been blocked as a potential Cross-Site Request Forgery (CSRF). Please either specify a 'content-type' header (with a type that is not one of application/x-www-form-urlencoded, multipart/form-data, text/plain) or provide a non-empty value for one of the following headers: x-apollo-operation-name, apollo-require-preflight
ackee-1 | 2026-11-03T03:36:58.688888759Z
ackee-1 | 2026-11-03T03:36:58.688889509Z at new GraphQLErrorWithCode (file:///srv/app/node_modules/@apollo/server/dist/esm/internalErrorClasses.js:7:9)
ackee-1 | 2026-11-03T03:36:58.688890134Z at new BadRequestError (file:///srv/app/node_modules/@apollo/server/dist/esm/internalErrorClasses.js:75:9)
ackee-1 | 2026-11-03T03:36:58.688890759Z at preventCsrf (file:///srv/app/node_modules/@apollo/server/dist/esm/preventCsrf.js:29:11)
ackee-1 | 2026-11-03T03:36:58.688891301Z at ApolloServer.executeHTTPGraphQLRequest (file:///srv/app/node_modules/@apollo/server/dist/esm/ApolloServer.js:527:17)
ackee-1 | 2026-11-03T03:36:58.688891926Z at async file:///srv/app/node_modules/@as-integrations/express5/dist/esm/index.js:26:37
ackee-1 | 2026-11-03T03:36:58.689131717Z [Ackee] › ⚠ warning `/web/settings/settings.py` not found
ackee-1 | 2026-11-03T03:36:58.689260467Z [Ackee] › ⚠ warning `/installer/index.php?_step=2` not found
ackee-1 | 2026-11-03T03:36:58.689343301Z [Ackee] › ⚠ warning `/sabnzbd/wizard/` not found
ackee-1 | 2026-11-03T03:36:58.690363134Z [Ackee] › ⚠ warning `/installer/index.php?_step=2` not found
ackee-1 | 2026-11-03T03:36:58.690568467Z [Ackee] › ⚠ warning `/ipython/tree` not found
ackee-1 | 2026-11-03T03:36:58.690683217Z [Ackee] › ⚠ warning `/wp-content/plugins/aspose-cloud-ebook-generator/aspose_posts_exporter_download.php?file=../../../wp-config.php` not found
ackee-1 | 2026-11-03T03:36:58.690734717Z [Ackee] › ⚠ warning `/forum/forumrunner/request.php?d=1&cmd=get_spam_data&postids=-1%27` not found
ackee-1 | 2026-11-03T03:36:58.690861217Z [Ackee] › ✖ fatal BadRequestError: This operation has been blocked as a potential Cross-Site Request Forgery (CSRF). Please either specify a 'content-type' header (with a type that is not one of application/x-www-form-urlencoded, multipart/form-data, text/plain) or provide a non-empty value for one of the following headers: x-apollo-operation-name, apollo-require-preflight
ackee-1 | 2026-11-03T03:36:58.690862842Z
ackee-1 | 2026-11-03T03:36:58.690863384Z at new GraphQLErrorWithCode (file:///srv/app/node_modules/@apollo/server/dist/esm/internalErrorClasses.js:7:9)
ackee-1 | 2026-11-03T03:36:58.690864009Z at new BadRequestError (file:///srv/app/node_modules/@apollo/server/dist/esm/internalErrorClasses.js:75:9)
ackee-1 | 2026-11-03T03:36:58.690864759Z at preventCsrf (file:///srv/app/node_modules/@apollo/server/dist/esm/preventCsrf.js:29:11)
ackee-1 | 2026-11-03T03:36:58.690865342Z at ApolloServer.executeHTTPGraphQLRequest (file:///srv/app/node_modules/@apollo/server/dist/esm/ApolloServer.js:527:17)
ackee-1 | 2026-11-03T03:36:58.690865967Z at async file:///srv/app/node_modules/@as-integrations/express5/dist/esm/index.js:26:37
ackee-1 | 2026-11-03T03:36:58.690949676Z [Ackee] › ⚠ warning `/sphinx.conf` not found
ackee-1 | 2026-11-03T03:36:58.691078634Z [Ackee] › ⚠ warning `/..%252F..%252F..%252F..%252F..%252F..%252F..%252F..%252F..%252F..%252F..%252Fetc%252Fpasswd%23foo/development` not found
ackee-1 | 2026-11-03T03:36:58.691114801Z [Ackee] › ⚠ warning `/sabnzbd/wizard/` not found
ackee-1 | 2026-11-03T03:36:58.691221301Z [Ackee] › ⚠ warning `/library/auth.json` not found
ackee-1 | 2026-11-03T03:36:58.691280884Z [Ackee] › ⚠ warning `/ipython/tree` not found
ackee-1 | 2026-11-03T03:36:58.691751801Z [Ackee] › ⚠ warning `/web/session/logout?redirect=https%3a%2f%2foast.me%2f` not found
ackee-1 | 2026-11-03T03:36:58.691966176Z [Ackee] › ⚠ warning `/..%252F..%252F..%252F..%252F..%252F..%252F..%252F..%252F..%252F..%252F..%252Fetc%252Fpasswd%23foo/development` not found
ackee-1 | 2026-11-03T03:36:58.692127509Z [Ackee] › ⚠ warning `/ansible.cfg` not found
ackee-1 | 2026-11-03T03:36:58.692309426Z [Ackee] › ⚠ warning `/settings/settings.py` not found
ackee-1 | 2026-11-03T03:36:58.692904051Z [Ackee] › ⚠ warning `/wp-content/plugins/aspose-cloud-ebook-generator/aspose_posts_exporter_download.php?file=../../../wp-config.php` not found
ackee-1 | 2026-11-03T03:36:58.693157676Z [Ackee] › ⚠ warning `/forum/forumrunner/request.php?d=1&cmd=get_spam_data&postids=-1%27` not found
ackee-1 | 2026-11-03T03:36:58.693373717Z [Ackee] › ✖ fatal BadRequestError: This operation has been blocked as a potential Cross-Site Request Forgery (CSRF). Please either specify a 'content-type' header (with a type that is not one of application/x-www-form-urlencoded, multipart/form-data, text/plain) or provide a non-empty value for one of the following headers: x-apollo-operation-name, apollo-require-preflight
ackee-1 | 2026-11-03T03:36:58.693375842Z
ackee-1 | 2026-11-03T03:36:58.693376384Z at new GraphQLErrorWithCode (file:///srv/app/node_modules/@apollo/server/dist/esm/internalErrorClasses.js:7:9)
ackee-1 | 2026-11-03T03:36:58.693377009Z at new BadRequestError (file:///srv/app/node_modules/@apollo/server/dist/esm/internalErrorClasses.js:75:9)
ackee-1 | 2026-11-03T03:36:58.693377717Z at preventCsrf (file:///srv/app/node_modules/@apollo/server/dist/esm/preventCsrf.js:29:11)
ackee-1 | 2026-11-03T03:36:58.693378426Z at ApolloServer.executeHTTPGraphQLRequest (file:///srv/app/node_modules/@apollo/server/dist/esm/ApolloServer.js:527:17)
ackee-1 | 2026-11-03T03:36:58.693379092Z at async file:///srv/app/node_modules/@as-integrations/express5/dist/esm/index.js:26:37
ackee-1 | 2026-11-03T03:36:58.693539759Z [Ackee] › ✖ fatal BadRequestError: This operation has been blocked as a potential Cross-Site Request Forgery (CSRF). Please either specify a 'content-type' header (with a type that is not one of application/x-www-form-urlencoded, multipart/form-data, text/plain) or provide a non-empty value for one of the following headers: x-apollo-operation-name, apollo-require-preflight
ackee-1 | 2026-11-03T03:36:58.693541717Z
ackee-1 | 2026-11-03T03:36:58.693542217Z at new GraphQLErrorWithCode (file:///srv/app/node_modules/@apollo/server/dist/esm/internalErrorClasses.js:7:9)
ackee-1 | 2026-11-03T03:36:58.693542842Z at new BadRequestError (file:///srv/app/node_modules/@apollo/server/dist/esm/internalErrorClasses.js:75:9)
ackee-1 | 2026-11-03T03:36:58.693543467Z at preventCsrf (file:///srv/app/node_modules/@apollo/server/dist/esm/preventCsrf.js:29:11)
ackee-1 | 2026-11-03T03:36:58.693544051Z at ApolloServer.executeHTTPGraphQLRequest (file:///srv/app/node_modules/@apollo/server/dist/esm/ApolloServer.js:527:17)
ackee-1 | 2026-11-03T03:36:58.693544676Z at async file:///srv/app/node_modules/@as-integrations/express5/dist/esm/index.js:26:37
ackee-1 | 2026-11-03T03:36:58.693670217Z [Ackee] › ⚠ warning `/staging/auth.json` not found
ackee-1 | 2026-11-03T03:36:58.693759717Z [Ackee] › ⚠ warning `/settings.php.old` not found
ackee-1 | 2026-11-03T03:36:58.693950051Z [Ackee] › ⚠ warning `/web/session/logout?redirect=https%3a%2f%2foast.me%2f` not found
ackee-1 | 2026-11-03T03:36:58.694011051Z [Ackee] › ⚠ warning `/ansible.cfg` not found
ackee-1 | 2026-11-03T03:36:58.694371176Z [Ackee] › ⚠ warning `/web/settings/settings.py` not found
ackee-1 | 2026-11-03T03:36:58.694443009Z [Ackee] › ⚠ warning `/wizard/` not found
ackee-1 | 2026-11-03T03:36:58.694644717Z [Ackee] › ⚠ warning `/settings.php.save` not found
ackee-1 | 2026-11-03T03:36:58.695064467Z [Ackee] › ⚠ warning `/wizard/` not found
ackee-1 | 2026-11-03T03:36:58.695147259Z [Ackee] › ⚠ warning `/web/dbredirect?redirect=https%3a%2f%2foast.me%2f` not found
ackee-1 | 2026-11-03T03:36:58.695529676Z [Ackee] › ⚠ warning `/forums/forumrunner/request.php?d=1&cmd=get_spam_data&postids=-1%27` not found
ackee-1 | 2026-11-03T03:36:58.695680759Z [Ackee] › ⚠ warning `/sphinx/sphinx.conf` not found
ackee-1 | 2026-11-03T03:36:59.654850093Z [Ackee] › ⚠ warning `/vb/forumrunner/request.php?d=1&cmd=get_spam_data&postids=-1%27` not found
ackee-1 | 2026-11-03T03:36:59.655614968Z [Ackee] › ⚠ warning `/.settings.php.swp` not found
ackee-1 | 2026-11-03T03:36:59.655975676Z [Ackee] › ⚠ warning `/vendor/auth.json` not found
ackee-1 | 2026-11-03T03:36:59.656647551Z [Ackee] › ⚠ warning `/forums/forumrunner/request.php?d=1&cmd=get_spam_data&postids=-1%27` not found
ackee-1 | 2026-11-03T03:36:59.659484176Z [Ackee] › ⚠ warning `/prod/auth.json` not found
ackee-1 | 2026-11-03T03:36:59.659499385Z [Ackee] › ⚠ warning `/settings.php.txt` not found
ackee-1 | 2026-11-03T03:36:59.659502343Z [Ackee] › ⚠ warning `/web/dbredirect?redirect=https%3a%2f%2foast.me%2f` not found
ackee-1 | 2026-11-03T03:36:59.659504676Z [Ackee] › ⚠ warning `/vendors/auth.json` not found
ackee-1 | 2026-11-03T03:36:59.659506718Z [Ackee] › ⚠ warning `/vb/forumrunner/request.php?d=1&cmd=get_spam_data&postids=-1%27` not found
ackee-1 | 2026-11-03T03:36:59.659509343Z [Ackee] › ⚠ warning `/sphinxsearch/sphinx.conf` not found
ackee-1 | 2026-11-03T03:36:59.659511218Z [Ackee] › ⚠ warning `/config/settings.old.php` not found
ackee-1 | 2026-11-03T03:36:59.659513010Z [Ackee] › ⚠ warning `/production/auth.json` not found
ackee-1 | 2026-11-03T03:36:59.659515385Z [Ackee] › ⚠ warning `/settings.php.save` not found
ackee-1 | 2026-11-03T03:36:59.659517218Z [Ackee] › ⚠ warning `/node_modules/auth.json` not found
ackee-1 | 2026-11-03T03:36:59.659519135Z [Ackee] › ⚠ warning `/.settings.php.swp` not found
ackee-1 | 2026-11-03T03:36:59.659520926Z [Ackee] › ⚠ warning `/storage/auth.json` not found
ackee-1 | 2026-11-03T03:36:59.660512635Z [Ackee] › ⚠ warning `/includes/auth.json` not found
ackee-1 | 2026-11-03T03:36:59.660521301Z [Ackee] › ⚠ warning `/database/auth.json` not found
ackee-1 | 2026-11-03T03:36:59.660523551Z [Ackee] › ⚠ warning `/config.php.bak` not found
ackee-1 | 2026-11-03T03:36:59.660525551Z [Ackee] › ⚠ warning `/settings.php.txt` not found
ackee-1 | 2026-11-03T03:36:59.660851176Z [Ackee] › ⚠ warning `/db/auth.json` not found
ackee-1 | 2026-11-03T03:36:59.661157010Z [Ackee] › ⚠ warning `/include/auth.json` not found
ackee-1 | 2026-11-03T03:36:59.661360510Z [Ackee] › ⚠ warning `/config/settings.old.php` not found
ackee-1 | 2026-11-03T03:36:59.661537010Z [Ackee] › ⚠ warning `/config.php.dist` not found
ackee-1 | 2026-11-03T03:36:59.661917093Z [Ackee] › ⚠ warning `/lib/auth.json` not found
ackee-1 | 2026-11-03T03:36:59.663184468Z [Ackee] › ⚠ warning `/config.php.old` not found
ackee-1 | 2026-11-03T03:36:59.663202635Z [Ackee] › ⚠ warning `/config.php.bak` not found
ackee-1 | 2026-11-03T03:36:59.663309718Z [Ackee] › ⚠ warning `/auth/auth.json` not found
ackee-1 | 2026-11-03T03:36:59.663600551Z [Ackee] › ⚠ warning `/libs/auth.json` not found
ackee-1 | 2026-11-03T03:36:59.663843676Z [Ackee] › ⚠ warning `/config.php.save` not found
ackee-1 | 2026-11-03T03:36:59.664416135Z [Ackee] › ⚠ warning `/authentication/auth.json` not found
ackee-1 | 2026-11-03T03:36:59.664692301Z [Ackee] › ⚠ warning `/config.php.dist` not found
ackee-1 | 2026-11-03T03:36:59.666276218Z [Ackee] › ⚠ warning `/.config.php.swp` not found
ackee-1 | 2026-11-03T03:36:59.666292093Z [Ackee] › ⚠ warning `/oauth/auth.json` not found
ackee-1 | 2026-11-03T03:36:59.667098093Z [Ackee] › ⚠ warning `/library/auth.json` not found
ackee-1 | 2026-11-03T03:36:59.667342218Z [Ackee] › ⚠ warning `/config.php.txt` not found
ackee-1 | 2026-11-03T03:36:59.667532843Z [Ackee] › ⚠ warning `/keys/auth.json` not found
ackee-1 | 2026-11-03T03:36:59.667745426Z [Ackee] › ⚠ warning `/config.php.old` not found
ackee-1 | 2026-11-03T03:36:59.667945843Z [Ackee] › ⚠ warning `/config/settings.old.php` not found
ackee-1 | 2026-11-03T03:36:59.668143218Z [Ackee] › ⚠ warning `/vendor/auth.json` not found
ackee-1 | 2026-11-03T03:36:59.668876510Z [Ackee] › ⚠ warning `/vendors/auth.json` not found
ackee-1 | 2026-11-03T03:36:59.668913093Z [Ackee] › ⚠ warning `/config.php.save` not found
ackee-1 | 2026-11-03T03:36:59.668915968Z [Ackee] › ⚠ warning `/credentials/auth.json` not found
ackee-1 | 2026-11-03T03:36:59.669084093Z [Ackee] › ⚠ warning `/node_modules/auth.json` not found
ackee-1 | 2026-11-03T03:36:59.669416760Z [Ackee] › ⚠ warning `/.config.php.swp` not found
ackee-1 | 2026-11-03T03:36:59.670204718Z [Ackee] › ⚠ warning `/creds/auth.json` not found
ackee-1 | 2026-11-03T03:36:59.670217218Z [Ackee] › ⚠ warning `/config.php.txt` not found
ackee-1 | 2026-11-03T03:36:59.670219801Z [Ackee] › ⚠ warning `/storage/auth.json` not found
ackee-1 | 2026-11-03T03:36:59.670499343Z [Ackee] › ⚠ warning `/database/auth.json` not found
ackee-1 | 2026-11-03T03:36:59.670664968Z [Ackee] › ⚠ warning `/config/settings.old.php` not found
ackee-1 | 2026-11-03T03:36:59.670975676Z [Ackee] › ⚠ warning `/db/auth.json` not found
ackee-1 | 2026-11-03T03:36:59.671453926Z [Ackee] › ⚠ warning `/auth/auth.json` not found
ackee-1 | 2026-11-03T03:36:59.671920385Z [Ackee] › ⚠ warning `/authentication/auth.json` not found
ackee-1 | 2026-11-03T03:36:59.672517635Z [Ackee] › ⚠ warning `/oauth/auth.json` not found
ackee-1 | 2026-11-03T03:36:59.673006718Z [Ackee] › ⚠ warning `/keys/auth.json` not found
ackee-1 | 2026-11-03T03:36:59.673395801Z [Ackee] › ⚠ warning `/credentials/auth.json` not found
ackee-1 | 2026-11-03T03:36:59.673783843Z [Ackee] › ⚠ warning `/creds/auth.json` not found