PortalJS: state of the nation and next 6 months — conversion report
PortalJS: state of the nation and next 6 months — conversion report
| Source | projects/portaljs-sep-2026/scq-2026-09-28.md (rev 1), reviewer comments 1 (rev 2), 2 (rev 3), 3 (rev 4), 4 (rev 5), 5 and 6 (rev 6), 7 and 8 (rev 7), at the end; projects/rfp-process-improvement WIN-LOSS-PICTURE.md and REJECTED-RFP-FEEDBACK-CORPUS.md (rev 6); Claude-drafted plan (rev 4); projects/portaljs-sep-2026/funnel-analysis-2026-09-28.md (rev 2) |
| Digest | 549b2881…7691 scq-2026-09-28.md |
0b761953…4e1e funnel-analysis-2026-09-28.md | |
| Pages | text sources; SCQ 37 lines, funnel analysis 185 |
| Pages read | all |
| Reading conditions | clean Markdown |
| Converted | 2026-09-28 |
| Candidate | portaljs-next-6-months-2026-09-28.ltp.yaml |
check:import | not run: no Reason Commons app checkout. A local structural check passed (see Validator output) |
What the file claims
124 propositions, 124 roles, 68 relationships, 9 assumptions, 0 assessments.
goal 13 · conflict 5 · current_reality 73 · future_reality 11 · prerequisite 11 · transition 11
Revision 2 (2026-09-28). The SCQ is now frozen; this LTP is the working form. Adds reviewer comment 1 and Anuar's PostHog funnel analysis as sources:
- Goal: adds the stated near-term goal, the team using Arc/Studio to build many portals fast and demo them as outreach (g-e-team-builds-demos), with the framework mattering only as it supports Arc. The rev 1 funnel goal stays as a second, longer-term candidate. The reviewer flags the near-term goal as small next to the self-serve ambition (g-e-goal-small).
- Current reality: adds the PortalJS goal is undefined as a root cause, listing four candidate goals, with no owner named for any of them. Adds 11 funnel findings as evidence and effects.
- Removed: r-e-no-funnel-analysis and f-e-funnel-analysis, because the analysis now exists.
Revision 3 (2026-09-28) adds reviewer comment 2. It narrows the focus to government data portals and says self-serve sign-up is the wrong path for them:
- Goal: adds a third goal, win government data portal customers (g-e-win-gov-portals). Its conditions are a demo video plus book-a-call offer, and measuring calls booked. This partly answers r-e-goal-undefined; see call 9.
- Current reality: Cloud sign-ups were never serious and none converted. Buyers are governments, and they want to talk, so self-serve sign-up fails for them. Calls booked aren't tracked. Three possible markets are named. Datopian's PortalJS business is confined to government, outside enterprise.
- Conflict (drafted by Claude, parked by the reviewer): a government focus vs a self-serve publishing experience for data engineers as the route back into enterprise. The reviewer said the tension distracts energy, and asked to record it and leave it for now.
- Future reality: a government landing page with demo video and book-a-call; tracking calls booked; removing self-serve sign-up from the government path; and, if any self-serve remains, routing it through Arc and measuring portals deployed.
- Weakened: the Cloud sign-up collapse (r-e-cloud-signups-collapsed) now matters less, because those sign-ups weren't serious. Call 8 is largely moot.
Revision 4 (2026-09-28) adds reviewer comment 3, which settles the goal structure and asks for the next step:
- One goal for the next 6 months: win government data portal customers. "Team builds demos fast with Arc" is now a critical success factor under it. "Framework supports Arc" is a necessary condition under that. The rev 1 funnel goal and its two CSFs are re-roled to
observation, and their twonecessary_forlinks are removed. They stay in the file as a record, not as goals. - Markets: "junior data engineers" and "the old DataHub market" are the same market: quick self-serve publication of one dataset or a catalog. r-e-three-markets and r-e-publication-market are reworded to match. There are still three markets: government portals, enterprise, and self-serve publication.
- Prerequisite and transition trees for the demo-and-call path, drafted by Claude. See Drafted plan (rev 4). Obstacles come from the sources where they can; objectives and actions are Claude's proposals, awaiting the reviewer's check. No conflict, prerequisite or transition view. See Not in this file.
Revision 5 (2026-09-28) adds reviewer comment 4. Outreach is the critical success factor; the site is minor:
- Goal tree under "win government data portal customers":
- cold outreach carrying a prototype of the prospect's own portal (new CSF)
- team builds demos fast with Arc (moved here from a direct CSF: prototypes exist for outreach)
- framework supports Arc
- team builds demos fast with Arc (moved here from a direct CSF: prototypes exist for outreach)
- known before RFP: be in the buyer's mind before their contract goes to RFP (new CSF)
- RFP capability: most government contracts go via RFP, so we must respond well even when already in the door (new CSF)
- demo video + book-a-call (kept)
- calls booked measured (kept)
- cold outreach carrying a prototype of the prospect's own portal (new CSF)
- Current reality: buyers don't arrive at the site on their own; most contracts go via RFP; a contact may be 12 months from renewal; a simple prototype of their site impresses buyers; power users building their own portals are a potential route to open-source users, awareness and an alternative marketplace (background; parked with the self-serve conflict, tracked as bead da-47g).
- Plan: the reviewer generally agrees with the drafted demo-and-call plan, and notes most of it applies whatever the channel. Action 7 now reads: link the landing page, and the prospect's own prototype where one exists, from every cold outreach email.
- Link to the e2e project: cold outreach and RFPs are the same biz dev engine as
projects/e2e-operators(bead da-3y4: weekly biz dev day, prospecting tool, Daniela as champion). This file doesn't duplicate that plan. The overlap is natural and intentional (reviewer, comment 5).
Revision 5b (2026-09-28), reviewer comment 5: r-e-buyers-dont-arrive softened to most buyers, since some find the site or have used PortalJS first (as CDT did). The plan's actions are now beads under epic da-55j (the separate actions.md was later removed; beads are the only action list).
Revision 6 (2026-09-28): the current reality tree is rebuilt against the government goal. In rev 5 it was a list: 56 items, 31 unlinked, no core problem, and effects framed for the old self-serve goal. Claude proposed "effort drifted to self-serve" as the root cause. The reviewer rejected that (comment 6 P7: "I don't think it's that we drift into self-serve SaaS. That hasn't happened.") and named the causes below. The RFP win/loss analysis supplies the evidence.
FEW GOVERNMENT RFP WINS (3 of 30, to Jun 2026)
▲ evidence: all 3 wins invited/relationship-led; 0 cold wins
┌──────────────────┼───────────────────────┬──────────────────────────┐
causes causes contributes_to contributes_to
│ │ │ │
No prior contact: Weak RFP responses: Lost to OpenDataSoft ◀─causes─┘ (weak responses)
we bid cold don't show, criterion ▲ contributes_to: quality not made visible
▲ causes by criterion, that we ▲ contributes_to: open source seen as cheap
│ meet each requirement ▲ evidence: Toulouse 41 vs 85
LITTLE COMPELLING ▲ evidence: Toulouse gaps;
OUTBOUND / VISIBILITY generic, non-compliant FEW PARTNERS in the
(root) proposals jurisdictions we bid
▲ evidence: ~700 (root) ─contributes_to─▶ few wins
real visitors/mo QUALITY NOT MADE VISIBLE (root) ▲ partner often needed
✗ challenged: partner-led
sub-bids have won nothing
Roots: little outbound/visibility, quality not made visible (few partners was dropped as speculative in comment 7), plus upkeep time unprotected (still linked to "upkeep dies"; call 12). The two the reviewer calls key are outbound and RFP response.
- Re-roled to
observation(off the core tree, kept as record): the self-serve branch (r-e-little-self-serve, arc-cloud-compete, arc-earns-nothing, arc-free, arc-cloud-both-host, site-sends-nowhere, ctas-to-arc, cloud-signups-collapsed, freemail-blocked, cloud-low-activation, gov-want-to-talk, self-serve-fails-gov); r-e-goal-undefined (now resolved); r-e-stuck-in-gov (parked conflict); r-e-no-socrata-play. r-e-low-traffic becomes evidence of low visibility. - Future reality: adds feature evidence per RFP criterion, partners in bid jurisdictions, and a refreshed RFP analysis.
- New bead
da-4pl: refresh the RFP win/loss analysis (it's a June snapshot with 12 of 30 outcomes open).
Revision 7 (2026-09-28), comments 7–8. Closing state of this analysis.
- Root under outbound: "no dedicated, systematic biz dev time" is added as the root cause of little outbound (call 12, confirmed). Little outbound becomes an intermediate cause.
- Goal: adds "PortalJS stays visibly active" (changelog, community) as a condition of the government goal.
- The main engine (comment 8 P1): systematically build PoCs and email people, from the contact database already in Twenty (to be enriched). Added as a future-reality change, enabled by dedicated biz dev time.
- Owner: Daniela, proposed, because the path overlaps her biz dev role. To confirm (da-55j.1).
- Self-serve "someday": bead da-47g is deferred. It's not in the 6-month focus.
- New beads: 55j.9 systematic PoC + email outreach (P1, Daniela); 55j.10 OpenDataSoft feature comparison; 55j.11 RFP evidence pack; 55j.12 keep PortalJS visibly active.
Items
| id | view | role | locator | conf. | from the source | note |
|---|---|---|---|---|---|---|
| g-e-working-funnel | goal | goal | L37 | low | "turn PortalJS into a working marketing and self-serve funnel" | the SCQ's candidate question read as a goal; call 1 |
| g-e-clear-paid-path | goal | critical_success_factor | L37 | low | "a clear, paid path from framework → Arc/Studio → Cloud (incl. enterprise)" | call 1 |
| g-e-capture-migration | goal | critical_success_factor | L37 | low | "capture the Socrata / proprietary-portal migration market" | call 1 |
| r-e-three-portaljses | current_reality | observation | L9 | high | "There are now three PortalJSes" | |
| r-e-arc-builds-and-hosts | current_reality | observation | L11 | high | "AI-driven builder and deployer… Lightweight hosting" | "maybe to be renamed Studio" left out; call 4 |
| r-e-arc-free | current_reality | root_cause | L11 | high | "Free today, no pricing model." | |
| r-e-cloud-managed-ckan | current_reality | observation | L12 | high | "hosted, multi-tenant, CKAN-backed PortalJS" | |
| r-e-enterprise-option | current_reality | observation | L13 | high | "enterprise option: dedicated cluster / servers per client (e.g. CDT)" | |
| r-e-enterprise-not-presented | current_reality | undesirable_effect | L13, L31 | high | "not clearly presented as part of Cloud" | L31 restates it as a complication |
| r-e-hosting-mostly-bespoke | current_reality | observation | L14 | medium | "Most client hosting is still bespoke / enterprise-dedicated" | numbers TODO in source |
| r-e-queryless-out | current_reality | observation | L15 | high | "Queryless is out." | |
| r-e-own-ai | current_reality | evidence | L15 | high | "people already have their own AI… via MCP or API" | |
| r-e-competitors | current_reality | observation | L16 | high | "competitors are OpenDataSoft, Socrata (Tyler), Esri ArcGIS Hub, and new entrant EntryScape" | |
| r-e-lost-to-ods | current_reality | undesirable_effect | L17 | high | "We have lost several deals to OpenDataSoft." | |
| r-e-no-ods-comparison | current_reality | observation | L17 | high | "We have no feature comparison with them." | not linked to lost deals; call 2 |
| r-e-socrata-eroding | current_reality | observation | L18 | medium | "Socrata market looks to be eroding" | hedge kept as "appears" |
| r-e-nasa-moved | current_reality | evidence | L18 | high | "NASA moved Socrata → CKAN" | |
| r-e-socrata-consultants | current_reality | observation | L19 | high | "exchanged emails, no ongoing relationship" | |
| r-e-discord-quiet | current_reality | evidence | L21 | medium | "Discord had active involvement (Joao) but nothing for months" | named person dropped from statement |
| r-e-no-changelog | current_reality | observation | L22 | high | "No visible changelog on the site" | |
| r-e-onboarding-unclear | current_reality | observation | L23 | high | "Sign-up / onboarding flow… is unclear" | |
| r-e-little-self-serve | current_reality | undesirable_effect | L28 | high | "Little business coming in on the self-serve end." | the central UDE |
| r-e-marketing-is-issue | current_reality | observation | L28 | medium | "The issue is now less product and more marketing" | a diagnosis, not a cause stated of a named effect; call 3 |
| r-e-arc-cloud-both-host | current_reality | root_cause | L29 | high | "Arc and Cloud both offer hosting" | |
| r-e-arc-cloud-compete | current_reality | undesirable_effect | L29 | high | "so they partly compete; no clear reason for a buyer to pick one" | |
| r-e-arc-earns-nothing | current_reality | undesirable_effect | L30 | high | "earns nothing and doesn't clearly feed Cloud" | |
| r-e-upkeep-unprotected | current_reality | root_cause | L32 | high | "upkeep isn't protected" | |
| r-e-upkeep-dies | current_reality | undesirable_effect | L32 | high | "so it dies when people get busy" | |
| r-e-no-socrata-play | current_reality | undesirable_effect | L33 | high | "no deliberate play (positioning, migration offer, partner channel)" | |
| f-e-protected-half-day | future_reality | injection | L32 | medium | "a ruthlessly protected half-day a week would make a big difference" | |
| f-e-ods-comparison | future_reality | injection | L17 | medium | "TODO: create one." | |
| g-e-team-builds-demos | goal | goal | comment 1 P3 | high | "a goal for us to be able to use it as a team to build portals very quickly and demo them to clients" | rev 2; stated as "the goal right now" |
| g-e-framework-supports-arc | goal | critical_success_factor | comment 1 P3 | medium | "the framework only matters if it supports Arc" | |
| g-e-goal-small | goal | observation | comment 1 P4 | high | "that seems quite a small near-term goal, to be frank" | the reviewer's flag; call 6 |
| r-e-goal-undefined | current_reality | root_cause | comment 1 P1 | high | "one of the issues is that our goal with PortalJS is not clear" | root cause is a call: the source calls it "one of the issues" and doesn't link it to an effect; call 7 |
| r-e-goal-owners-unclear | current_reality | observation | comment 1 P2 | medium | "it's okay to even have two goals, but owned by different people or owned by us. It's not really clear" | |
| r-e-cdt-via-portaljs | current_reality | evidence | comment 1 P1 | high | "the California Digital Department of Technology, where they came because they tried out PortalJS" | named as "California Department of Technology" (CDT) |
| r-e-datahub-marketplace | current_reality | observation | comment 1 P2 | high | "DataHub is now becoming a data marketplace that we curate quite heavily" | the DataHub-replacement option itself is inside r-e-goal-undefined |
| r-e-low-traffic | current_reality | root_cause | funnel L15 | medium | "about 700 real humans a month" | figure depends on the bot estimate |
| r-e-site-sends-nowhere | current_reality | undesirable_effect | funnel L16 | high | "79% of visitors see one page. Only 3% click the main "Build" CTA" | |
| r-e-ctas-to-arc | current_reality | intermediate_cause | funnel L123 | high | "No CTA on the site links to Cloud any more." | |
| r-e-cloud-signups-collapsed | current_reality | undesirable_effect | funnel L17 | high | "Cloud sign-ups dropped from 21/mo (Apr) to 0 (Sep)" | |
| r-e-paid-search-cut | current_reality | observation | funnel L17 | high | "paid search was cut (about 99 → 17 visitors a month)" | not linked to the collapse; call 8 |
| r-e-q3-conversion | current_reality | evidence | funnel L73 | high | "3,204 visitors → about 9 self-serve accounts… Paid: 0" | |
| r-e-freemail-blocked | current_reality | undesirable_effect | funnel L162 | high | "all 5 dropped. That is almost half of Arc sign-up intent lost" | |
| r-e-demos-from-outbound | current_reality | evidence | funnel L19 | high | "10 of 13… came from links in emails or DMs" | |
| r-e-socrata-compare-unseen | current_reality | evidence | funnel L20 | high | "11 in the last 90 days" | |
| r-e-cloud-low-activation | current_reality | undesirable_effect | funnel L165 | high | "fewer than 1 in 4 new sign-ups create a dataset" | |
| r-e-funnel-bottom-untracked | current_reality | observation | funnel L21, L175 | high | "There is no "portal deployed" event for Arc"; "No revenue or pipeline event" | the other measurement gaps are in the analysis |
| g-e-win-gov-portals | goal | goal | comment 2 P7 | medium | "if we're focusing the goal right now, it's… government open data customers or data portal customers" | rev 3; call 9 | | g-e-demo-and-call | goal | critical_success_factor | comment 2 P7 | high | "a video demo or whatever and 'book a call' is what should be offered" | | | g-e-calls-measured | goal | critical_success_factor | comment 2 P7 | high | "That's what we should be measuring: how many calls got booked" | | | c-e-grow-portaljs | conflict | cloud_objective | comment 2 P5 | low | — | drafted: the reviewer names the contention but not the shared objective | | c-e-win-gov | conflict | cloud_requirement | comment 2 P3 | medium | "Our customers, like buying customers, are governments" | drafted | | c-e-energy-on-gov | conflict | cloud_prerequisite | comment 2 P7 | medium | "if we're on the focal audience for government data portals" | drafted | | c-e-reach-enterprise | conflict | cloud_requirement | comment 2 P4 | high | "we want to get back into enterprise, not to be stuck in this ghetto of government stuff" | | | c-e-energy-on-self-serve | conflict | cloud_prerequisite | comment 2 P4 | medium | "expand PortalJS… into what was the old data hub publication market" | | | r-e-signups-not-serious | current_reality | observation | comment 2 P1 | medium | "There was just spam or something like that… we didn't have a lot of serious signups" | | | r-e-no-signup-converted | current_reality | evidence | comment 2 P1 | high | "even in April, not one of those converted to a customer" | | | r-e-buyers-are-gov | current_reality | observation | comment 2 P3 | high | "Our customers, like buying customers, are governments" | | | r-e-gov-want-to-talk | current_reality | root_cause | comment 2 P3 | high | "they don't really need this [self-serve] experience… they just want to speak" | "learned with Joao"; "task experience" read as a transcription of "self-serve experience" | | r-e-self-serve-fails-gov | current_reality | intermediate_cause | comment 2 P7 | high | "This isn't a classic SaaS model… It's not going to work that way" | | | r-e-calls-not-tracked | current_reality | undesirable_effect | comment 2 P7 | high | "how many calls got booked, and that's not in Posthog" | | | r-e-stuck-in-gov | current_reality | undesirable_effect | comment 2 P4 | medium | "not to be stuck in this ghetto of government stuff" | | | r-e-three-markets | current_reality | observation | comment 2 P6 | medium | "Those are three different markets." | the three are read from a run-on sentence; call 10 | | r-e-publication-market | current_reality | observation | comment 2 P4 | medium | "there are a lot of people out there… data engineers" | Evidence.dev named as a comparable; left out of the statement | | r-e-self-serve-gateway | current_reality | observation | comment 2 P5 | medium | "they're also a gateway into more enterprise customers, potentially" | hedge kept as "potential" | | f-e-gov-landing | future_reality | injection | comment 2 P8 | high | "a dedicated landing page… is a video and a sign-up for a call" | | | f-e-track-calls | future_reality | injection | comment 2 P7 | high | "That's what we should be measuring" | | | f-e-drop-gov-signup | future_reality | injection | comment 2 P7 | high | "that's just a complete waste of time and should go away" | | | f-e-arc-deploys-metric | future_reality | injection | comment 2 P8 | medium | "if we want self-service signups, it would be people who are using Arc and deploying" | conditional in the source |
Confidence: high — one sentence states it. medium — hedged, assembled, or the view was a call. low — read from a question.
Relationships asserted
| id | kind | from → to | locator | the sentence that asserts the link |
|---|---|---|---|---|
| g-rel-path-for-funnel | necessary_for | g-e-clear-paid-path → g-e-working-funnel | L37 | "a working marketing and self-serve funnel — a clear, paid path from…" (the dash defines the funnel as the path) |
| g-rel-migration-for-funnel | necessary_for | g-e-capture-migration → g-e-working-funnel | L37 | "…and use it to capture the Socrata / proprietary-portal migration market" — weak; call 1 |
| r-rel-both-host-causes-compete | causes | r-e-arc-cloud-both-host → r-e-arc-cloud-compete | L29 | "Arc and Cloud both offer hosting, so they partly compete" |
| r-rel-free-causes-earns-nothing | causes | r-e-arc-free → r-e-arc-earns-nothing | L30 | "Arc is free with no pricing, so the most self-serve piece earns nothing" |
| r-rel-unprotected-causes-dies | causes | r-e-upkeep-unprotected → r-e-upkeep-dies | L32 | "upkeep isn't protected, so it dies when people get busy" |
| r-rel-nasa-supports-eroding | supports | r-e-nasa-moved → r-e-socrata-eroding | L18 | "customers moving to open source or cutting costs (e.g. NASA moved Socrata → CKAN)" |
| r-rel-own-ai-supports-queryless | supports | r-e-own-ai → r-e-queryless-out | L15 | "Queryless is out. Hard to make reliable, and people already have their own AI" |
| g-rel-framework-for-demos | necessary_for | g-e-framework-supports-arc → g-e-team-builds-demos | comment 1 P3 | "the framework only matters if it supports Arc" |
| r-rel-cdt-supports-goal-undefined | supports | r-e-cdt-via-portaljs → r-e-goal-undefined | comment 1 P1 | "Is it an open-source tool that is a lead generator… as happened with the California… Department of Technology" |
| r-rel-ctas-causes-cloud-collapse | causes | r-e-ctas-to-arc → r-e-cloud-signups-collapsed | funnel L180 | "Switching all CTAs to Arc cost Cloud its funnel and did not replace it." |
| r-rel-collapse-supports-compete | supports | r-e-cloud-signups-collapsed → r-e-arc-cloud-compete | funnel L180 | "This is the Arc-versus-Cloud overlap from the SCQ, visible in the data." |
| r-rel-traffic-causes-little-self-serve | causes | r-e-low-traffic → r-e-little-self-serve | funnel L179 | "About 700 real visitors a month cannot feed a self-serve business, whatever the conversion rate." (also the assumption r-a-no-top) |
| r-rel-q3-supports-little-self-serve | supports | r-e-q3-conversion → r-e-little-self-serve | funnel L73 | the headline conversion is the measurement of the SCQ's "little business on the self-serve end" |
| r-rel-compare-supports-no-play | supports | r-e-socrata-compare-unseen → r-e-no-socrata-play | funnel L185 | "A migration offer needs dedicated landing pages… The site on its own won't do it." |
| g-rel-offer-for-gov | necessary_for | g-e-demo-and-call → g-e-win-gov-portals | comment 2 P7 | "for government, they really want at most a demo video and 'book a demo' or 'book a call'. That's what we should be offering" | | g-rel-measure-for-gov | necessary_for | g-e-calls-measured → g-e-win-gov-portals | comment 2 P7 | "that's what we really want to measure" — weak as necessity | | c-rel-gov-for-growth, c-rel-enterprise-for-growth, c-rel-energy-gov-for-gov, c-rel-self-serve-for-enterprise | necessary_for | the cloud's four arms | comment 2 P4–P7 | drafted structure; only the arms' contents come from the source | | c-rel-gov-vs-self-serve | conflicts_with | c-e-energy-on-gov → c-e-energy-on-self-serve | comment 2 P5 | "maybe we need to think about if that's a contention, because it does distract our energy" (assumption c-a-energy-limited) | | r-rel-talk-causes-self-serve-fails | causes | r-e-gov-want-to-talk → r-e-self-serve-fails-gov | comment 2 P7 | "It's just that people want a demo. It's not going to work that way" | | r-rel-no-conversion-supports-fails | supports | r-e-no-signup-converted → r-e-self-serve-fails-gov | comment 2 P1 | evidence offered for the same point; no single sentence | | r-rel-gateway-supports-publication | supports | r-e-self-serve-gateway → r-e-publication-market | comment 2 P5 | "they're also a gateway into more enterprise customers" — offered as why that market matters | | g-rel-demos-for-gov | necessary_for | g-e-team-builds-demos → g-e-win-gov-portals | comment 3 P1 | "yes prioritise gov data portal customers", accepting call 9's proposed structure | | p-rel-* (12) | overcomes / necessary_for | each intermediate objective → its obstacle and → p-e-path-live | drafted plan | drafted; plus the landing page as a condition of the CTA switch and the outbound links | | t-rel-* (10) | precedes / produces | the action sequence below | drafted plan | drafted | | g-rel-outreach-for-gov, g-rel-known-for-gov, g-rel-rfp-for-gov | necessary_for | each new CSF → g-e-win-gov-portals | comment 4 P1–P3 | "the critical success factor is outreach"; "We want them to be thinking about us before they come to RFP"; "we also have to do RFP as well" | | g-rel-demos-for-outreach | necessary_for | g-e-team-builds-demos → g-e-cold-outreach | comment 4 P1 | "That's why we want to build prototype demo portals: when we're sending an email to someone" (assumption g-a-prototype-impresses) | | r-rel-no-arrival-supports-low-traffic | supports | r-e-buyers-dont-arrive → r-e-little-self-serve | comment 4 P1 | "People are not going to just show up on our site." | | r-rel-outbound-causes-no-contact | causes | r-e-little-outbound → r-e-no-prior-contact | comment 6 P3 | "We haven't done outbound, so we don't generate inbound interest." | | r-rel-no-contact-causes-few-wins | causes | r-e-no-prior-contact → r-e-few-gov-wins | comment 6 P3 | "If we bid cold on RFPs, that's very weak." (assumption r-a-cold-bids-weak) | | r-rel-weak-responses-causes-few-wins | causes | r-e-weak-rfp-responses → r-e-few-gov-wins | comment 6 P1 | "we don't win RFPs effectively" | | r-rel-weak-responses-causes-ods | causes | r-e-weak-rfp-responses → r-e-lost-to-ods | comment 6 P6 | "I think that goes to poor RFP response" | | r-rel-invisible-contributes-ods | contributes_to | r-e-quality-invisible → r-e-lost-to-ods | comment 6 P6 | "less about product quality per se and more about making product quality visible" | | r-rel-perception-contributes-ods | contributes_to | r-e-oss-perception → r-e-lost-to-ods | comment 6 P5 | "People think open source is kind of cheap or poor quality" | | r-rel-ods-contributes-few-wins | contributes_to | r-e-lost-to-ods → r-e-few-gov-wins | Claude | drafted: ODS losses are part of the losses | | r-rel-partners-contributes-few-wins | contributes_to | r-e-few-partners → r-e-few-gov-wins | comment 6 P4 | "often you need a partner in a given country or jurisdiction to win" | | r-rel-*-supports (7), r-rel-partner-bids-challenges | supports / challenges | evidence → claim | RFP analysis, comment 6 P8 | evidence offered for the claim; partner-bid record counts against "partners win" | | r-rel-no-time-causes-little-outbound | causes | r-e-no-bizdev-time → r-e-little-outbound | comment 8 P3 | "yes lack of dedicated systematic bizdev time is an issue", answering call 12 | | g-rel-active-for-gov | necessary_for | g-e-product-active → g-e-win-gov-portals | comment 8 P3 | "we also want to keep the product active" — weak as necessity | | f-rel-time-enables-outreach | enables | f-e-dedicated-bizdev-time → f-e-systematic-poc-outreach | Claude | drafted |
Deliberately omitted
| what | where | why |
|---|---|---|
| Discord quiet → upkeep dies | L21, L32 | plausible evidence link, but no single sentence asserts it |
| "likely as client work took over" | L21 | hedged cause |
| "Not seeing confusion from clients yet, possibly because few find Arc at all" | L29 | hedged; also cuts against r-e-arc-cloud-compete as a felt problem |
| "Hard to make reliable" (Queryless) | L15 | second reason for dropping Queryless; kept only the own-AI reason |
| Aside: open-source skill for talking to data portals | L15 | idea, explicitly an aside |
| "Our position: partner if they bring clients" | L19 | stance, not a claim about the system |
| Site / GitHub URLs, TODO markers | L5, L14, L17 | page furniture |
| Paid search cut → Cloud sign-up collapse | funnel L122 | "lines up with the drop": correlation only |
Funnel quick wins (allow freemail on /build, Cloud CTA back, restart search ads) | funnel L181–184 | recommendations; candidate future_reality injections once the goal is settled |
| Measurement-gap fixes | funnel L168–175 | tasks; transition material for later |
Traffic sources, top content, geography, rage-clicks, $exception | funnel §4–5 | detail that doesn't change the argument; stays in the analysis |
| "the dream of self-serve is a big one, but we'll see" | comment 1 P4 | hedged; captured only as g-e-goal-small |
| Calls vs sign-ups anecdote (booked a call with a vendor, bought a year later) | comment 2 P2 | anecdote; supports the demo-and-call offer but isn't a claim about PortalJS |
| Staff availability for calls | comment 2 P2 | raised and dismissed: "I don't think we're going to have many calls" |
| Evidence.dev as a competitor in the self-serve market | comment 2 P4 | named in passing; add to r-e-competitors if that market is pursued |
| "We might be getting better" (RFPs) | comment 6 P2 | hedged; the refresh (da-4pl) will say |
| "might be also related to product quality" | comment 6 P6 | hedged; some Toulouse gaps (visualization types, MFA, data.gouv.fr harvesting) may be real product gaps, not just visibility: call 13 |
| "At least for cloud, we don't need any of that" | comment 2 P8 | read as: Cloud needs no self-serve sign-up; folded into f-e-drop-gov-signup rather than a separate item |
Judgment calls for the reviewer
-
The goal is read off the SCQ's question. The SCQ has no stated goal; L37 offers a "candidate framing". Its three parts became a goal and two CSFs, all low confidence. Confirm or rewrite before building on the goal tree. Is migration capture really necessary for a working funnel, or a separate goal?
-
Lost deals to OpenDataSoft are not linked to the missing feature comparison. The source puts them side by side but doesn't say one causes the other. If you believe it contributes, say so and it becomes
contributes_to. -
No link from the complications to r-e-little-self-serve. The SCQ implies Arc/Cloud confusion, Arc being free, hidden enterprise option, dying upkeep and marketing weakness all lead to little self-serve business, but never says so. These are the links most worth adding if you assert them.
-
Arc vs Studio naming kept out of propositions; still undecided.
-
Arc vs Cloud overlap not framed as a conflict. Could become a cloud (e.g. "keep Arc free to drive adoption" vs "charge for Arc so it earns"), but the source doesn't pose it.
-
Two goals, unlinked (rev 2). The near-term goal (team builds and demos fast) and the rev 1 funnel goal sit side by side. The format has no "higher-level objective", so they can't be nested. The reviewer's point is that the near-term goal is too small to be the whole answer. Deciding what PortalJS is for over 6 months is the main open question. It could become a conflict cloud: "use PortalJS as our internal outreach tool" vs "grow PortalJS as a self-serve product".
-
r-e-goal-undefined as root cause. It plausibly sits under several effects: the Arc/Cloud overlap, the CTA switch that emptied Cloud, Arc being free with no price. The source doesn't say so. If you assert any of those links, this becomes the critical root cause candidate.
-
The Cloud collapse has two candidate causes. The CTA switch (asserted, L180) and the paid search cut (correlation, L122). Only the first is linked. Rev 3: largely moot, since those sign-ups weren't serious (comment 2 P1).
-
Three goals now. Rev 1's self-serve funnel goal is contradicted for the government audience ("a complete waste of time"). Rev 3's win-government goal and rev 2's build-and-demo goal fit together: Arc builds demos, and demos plus calls win governments. I kept all three and linked none, because the format can't nest goals. Suggest: make g-e-win-gov-portals the goal for the next 6 months, g-e-team-builds-demos a condition under it, and retire g-e-working-funnel or move it to the parked conflict's self-serve side. I haven't done this without your say-so.
-
Three markets, read from a run-on sentence. I read them as government data portals, enterprise, and junior data engineers who might grow into enterprise work. The third may really be the same group as the "old DataHub publication market". Confirm. Rev 4: call 9 is resolved as proposed; call 10 is resolved (same market).
-
(Resolved rev 7: r-e-no-bizdev-time causes r-e-little-outbound.) Upkeep unprotected → little outbound? Rev 1's "upkeep isn't protected, so it dies" plausibly causes little outbound, and the e2e project says biz dev doesn't run constantly because delivery fills the week. Not linked: no source says so for PortalJS. It's the likely deeper root under "little outbound".
-
Visibility vs real gaps. The reviewer puts the ODS problem on visibility, not quality. But Toulouse named specific missing items (MFA, DR detail, data.gouv.fr harvesting, visualization types). Some may be real feature gaps. The ODS feature comparison would settle which.
-
Partners: helpful, but partner bids haven't won. The reviewer says a local partner is sometimes necessary and often helpful, not always required (comment 7); the RFP record shows 0 wins from sub bids through partners (Toulouse included). Both can hold: partners may help without being sufficient, or the partner model (Datopian as subcontractor, not controlling the narrative) is the problem. Recorded as
challenges. -
The parked conflict is mostly drafted. The contention and both arms are yours; the shared objective and the tree structure are mine. No injection yet: you parked it.
Drafted plan (rev 4)
Drafted by Claude at the reviewer's request. Nothing here is ratified. Obstacles cite a source where one exists. Objectives, actions and assumptions are proposals.
Implementation objective (p-e-path-live): government data portal buyers reach a demo video and book a call, and every call booked is counted.
| obstacle | source | intermediate objective |
|---|---|---|
PostHog records clicks to /book-a-demo but not whether a call was booked | funnel L19 | each booked call is recorded as an event and in the CRM (Twenty), from site or outbound |
| every site CTA points to Arc sign-up | funnel L123 | government CTAs point to the demo video and book-a-call |
| no government landing page with a demo video | comment 2 P8 | landing page with a 2–3 minute video of an Arc-built portal and a book-a-call button |
| about 700 real visitors a month, too few to fill the path | funnel L179 | outbound and partner messages point at the landing page |
| marketing upkeep isn't protected and stops when people get busy | SCQ L32 | one named owner, protected half-day a week |
Sequence (transition):
1 name owner + protect half-day
├─► 2 add call-booked tracking ──► 3 baseline: calls booked, last 90 days ─────┐
└─► 4 record demo video ──► 5 publish gov landing page ─┬─► 6 switch gov CTAs, ├─► 8 monthly review
│ drop self-serve │ vs baseline
└─► 7 link from all ───┘
outbound
Expected effect: Datopian knows how many government calls PortalJS books each month and whether that number is rising.
Assumptions: a short video of a working portal is enough to move a government buyer to book a call; calls will be few enough that one person can take them.
Status (rev 5): generally agreed by the reviewer (comment 4 P5). Treat as the working plan; the open points below remain.
Open for the reviewer:
- Owner. Who owns the path? Daniela already builds Arc demos and does partner outreach (see the e2e project), so she is a natural candidate.
- Target. What number of calls a month counts as success by March 2027? The baseline from step 3 should set it.
- Video. One generic video, or one per segment (city, state, national statistics office)?
- Socrata. Governments leaving Socrata are government portal buyers, so a Socrata-migration variant of the landing page could fold in here. g-e-capture-migration is parked as an observation for now; should it become a CSF under the government goal?
- OpenDataSoft comparison. Lost deals are to a government-portal competitor, so the comparison probably belongs on the landing page too. It has no plan yet.
Validator output
bun run check:import not run (no Reason Commons checkout; reviewer said the validator isn't needed). Local Python check passed: unique ids across entities, designations and relationships; every designation names an existing entity and parent; every relationship has one from and all ends in the same view; every entity designated. Rev 7: 124 entities (goal 13, conflict 5, current_reality 73, future_reality 11, prerequisite 11, transition 11), 68 relationships, 9 assumptions; every assumption names an existing relationship.
Not in this file
- A plan for anything but the government path. The parked self-serve conflict, the Socrata play and the OpenDataSoft comparison have no prerequisite or transition trees yet.
- OpenDataSoft feature comparison — to be created; likely its own doc under
projects/portaljs-sep-2026/. - July 2026 commercial brief (
ref/2026-07-22-portaljs-queryless-arc-commercial-path.md) — context only, not extracted; parts (Queryless, Arc as Cloudflare frontend tier) are superseded.
Reviewer comment 1 2026-09-28
Paragraphs as numbered for locators.
P1. One of the issues is that our goal with PortalJS is not clear. Is it an open-source tool that is a lead generator for our Cloud or even our more detailed professional services work, as happened with the California Department of Technology, where they came because they tried out PortalJS? Is it a self-serve SaaS option? Is the Studio a self-serve SaaS option?
P2. PortalJS could even become the replacement for DataHub for self-serve: publishing datasets and data portals quickly, now that DataHub is becoming a data marketplace we curate quite heavily. The goal for PortalJS is a bit undefined. It's okay to have two goals, owned by different people or by us, but it's not clear what exactly we're doing there.
P3. The current goal: PortalJS is a tool for ourselves, so we can build many portals very quickly and do outreach. PortalJS, particularly Arc, is what we need. We don't need Cloud, and the framework only matters if it supports Arc. The goal is for us to use it as a team to build portals very quickly and demo them to clients.
P4. Still flag the point, even if that potentially resolves it. There are open questions, and that seems quite a small near-term goal, to be frank. It should do that, but what else could we be doing with this tool? The dream of self-serve is a big one, but we'll see.
P5. From here we drop the SCQ (keep it, don't update it) and work in the LTP trees.
Reviewer comment 2 2026-09-28
Paragraphs as numbered for locators. Lightly tidied from a transcribed conversation.
P1. On the funnel facts: there were 21 Cloud sign-ups in April, but some were just spam, and even in April not one converted to a customer. Generally we didn't have many serious sign-ups, not just in April.
P2. Did people ever schedule calls? A video plus scheduling a call is more realistic than sign-ups. Scheduling a call is really valuable nowadays: I once got on a call with a vendor within a day, didn't buy then, and bought from them a year later. Only a student won't book a call. Someone has to be available, but we won't get many calls.
P3. What we learned with Joao is that we are in a niche. Our buying customers are governments, and they don't really need the self-serve experience. They just want to speak to someone.
P4. We could expand PortalJS into what was the old DataHub publication market. There are a lot of people there, many working as data engineers. If the experience is competitive with Evidence.dev and similar tools, it's a way to get back into enterprise and not be stuck in the ghetto of government work.
P5. If there's a more self-serve experience, we need to think about whether that's a contention, because it distracts our energy. If we want to get back into enterprise, there is an opportunity there; it's a different audience. The much bigger self-serve audience is also a potential gateway into enterprise customers. Record it and think about it, but it's a completely different pathway; leave it for now.
P6. If we focus the goal now, it's on government open data or data portal customers. Are we after enterprise, more junior data engineers who might grow into other work, or government data portals? Those are three different markets.
P7. For government data portals, a video demo and "book a call" is what should be offered, and calls booked is what we should measure, not sign-ups. That's not in PostHog. This isn't a classic SaaS model: people want a demo. Self-serve sign-up won't work that way, so for this audience it's a complete waste of time and should go away.
P8. If we do want self-serve sign-ups, they should be Arc users deploying a portal; that's a measure of success, because they get something useful quickly. Cloud doesn't need self-serve sign-up at all. For the government audience, a dedicated landing page with a video and a sign-up for a call.
Reviewer comment 3 2026-09-28
P1. Junior data engineers and the old DataHub market are indeed the same: quick, self-serve publication of one dataset or a catalog. Agree on the goal structure: yes, prioritise government data portal customers. Agree on the next step (plan the demo-and-call path).
Reviewer comment 4 2026-09-28
Paragraphs as numbered for locators. Lightly tidied from a transcribed conversation.
P1. There are many more conditions. We have to do outreach: people are not going to just show up on our site, which is really minor in our view. We have to go out and do cold outreach. That's why we build prototype demo portals: when we email someone, it comes with a screenshot or even a video and a site they can check out. It might not be perfect, but showing we built a simple prototype of their existing site impresses people. The critical success factor is outreach.
P2. This may pay off in the medium to long term. We might get something in front of someone whose contract is only up for renewal in 12 months, but we're in their mind now. We don't want to just be coming to an RFP call; we want them thinking about us before they come to RFP.
P3. We also have to do RFPs, because most government contracts go via RFP, so even if we're in the door we need to do that.
P4. As background notes and beads: explore other simple uses of PortalJS, like empowering power users to build their own portals. That's the real way into more open-source users, more awareness, more free marketing, and possibly an alternative marketplace.
P5. Generally agree on the plan for the demo-and-call path. Much of it is relevant whatever we do: in cold outreach we'll send a PoC (if built) plus probably a link to a landing page.
Reviewer comment 5 2026-09-28
P1. On current reality: most buyers don't come on their own. Some may, or at least have used PortalJS first. Minor. The overlap with e2e is natural and intentional. Next: create the actions.
Reviewer comment 6 2026-09-28
Paragraphs as numbered for locators. Lightly tidied from a transcribed conversation. Responds to Claude's proposal that "PortalJS effort drifted to self-serve" was the root cause.
P1. I don't think the root cause is that. We don't do a lot of outbound marketing in a compelling way, and we don't win RFPs effectively. Those are the two key things.
P2. We've lost a lot of RFPs. There's a separate analysis about this. We might be getting better.
P3. We haven't done outbound, so we don't generate inbound interest. If we bid cold on RFPs, that's very weak.
P4. We also sometimes lack partnerships. Often you need a partner in a given country or jurisdiction to win: bidding on a French portal, you need a French partner.
P5. Against OpenDataSoft, we may not be showing what we can do strongly enough. People think open source is cheap, poor quality, or missing features. We scored poorly on the evaluation in the Toulouse data portal bid against OpenDataSoft. Genuine or biased, we should have been able to tick the boxes: we can do this, here's a demo, here's the feature.
P6. That goes to poor RFP response, but it might also be related to product quality. It's less about product quality per se and more about making product quality visible.
P7. I don't think we drifted into self-serve SaaS; that hasn't happened. We haven't done outbound as needed, or got visibility in other ways, and we haven't been strong on RFPs to follow up when we have had openings.
P8. What we do see is that inbound interest is powerful. When someone has seen something, we contact them, and they're in touch before an RFP, we are often more likely to win.
P9. The RFP data is in a separate project; I don't know how up to date it is. If it isn't, refreshing it is a task: analyse what's been going on.
Reviewer comment 7 2026-09-28
P1. We don't absolutely need a partner in every jurisdiction where we bid. A partner is sometimes necessary and often helpful.
Applied: r-e-local-partner-needed, r-e-few-partners and f-e-more-partners reworded to match.
P2. Agreed with call 14 that partners as a cause is very speculative: it's not clear partners are an issue.
Applied: partners removed from the causal tree. r-e-few-partners re-roled root_cause → observation; f-e-more-partners re-roled injection → observation; r-rel-partners-contributes-few-wins deleted. The evidence (r-e-local-partner-needed, r-e-partner-bids-lost and the challenges link between them) stays as an open hypothesis. The refreshed RFP analysis (da-4pl) could test it: do bids with a local partner win more often than those without?
Reviewer comment 8 2026-09-28
P1. Agreed on the gap: add the RFP-response actions.
P2. The main thing is systematically building PoCs and emailing people. We already have a database of potential contacts in Twenty, though it could be enriched.
P3. On call 12: yes, the lack of dedicated, systematic biz dev time is an issue. We also want to keep the product active.
P4. Daniela as owner, as it overlaps with her biz dev responsibility.
P5. Note the work on a self-serve option as "someday". Then close this out with beads for the immediate next steps.