---
title: "Deploy OpenPanel Funnels"
description: "Multi-step conversion funnels on your own ClickHouse"
category: "Analytics"
url: https://railway.com/deploy/deploy-openpanel-funnel-analytics
---

# Deploy OpenPanel Funnels

Multi-step conversion funnels on your own ClickHouse

**[Deploy OpenPanel Funnels on Railway](https://railway.com/template/deploy-openpanel-funnel-analytics)**

Machine-readable deploy manifest (JSON, validated by TemplateCI): https://railway.com/deploy/deploy-openpanel-funnel-analytics/manifest.json

- **Creator:** onepush
- **Category:** Analytics

## Template content

### op-proxy

- **Image:** caddy:2-alpine@sha256:d8542f48d34a9cf4e4c11a478865229840e87e4c96ea3f439101f31a5d35f75f
- **Start command:** `sh -c "echo \"$CADDYFILE\" > /etc/caddy/Caddyfile; echo START_OK PORT=$PORT; cat /etc/caddy/Caddyfile; exec caddy run --config /etc/caddy/Caddyfile --adapter caddyfile"`
- **Public domain:** Yes

### op-dashboard

- **Image:** lindesvard/openpanel-dashboard:2.3.0@sha256:b773cf864454a0ec89b2a133b48bf06202880ed650a75cc2f1f5c87aaed1cffa
- **Health check:** /api/healthcheck

### op-redis

- **Image:** redis:8.2.1@sha256:5fa2edb1e408fa8235e6db8fab01d1afaaae96c9403ba67b70feceb8661e8621
- **Start command:** `/bin/sh -c "rm -rf ${RAILWAY_VOLUME_MOUNT_PATH}/lost+found/ && exec docker-entrypoint.sh redis-server --requirepass ${REDIS_PASSWORD} --bind '* -::*' --protected-mode no --port ${PORT:-6379} --save 60 1 --dir ${RAILWAY_VOLUME_MOUNT_PATH}"`

### op-postgres

- **Image:** ghcr.io/railwayapp-templates/postgres-ssl:17

### op-clickhouse

- **Image:** clickhouse/clickhouse-server:25.12@sha256:8a790dd3468db22b1d4e7b18a176f378ff5ff6053b9c48dd4ea1fa71a24c5ba6
- **Start command:** `sh -c 'mkdir -p /etc/clickhouse-server/config.d && printf "%s\n" "<clickhouse><listen_host>::</listen_host><listen_host>0.0.0.0</listen_host><trace_log remove=\"remove\"/><text_log remove=\"remove\"/><metric_log remove=\"remove\"/><asynchronous_metric_log remove=\"remove\"/><processors_profile_log remove=\"remove\"/><query_metric_log remove=\"remove\"/><query_thread_log remove=\"remove\"/><query_views_log remove=\"remove\"/><asynchronous_insert_log remove=\"remove\"/><opentelemetry_span_log remove=\"remove\"/><background_schedule_pool_log remove=\"remove\"/></clickhouse>" > /etc/clickhouse-server/config.d/railway-listen.xml && exec /entrypoint.sh'`

### op-api

- **Image:** lindesvard/openpanel-api:2.3.0@sha256:cee4855cd715a7248c5c49090fe93a28ffc505541de20cb238d8884a6bcb9223
- **Start command:** `sh -c "echo Running migrations...; CI=true pnpm -r run migrate:deploy; exec pnpm start"`
- **Health check:** /healthcheck

### op-worker

- **Image:** lindesvard/openpanel-worker:2.3.0@sha256:b22e247fb6980b820c1a954d0e3d2fe88b3edf40a58aa53329467af239538e80
- **Health check:** /healthcheck

## Documentation

# Deploy and Host self hosted OpenPanel Funnels (Open-Source Product Analytics) on Railway

Funnels are a report type in OpenPanel, not a separate tracker. This template runs the full stack on your own ClickHouse, so every step from signup to paid counts, unsampled. For teams that outgrew Mixpanel bills and want funnel data in-house.

## About Hosting OpenPanel Funnels open-source software on Railway (self hosted OpenPanel funnels template)

OpenPanel Funnels runs on your own Railway project: seven services, with events in ClickHouse, profiles in Postgres and the queue in Redis, so funnel steps never leave your infrastructure. Funnel reports are built from the events you already send, so there's nothing extra to instrument.

## Why Deploy OpenPanel Funnels, the Mixpanel alternative on Railway (Railway Free Trial)

Mixpanel bills per event, and funnels are the report you'll actually watch every Monday. Here you pay for servers, not traffic, and events stay in your ClickHouse. Spin it up on the $5 trial and see your own funnel.

Railway is a singular platform to deploy your infrastructure stack. Railway will host your infrastructure so you don't have to deal with configuration, while allowing you to vertically and horizontally scale it.

By deploying OpenPanel Funnels on Railway, you are one step closer to supporting a complete full-stack application with minimal burden. Host your servers, databases, AI agents, and more on Railway.

### Railway vs Other Hosting Providers and VPS for OpenPanel Funnels self hosting

OpenPanel runs seven services, and each provider makes you wire them differently.

| Provider | What You Get with Railway | What You Get with the Other Provider |
| --- | --- | --- |
| DigitalOcean | One project, private networking, one public domain. | Droplets or App Platform; no managed ClickHouse. |
| AWS | Generated secrets and a TLS proxy out of the box. | ECS or EC2 plus VPC, ALB and security groups first. |
| Hetzner | Per-service logs, metrics and scaling in one canvas. | Cheap VMs, but you own Compose, backups and certs. |

## Common Use Cases for hosted OpenPanel Funnels

- **Signup to activation:** Funnel `sign_up` into `project_created` and `first_event_received` to see where new accounts stall before they ever see value.
- **Pricing page to paid:** Step one as `pricing_viewed`, step two as `checkout_started`, step three as `subscription_created`, filtered by property so only real plan clicks count.
- **Onboarding checklist completion:** Group related events as one step, then read the time between steps to find the checklists people abandon halfway through.
- **A/B variant comparison:** Build the funnel once, add a breakdown on your variant property, and compare conversion per variant in a single chart instead of two reports.
- **Checkout drop-off:** Track each checkout stage as a step and watch the biggest drop-off, then open session replay for the sessions that quit at that exact step.

## Dependencies for OpenPanel Funnels Docker hosted on Railway

Funnels don't add a service. A funnel report is a query over events you already sent, so the dependencies are the seven services in this template and the SDK snippet that feeds them. No separate funnel engine, no SaaS key.

### Deployment Dependencies for Managed OpenPanel Funnels Service (Product Analytics)

op-proxy (caddy:2-alpine, port 8080) is the only public service, routing /api/* to op-api and the rest to op-dashboard. op-api runs migrations on start, op-worker drains op-redis 8.2.1, profiles and projects sit in op-postgres 17, and funnel events land in op-clickhouse 25.12 with a volume at /var/lib/clickhouse. Health check: /api/healthcheck.

### Implementation Details for OpenPanel Funnels (Using OpenPanel official docker image)

Images are lindesvard/openpanel-*:2.3.0, digest-pinned, so a redeploy won't quietly change how a step is counted. API_HOST is :: for IPv6, the Caddyfile comes from CADDYFILE, and SELF_HOSTED=true keeps the dashboard on your own API. Point the SDK apiUrl at https://your-domain/api or reports stay empty.

## How does OpenPanel Funnels compare against other funnel analytics tools

### OpenPanel vs Mixpanel (Mixpanel Alternative)

- **Where OpenPanel wins:** funnels read events in your own ClickHouse, with no sampling and no per-event bill.
- **Step building:** one event or a group per step, property filters, drop-off and time between steps.
- **Where Mixpanel wins:** more funnel options and report polish for non-technical teams.

### OpenPanel vs PostHog (PostHog Alternative)

- **Scope:** OpenPanel is analytics only; PostHog bundles flags, experiments and a wider SDK surface.
- **Funnels:** built from existing events, with breakdowns, next to retention and replay on one dashboard.
- **Where PostHog wins:** the all-in-one workflow, though its hobby self-host is limited and both want real infrastructure.

### OpenPanel vs Amplitude (Amplitude Alternative)

- **Data ownership:** events stay in your Railway project; profiles in Postgres, events in ClickHouse.
- **Cost shape:** unlimited self-hosted events instead of a bill that scales with volume.
- **Where Amplitude wins:** behavioral cohorts, templates and governance are deeper out of the box.

### OpenPanel vs GA4 funnel exploration (GA4 Alternative)

- **Joining:** GA4 exploration is tied to its interface and session scoping; OpenPanel joins steps by profileId across sessions.
- **Breakdowns:** split by plan, country, device or experiment variant, like a GROUP BY on a property.
- **Where GA4 wins:** free to start, already on most marketing sites, exports to BigQuery.
- **Naming:** neither tool fixes sloppy event names, and renames split funnel history.

## How to use OpenPanel Funnels (the OSS product analytics platform)?

1. Open your Railway domain, create the first account, and note that registration closes after it.
2. Create a project and a client, then copy the client id.
3. Add the web SDK with that client id and point apiUrl at your domain plus /api.
4. Track steps with properties, then identify the user after login:

```js
op.track("sign_up", { plan: "pro" });
op.identify({ profileId: "user-123" });
```

5. Create a report, pick the step events, switch the chart type to Funnel, add a breakdown such as plan, and save it to a dashboard.

No funnel-specific tracking is needed: each step is an event you already send, and the report shows drop-off and time between steps.

## How to self host OpenPanel Funnels on other VPS Services (OpenPanel self hosting guide)

### Clone the Repository

No clone needed: upstream replaced the old ./setup script with the openpanel CLI, a single binary.

```bash
curl -fsSL https://raw.githubusercontent.com/Openpanel-dev/openpanel/main/self-hosting/install.sh | sh
```

### Install Dependencies

Any x64 or arm64 Linux server with Docker (the CLI offers to install it) and at least 4 GB RAM. It installs the current upstream release, which may be newer than the 2.3.0 this template pins.

### Configure Environment Variables

`openpanel init` asks for your URL, whether to run Postgres, ClickHouse and Redis for you, Caddy or your own proxy, and an optional Resend key. Secrets are generated into ~/openpanel.

```bash
openpanel init --yes --domain https://your-domain
```

### Start the OpenPanel Funnels Application

```bash
openpanel up
```

Create the first account, then point the SDK apiUrl at https://your-domain/api. Railway handles the reverse proxy, secret generation, migrations on boot and volume-backed persistence, so you skip all of it.

## Official Pricing of OpenPanel Funnels (OpenPanel pricing)

Self-hosting is free under AGPL-3.0, so you pay only Railway infrastructure. Cloud pricing is by monthly events with everything else unlimited: 5K events $2.50/mo, 100K $20/mo, 1M $90/mo, 10M $350/mo, two months free on yearly, 30-day trial. Funnels aren't a paid add-on: a funnel is a report over events you already store, so cost tracks volume, not steps, and nothing is metered per report.

## OpenPanel Funnels cloud vs self hosted comparison (Pricing, features, costs, and more)

Cloud bills scale with events; this stack doesn't. The same funnel report runs either way, and self hosting keeps step data and replay in your own project.

### Monthly cost of self hosting OpenPanel Funnels on Railway

About $20-40/mo at low volume, since ClickHouse, Postgres, Redis and four app services all run, and it grows with event volume and replay storage. Railway's $5 trial covers the first look; after that you pay for compute, not per funnel step.

### System Requirements for Hosting OpenPanel Funnels on a VPS

Roughly 4 vCPU and 8 GB RAM keeps ClickHouse, Postgres, Redis, the API, worker and dashboard comfortable, plus disk for events and replay clips. Budget storage before you ship the SDK, because a chatty checkout funnel writes rows fast.

## Frequently Asked Questions (FAQs)

### Do I need special funnel tracking?

No. Funnels are a report type built from events you already send with op.track, so there's nothing extra to instrument.

### How are steps joined across sessions?

Call op.identify({ profileId: "user-123" }) after login. Events before and after that point attach to one profile, so a step taken in a later session still counts.

### Can one step be several events?

Yes. Each step takes one event or a group of events plus optional property filters, so "viewed pricing" or "opened checkout" can sit in the same step.

### How do I compare A/B variants?

Add a breakdown on your variant property. It splits the funnel like a GROUP BY, giving conversion per variant instead of one blended number.

### Is data sampled?

No. Every event counts, and the report shows conversion, drop-off and time between steps per step.

### Where is the data stored?

Events land in op-clickhouse, profiles and projects in op-postgres, and the queue runs through op-redis inside your own Railway project. Nothing leaves it.


## Similar templates

- [Typesense Multilingual](https://railway.com/deploy/deploy-typesense-multilingual-search) — Locale-aware multilingual search with Typesense
- [Formbricks | Open-Source Typeform & Qualtrics Alternative](https://railway.com/deploy/formbricks-surveys) — Surveys, NPS and in-app feedback on your own Postgres, Hub and Cube
- [Typesense PHP](https://railway.com/deploy/typesense-php) — official PHP client against Railway

Open this page in a browser: https://railway.com/deploy/deploy-openpanel-funnel-analytics
