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_id excluded). Vercel preview and dev. hosts are excluded.
  • Counting: unique persons. "Funnel" below means ordered steps inside a 30-day window unless it says "ever did".

TL;DR

  1. 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.
  2. The site sends visitors nowhere. 79% of visitors see one page. Only 3% click the main "Build" CTA, and 4% reach /pricing.
  3. 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.
  4. The Arc form blocks its own leads. 5 of the 11 people who tried to sign up on /build hit build_freemail_blocked (Gmail and similar). None of the 5 came back.
  5. Demo bookings come from outbound, not the site. 10 of 13 book_a_demo_redirect users landed straight on /book-a-demo with no referrer, so they came from links in emails or DMs.
  6. The Socrata migration play has no web presence yet. /compare/socrata had 43 visitors all-time and 11 in the last 90 days.
  7. 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 $identify has 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_clicked and home_cta_band_clicked all send people to build. No CTA on the site links to Cloud any more.
  • Result: Arc now gets the traffic, but its free-email block and a thin /build page 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 groupUsersWhat it tells us
/ home4,957Most traffic lands here and leaves
/blog/*1,352Metadata posts lead (metadata-standards 155, basics-of-metadata 115), then decoupled-CKAN (129, NASA post 80)
/docs/* (OSS framework)1,108setup 153, creating-new-datasets 126, i.e. open-source developers
/data-portals557Solution page
/pricing509Evaluators. pricing_cost_savings_view 64 users, annual toggle 15
/case-studies*535Transport hub (74) and Lincolnshire (52) lead
/openmetadata, /ckan, /datahub, /purview283 / 207 / 87 / 43Integration / SEO pages
/compare/*~355 totalOpenDataSoft 65, CKAN 54, Socrata 43, DKAN 36, ArcGIS Hub 28
/build (Arc, launched Jul)136The 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_blocked hit 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/signup before 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_portal was used by 22 people on /datasets and 20 on /dashboard.
  • $exception: 20 users since 2026-08-24. I did not dig into these here.

6. Measurement gaps (fix before next analysis)

  1. Arc sign-up isn't stitched to the web visitor. arc_signup_completed is sent server-side with its own distinct_id, so 5 of 7 sign-ups have no web history. Fix: call posthog.identify(arc_user_id) in the browser after the magic link lands, or alias the server ID to the browser distinct_id.
  2. No $identify anywhere in the last 30 days, on either Cloud or Arc. You can't tie visitors to accounts or companies.
  3. Arc activation isn't tracked. Add portal_deployed (the <slug>.arc.portaljs.com going live), dataset_added and custom_domain_set.
  4. Cloud /auth/signup pageview 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.
  5. 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.
  6. 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 use auth_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.
  • Socrata play: /compare/socrata gets 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.
Built with LogoFlowershow