PortalJS website funnel analysis
PortalJS website funnel analysis
Source: PostHog, org PortalJS, project PortalJS LP (id 123619, EU cloud). Covers www.portaljs.com, cloud.portaljs.com, civic. / research. demos. Answers the TODO in scq-2026-09-28: "usage data … but no recent funnel analysis".
- Windows: full history 2026-02-01 → 2026-09-28 (tracking starts 9 Feb), and Q3 = 2026-07-01 → 2026-09-28, which is the current site (every CTA points to Arc
/build). - Filters: project test-account filters (no localhost; the 1919×1080 / 800px viewport bot rules; internal
arc_user_idexcluded). Vercel preview anddev.hosts are excluded. - Counting: unique persons. "Funnel" below means ordered steps inside a 30-day window unless it says "ever did".
TL;DR
- Traffic is small and flat. About 1k tracked www visitors a month. Roughly a third of them look like bots: in Q3, "Direct" traffic from CN/SG/HK was about 1.1k users, 92% bounce in CN. That leaves about 700 real humans a month.
- The site sends visitors nowhere. 79% of visitors see one page. Only 3% click the main "Build" CTA, and 4% reach
/pricing. - Self-serve sign-ups fell about 70% in Q3. In July the site switched every CTA from Cloud to Arc (
/build). Around the same time paid search was cut (about 99 → 17 visitors a month). Cloud sign-ups dropped from 21/mo (Apr) to 0 (Sep). Arc picked up only about 7 new accounts. Q2 (Apr–Jun) had 40 self-serve sign-ups; Q3 had about 12. - The Arc form blocks its own leads. 5 of the 11 people who tried to sign up on
/buildhitbuild_freemail_blocked(Gmail and similar). None of the 5 came back. - Demo bookings come from outbound, not the site. 10 of 13
book_a_demo_redirectusers landed straight on/book-a-demowith no referrer, so they came from links in emails or DMs. - The Socrata migration play has no web presence yet.
/compare/socratahad 43 visitors all-time and 11 in the last 90 days. - Measurement gaps hide the bottom of the funnel. Arc sign-ups are recorded server-side under a different ID, so only 2 of 7 link back to a web visit. No
$identifyhas fired in 30 days. There is no "portal deployed" event for Arc. Bots are not filtered.
1. Funnel: current site (Q3, 2026-07-01 → 09-28)
"Ever did" counts per person, test filters applied.
┌──────────────────────────────────────┐
│ Visitors to www.portaljs.com │
│ 3,204 tracked (~2,100 excl. bots) │
└──────────────────┬───────────────────┘
│ 79% leave after 1 page
▼
┌──────────────────────────────────────┐
│ Engaged (2+ pages) 667 (21%) │
└──────────────────┬───────────────────┘
│
┌────────────────────────────┼─────────────────────────────┐
▼ ▼ ▼
┌─────────────────┐ ┌───────────────────────┐ ┌────────────────────┐
│ LEARN / BROWSE │ │ EVALUATE │ │ BUILD INTENT │
│ docs 591 │ │ /pricing 186 │ │ clicked Build CTA │
│ blog 512 │ │ case studies 134 │ │ (hero/nav/band) 95 │
│ (open-source │ │ /compare/* 64 │ │ │
│ devs, metadata │ │ socrata only ~11 │ │ viewed /build 124 │
│ readers) │ │ │ │ (3.9%) │
└─────────────────┘ └───────────┬───────────┘ └─────────┬──────────┘
│ │
┌───────────────────┼──────────┐ ▼
▼ ▼ │ ┌────────────────────────┐
┌──────────────────┐ ┌─────────────────┐ │ │ Tried to sign up 11 │
│ Pricing tier CTA │ │ Book-a-demo │ │ └───────┬───────┬────────┘
│ 9 (0.3%) │ │ click 8 (13*) │ │ │ │
│ 6 = "Open Source"│ │ *10/13 arrive │ │ freemail ▼ ▼ submitted
└──────────────────┘ │ direct from │ │ blocked ┌─────┐ ┌─────┐
│ outbound links │ │ │ 5 │ │ 6 │
└─────────────────┘ │ │ 0 │ └──┬──┘
│ │ came│ ▼
│ │ back│ ┌──────────────────┐
│ └─────┘ │ Arc account │
│ │ created (new, │
▼ │ external) ~7 │
┌──────────────────────┐ │ only 2 linked to │
│ Reached Cloud 31 │ │ web visit │
│ → Cloud sign-up 2 │ └────────┬─────────┘
└──────────────────────┘ ▼
┌──────────────────┐
│ Portal deployed │
│ ?? not tracked │
└──────────────────┘
Headline Q3 conversion: 3,204 visitors → about 9 self-serve accounts (7 Arc + 2 Cloud) = 0.3%. Paid: 0.
2. Funnel: Cloud self-serve (full history, 2026-02-01 → 09-28)
Ordered PostHog funnels, 30-day window.
┌────────────────────────────────────────────┐
│ Visit www.portaljs.com 8,431 │
└─────────────────────┬──────────────────────┘
│ 96.2% never go to Cloud
▼
┌────────────────────────────────────────────┐
│ Reach cloud.portaljs.com 320 (3.8%) │ (606 Cloud visitors in total;
└─────────────────────┬──────────────────────┘ many arrive direct / from Ads)
▼
┌────────────────────────────────────────────┐
│ Cloud sign-up successful 52 (0.62%) │ ← all-time unique sign-ups: 63
└─────────────────────┬──────────────────────┘
│ ~77% never create a dataset
▼
┌────────────────────────────────────────────┐
│ Created a dataset 12 (0.14%) │ (median 12 min after sign-up)
└─────────────────────┬──────────────────────┘
▼
┌────────────────────────────────────────────┐
│ Paid ?? no data │
└────────────────────────────────────────────┘
Inside Cloud, starting from any Cloud visit: 606 → /auth/signup page 78 → confirm click 31 → success 25 → dataset 9. The sign-up form itself converts well (81% of people who click confirm succeed). The losses happen before anyone reaches the form, and after sign-up, at activation.
3. What changed: monthly trend
month www users paid-search Cloud visitors Cloud sign-ups Arc sign-ups*
───── ───────── ─────────── ────────────── ────────────── ────────────
Feb 962 6 92 7 –
Mar 1,396 17 106 17 –
Apr 868 99 176 21 ◄ peak –
May 789 97 123 13 –
Jun 1,447 81 97 6 –
Jul 1,115 83 60 2 1
Aug 985 30 50 3 5
Sep 1,153 17 37 0 1
* new, external,
server-side event
- Cloud sign-ups by source (all-time, 63): about 1/3 Paid Search (Google), then Direct, then referrals from
datopian.com,datahub.io, GitHub and OpenSpending. Paid Search was the biggest single driver. Cutting it in August lines up with the drop. - CTA destinations (from event props): since July,
hero_cta_link_clicked,hero_build_clicked,nav_cta_clickedandhome_cta_band_clickedall send people tobuild. No CTA on the site links to Cloud any more. - Result: Arc now gets the traffic, but its free-email block and a thin
/buildpage convert worse than the old Cloud path did.
4. Who is looking at what
Acquisition (www, Feb → Sep):
Direct ████████████████████████████████████ 4,998 (inflated by CN/SG/HK bots)
Organic Search ████████████ 1,687
Referral █████ 707 (datahub.io, github, datopian.com,
openspending.org, reddit)
Paid Unknown ████ 614 (Feb–Mar display junk:
com.tinder, financeseveryday.online; 64% bounce)
Paid Search ███ 424
Organic Social █ 108
AI (ChatGPT…) ▏ 40
Top content (unique visitors, Feb → Sep):
| Page group | Users | What it tells us |
|---|---|---|
/ home | 4,957 | Most traffic lands here and leaves |
/blog/* | 1,352 | Metadata posts lead (metadata-standards 155, basics-of-metadata 115), then decoupled-CKAN (129, NASA post 80) |
/docs/* (OSS framework) | 1,108 | setup 153, creating-new-datasets 126, i.e. open-source developers |
/data-portals | 557 | Solution page |
/pricing | 509 | Evaluators. pricing_cost_savings_view 64 users, annual toggle 15 |
/case-studies* | 535 | Transport hub (74) and Lincolnshire (52) lead |
/openmetadata, /ckan, /datahub, /purview | 283 / 207 / 87 / 43 | Integration / SEO pages |
/compare/* | ~355 total | OpenDataSoft 65, CKAN 54, Socrata 43, DKAN 36, ArcGIS Hub 28 |
/build (Arc, launched Jul) | 136 | The only CTA target |
Geography (www): US 2,034, then CN 1,685 (mostly bots), UK 576, DE 423, SG 390 (mostly bots), IN 296, CA 280.
Homepage engagement: 72 users switched the hero between "terminal" and "chat" modes, 12 copied the CLI command, and 29 clicked "Build". People like playing with the hero, but it rarely leads anywhere.
5. Friction and product signals
- Arc free-email block:
build_freemail_blockedhit 5 people (one of them 3 times). They came from Google and OpenSpending, and all 5 dropped. That is almost half of Arc sign-up intent lost. - Cloud sign-up UX: there are rage-clicks on
/auth/signupbefore confirm (for example a BR user took 7 minutes and several rage-clicks to sign up on 2026-08-19), and repeated rage-clicks on/auth/signin(US, GB, Sep). - Existing Cloud clients: Catalan users (Espai de Dades) rage-clicked on dataset and organization edit pages on 2026-09-24. That is a UX pain point for a paying client.
- Cloud activation: fewer than 1 in 4 new sign-ups create a dataset.
button_click_visit_my_portalwas used by 22 people on/datasetsand 20 on/dashboard. $exception: 20 users since 2026-08-24. I did not dig into these here.
6. Measurement gaps (fix before next analysis)
- Arc sign-up isn't stitched to the web visitor.
arc_signup_completedis sent server-side with its owndistinct_id, so 5 of 7 sign-ups have no web history. Fix: callposthog.identify(arc_user_id)in the browser after the magic link lands, oraliasthe server ID to the browserdistinct_id. - No
$identifyanywhere in the last 30 days, on either Cloud or Arc. You can't tie visitors to accounts or companies. - Arc activation isn't tracked. Add
portal_deployed(the<slug>.arc.portaljs.comgoing live),dataset_addedandcustom_domain_set. - Cloud
/auth/signuppageview is missed for client-side navigation. 25 people got through the typed funnel, but there are 63 unique sign-ups. Enable history-change pageviews in posthog-js. - Bots. Add a bot-filter rule (or a cohort filter) for the CN/SG/HK direct traffic. Today about 1/3 of "visitors" are noise.
- No revenue or pipeline event. Link Stripe or the CRM (Twenty) so the funnel can end at "paid / opportunity".
7. Implications for the SCQ question
- The funnel has no top. About 700 real visitors a month cannot feed a self-serve business, whatever the conversion rate. Growth has to come from content/SEO (metadata and decoupled-CKAN posts already pull people in), the partner channel, and outbound (which already produces the demo bookings).
- Switching all CTAs to Arc cost Cloud its funnel and did not replace it. This is the Arc-versus-Cloud overlap from the SCQ, visible in the data. Decide one primary path. Or split by intent: "Build it yourself (Arc, free)" versus "Managed portal (Cloud / Enterprise, book a demo)", each with its own CTA.
- Quick wins:
- Allow free-email sign-ups on
/build, or offer GitHub sign-in there. Several Arc sign-ups already useauth_provider=github. - Put a Cloud / Enterprise CTA back on the homepage and
/pricing. - Restart a small, well-targeted Google Search campaign. It was the best Cloud sign-up source. Don't bring back display: its "Paid Unknown" traffic was junk.
- Allow free-email sign-ups on
- Socrata play:
/compare/socratagets about 4 visitors a month. A migration offer needs dedicated landing pages and content, and outbound pointing at them. The site on its own won't do it.