graph LR
A["1. Create Listing Buy or Sell side"] --> B["2. Members Respond Declare interest / facilitate"]
B --> C["3. Q&A Asset discussion"]
C --> D["4. Agreement Possible deal confirmed"]
D --> E["5. Introduction Buy ↔ Sell connected"]
E --> F["6. Deal Agreed Transaction arranged"]
style A fill:#1a1a2e,stroke:#c9a84c,color:#f5f5f5
style B fill:#1a1a2e,stroke:#c9a84c,color:#f5f5f5
style C fill:#1a1a2e,stroke:#c9a84c,color:#f5f5f5
style D fill:#1a1a2e,stroke:#c9a84c,color:#f5f5f5
style E fill:#1a1a2e,stroke:#c9a84c,color:#f5f5f5
style F fill:#1a1a2e,stroke:#c9a84c,color:#f5f5f5
Invite-only access control via unique membership codes
S3 infrastructure for document storage already in place
Account manager routing — auto-assigns by deal category
Strong testimonials — real, attributable quotes from active members
Critical: Password Security
⚠ Severity: Critical
User passwords appear to be stored or visible in plain text within the system.
Flagged during live demo on 20 Feb — Josh confirmed: "That's not good."
⚠ .env.development Exposed
The development environment file contains all production secrets including:
Sharetribe Integration API keys
SendGrid API key
MongoDB connection string
AWS S3 credentials
Stripe secret key
Recommendation: Immediate secret rotation + password hashing audit. All .env files must be excluded from version control.
Critical: Hardcoded API Tokens
⚠ Tokens in Source Code
API tokens hardcoded directly in JavaScript files — not using environment variables.
HubSpot — getHubspotLeads.js:3
const accessToken = 'pat-eu1-••••••••';
// Personal Access Token
// Full CRM read access
CueDesk — whatsapp.js:16
headers: {
'Authorization': 'Bearer y8arylqx••••••••'
// WhatsApp messaging token
// Send to any member's phone
}
Recommendation: Move to environment variables immediately. Rotate both tokens. Audit all files for additional hardcoded secrets.
Member Invite System
Current Flow
sequenceDiagram
participant Admin
participant Sheet as Member Master Sheet
participant HS as HubSpot
participant User
Admin->>Sheet: Add name + generate code
Sheet->>HS: Push every 10 min
Admin->>User: Send prepopulated URL (email/WhatsApp)
User->>User: Click link → signup form
Note over User: Code validated against MongoDB MembershipId
Proposed Flow
sequenceDiagram
participant Admin
participant Platform as Parnexus Admin
participant User
Admin->>Platform: Generate invite (self-service)
Platform->>User: Auto-send branded invite
User->>Platform: Click → signup → KYC
Platform->>Admin: Dashboard shows status
Note over Platform: Real-time tracking No spreadsheet needed
CRM Sync & Hygiene
Josh: "Has not been good enough"
HubSpot CRM data is incomplete — important fields like "assets of focus" not being pushed from signup.
HubSpot leads filtered only by "Hot Lead" / "Warm Lead" status
Impact: Members with interests in unmapped categories never appear in HubSpot matching results.
Proof Upload
Josh: "Super clunky"
Currently, the team manually messages sellers for proof of ownership. No in-platform upload flow exists.
Current: Manual
graph TD
A["Seller Creates Listing"] --> B["Team Messages Seller via Chat / WhatsApp"]
B --> C["Seller Sends Files Back"]
C --> D["Admin Manually Reviews"]
style A fill:#1a1a2e,stroke:#c9a84c,color:#f5f5f5
style B fill:#1a1a2e,stroke:#e74c3c,color:#f5f5f5
style C fill:#1a1a2e,stroke:#e74c3c,color:#f5f5f5
style D fill:#1a1a2e,stroke:#e74c3c,color:#f5f5f5
Proposed: Integrated
graph TD
A["Seller Creates Listing"] --> B["Step 2: Upload Proof In listing form"]
B --> C["Files → S3 Infra already exists"]
C --> D["Admin Review Dashboard"]
D --> E["Listing Goes Live"]
style A fill:#1a1a2e,stroke:#c9a84c,color:#f5f5f5
style B fill:#1a1a2e,stroke:#27ae60,color:#f5f5f5
style C fill:#1a1a2e,stroke:#27ae60,color:#f5f5f5
style D fill:#1a1a2e,stroke:#27ae60,color:#f5f5f5
style E fill:#1a1a2e,stroke:#27ae60,color:#f5f5f5
Chat Interface UX
Josh: "Unclear" — "Not the easiest to use"
Frankie monitors conversations daily by checking last activity across the platform's 1,223+ transactions. No filtering, no priority queue — just scrolling and clicking.
Current Problems
No quick-scan view of conversations
Must open each transaction individually
"Last activity" is the only filter available
Can't tell if an asset was offered without reading full thread
No priority queue for introduction requests
No conversation status tags or labels
Proposed Improvements
Conversation summary preview (last 2 messages)
Status badges: New / Active / Intro Requested / Closed
Priority queue for introduction-ready conversations
Bulk actions for common operations
Search and filter by member, asset class, date
AI-assisted triage (flag conversations ready for intro)
KYC Modernisation: Didit.me
Current: Manual KYC
sequenceDiagram
participant User
participant Platform as Parnexus
participant S3 as AWS S3
participant Admin as Ralph (KYC)
participant ST as Sharetribe
User->>Platform: Upload passport photo
Platform->>S3: Store document
Platform->>ST: privateData.passportUploaded = true
Platform->>Admin: SendGrid notification
Note over Admin: Manual review (hours/days delay)
Admin->>ST: Set publicData.isVerified = true (via Sharetribe Console)
Note over ST: handleApproveUser cron (checks every 10 min)
ST->>User: Verification email
Proposed: Didit.me Automated
sequenceDiagram
participant User
participant Platform as Parnexus
participant Didit as Didit.me
participant ST as Sharetribe
User->>Platform: Click "Verify Identity"
Platform->>Didit: Redirect to hosted verification
Note over Didit: ID capture + validation Biometric liveness Face matching (1:1) AML/sanctions screening Deepfake detection
Didit->>Platform: Webhook: result
Platform->>ST: Auto-set isVerified = true
Platform->>User: Instant verification email
Note over Platform: Ralph handles exceptions only
Didit.me: Free tier (500/mo) | No contracts | GDPR + ISO 27001 | 48 languages | SDK/iframe integration
Signup Journey
graph TD
A["Receive Invite Link Unique membership code"] --> B["Click Link → Signup Page"]
B --> C["Enter Details Name, email, interests, region"]
C --> D{"Invite Code Valid?"}
D -->|"No / Already Used"| E["Rejected Code checked against MongoDB"]
D -->|Yes| F["Account Created sharetribeId linked to code"]
F --> G["Upload Passport Current: manual S3 upload"]
G --> H["KYC Review Proposed: Didit.me automated"]
H --> I{"Verified?"}
I -->|Yes| J["Full Access Granted Verification email sent"]
I -->|"No / Failed"| K["Manual Review Ralph handles exception"]
style A fill:#1a1a2e,stroke:#c9a84c,color:#f5f5f5
style B fill:#1a1a2e,stroke:#c9a84c,color:#f5f5f5
style C fill:#1a1a2e,stroke:#c9a84c,color:#f5f5f5
style D fill:#1a1a2e,stroke:#c9a84c,color:#f5f5f5
style E fill:#1a1a2e,stroke:#e74c3c,color:#f5f5f5
style F fill:#1a1a2e,stroke:#27ae60,color:#f5f5f5
style G fill:#1a1a2e,stroke:#c9a84c,color:#f5f5f5
style H fill:#1a1a2e,stroke:#3498db,color:#f5f5f5
style I fill:#1a1a2e,stroke:#c9a84c,color:#f5f5f5
style J fill:#1a1a2e,stroke:#27ae60,color:#f5f5f5
style K fill:#1a1a2e,stroke:#e74c3c,color:#f5f5f5
Listing & Matching
graph TD
A["Member Creates Listing Buy-side or sell-side"] --> B["Admin Reviews James checks quality, budget spreads"]
B --> C{"Approved?"}
C -->|No| D["Request Changes e.g. narrow budget range"]
C -->|Yes| E["Listing Published"]
E --> F["approvedListings Cron Runs every 2 minutes"]
F --> G["Match Users"]
G --> G1["Category Match mainFocus = categoryLevel1"]
G1 --> G2["Size Match dealSizeBracket filter"]
G2 --> G3["Location Match Region/country/state + wildcards"]
G3 --> G4["Subcategory Match detailedFocus + sub-fields"]
G4 --> H["Notify Matched Users"]
H --> H1["SendGrid Email"]
H --> H2["WhatsApp via CueDesk"]
H --> H3["HubSpot Lead Match"]
style A fill:#1a1a2e,stroke:#c9a84c,color:#f5f5f5
style B fill:#1a1a2e,stroke:#c9a84c,color:#f5f5f5
style C fill:#1a1a2e,stroke:#c9a84c,color:#f5f5f5
style D fill:#1a1a2e,stroke:#e74c3c,color:#f5f5f5
style E fill:#1a1a2e,stroke:#27ae60,color:#f5f5f5
style F fill:#1a1a2e,stroke:#3498db,color:#f5f5f5
style G fill:#1a1a2e,stroke:#c9a84c,color:#f5f5f5
style G1 fill:#1a1a2e,stroke:#c9a84c,color:#f5f5f5
style G2 fill:#1a1a2e,stroke:#c9a84c,color:#f5f5f5
style G3 fill:#1a1a2e,stroke:#c9a84c,color:#f5f5f5
style G4 fill:#1a1a2e,stroke:#c9a84c,color:#f5f5f5
style H fill:#1a1a2e,stroke:#27ae60,color:#f5f5f5
style H1 fill:#1a1a2e,stroke:#27ae60,color:#f5f5f5
style H2 fill:#1a1a2e,stroke:#27ae60,color:#f5f5f5
style H3 fill:#1a1a2e,stroke:#27ae60,color:#f5f5f5
Transaction States
From transactionProcessInquiry.js — the actual state machine in production
Steps 1–5 are on-platform. Step 6 happens entirely off-platform.
The platform stops being useful after introduction. Users move to WhatsApp, email, phone.
This is the root cause of the stickiness problem — not user behaviour.
The transaction state machine confirms this: "introduced" is a terminal state. There is literally no state for what happens next. The platform has no concept of a deal progressing, completing, or failing after introduction.
Features vs Real Problems
Requested Feature
Real Problem
Better Approach
Platform-only communication enforcement
Users leave after intro
Make the platform better than WhatsApp. Build deal rooms, voice/video, auto-NDAs. Make leaving pointless, not prohibited.
Popup + checkbox to stay on platform
No post-intro value
Post-intro deal tracking, milestone tracking, document management, data rooms. Give users a reason to stay.
Prevent forwardable PDFs
Info leaks off-platform
Watermarked, time-limited document access via secure viewer. Track who viewed what and when.
Button to report bad behaviour
No visibility into deals
Structured deal stages with check-ins. If a deal goes quiet, the platform knows and can intervene proactively.
Prevent duplicate transactions
Messy conversation state
Smart deduplication at inquiry time + clear conversation/deal separation in UX.
Key insight: Platform-only enforcement won't work. The goal is to make the platform so useful that leaving is pointless — not to build walls.
Introduction Management
Current: Manual Review
sequenceDiagram
participant User as Members
participant Chat as Platform Chat
participant Frankie
participant Admin
User->>Chat: Discuss asset
Note over Frankie: Daily manual review of all active txns
Frankie->>Chat: Read conversation
Frankie->>Frankie: Decide: intro worthy?
Frankie->>Admin: Grant introduction
Admin->>User: Introduction made
Note over User: 💔 Moves to WhatsApp
Note over Admin: No further visibility
Proposed: Smart Queue + Follow-up
sequenceDiagram
participant User as Members
participant Platform
participant AI as AI Triage
participant AM as Account Manager
User->>Platform: Request introduction
Platform->>AI: Analyse conversation
AI->>AM: Priority queue + summary
AM->>Platform: Approve introduction
Platform->>User: Introduction + Deal Room
Platform->>User: 7-day check-in
Platform->>User: 14-day check-in
Platform->>User: 30-day check-in
Note over Platform: Full deal lifecycle visibility maintained
Guided Acquisition Process
A structured deal lifecycle — inspired by Acquire.com(4.7/5 Trustpilot, 192 reviews)
Listing summary only — no seller identity or sensitive details
2. Q&A
Structured chat, asset questions
Seller reveals details incrementally as trust builds
3. Introduction
Buy ↔ Sell connected
Identities revealed, full asset info unlocked
4. Deal Room
Secure docs, milestones, negotiation
Data room with controlled access — watermarked, time-limited
5. Agreement
Terms confirmed, deal structure set
Full transparency between parties
6. Completion
Deal marked closed, feedback collected
Cash transfer off-platform (client-managed for now)
Key principle: Information is released stage-by-stage — not all at once.
Buyers earn access through verified identity, signed NDA, and demonstrated intent.
Cash transfers remain client-managed off-platform for now; the platform captures the deal record and outcome.
AI Account Manager
Augment the team — don't replace them
graph TB
subgraph Input["Data Sources"]
I1["Conversations 1,223+ txns"]
I2["Listings Buy + Sell side"]
I3["Member Profiles Interests, history"]
I4["HubSpot CRM Pipeline, status"]
end
subgraph AI["AI Account Manager"]
A1["Triage Inquiries Flag intro-ready conversations"]
A2["Proactive Suggestions 'Member X matches Listing Y'"]
A3["Daily Digest Prep Summarise activity for each AM"]
A4["Deal Health Monitor Flag stale or at-risk deals"]
end
subgraph Output["Actions"]
O1["Priority Queue → Frankie"]
O2["Match Alerts → Members"]
O3["AM Briefings → Team"]
O4["Intervention Triggers"]
end
I1 --> A1
I2 --> A2
I3 --> A2
I4 --> A3
I1 --> A4
A1 --> O1
A2 --> O2
A3 --> O3
A4 --> O4
style Input fill:#0d1b2a,stroke:#3498db,color:#f5f5f5
style AI fill:#0d1b2a,stroke:#c9a84c,color:#f5f5f5
style Output fill:#0d1b2a,stroke:#27ae60,color:#f5f5f5
AI Account Manager — Specification
MVP Scope
Conversation triage only — classify conversations as: intro-ready, needs-info, stale, closed.
Surface a daily priority queue for Frankie.
Data Pipeline
Read-only Sharetribe Integration SDK → fetch recent transaction messages → LLM classifies → results stored in MongoDB → served via new API endpoint /api/triage-queue
LLM Approach
Claude API with structured output. Each conversation scored on: intent clarity, asset match quality, response recency, introduction readiness.
Integration Points
New cron job (triageConversations, every 30 min), new API endpoint for admin dashboard, new React component for queue view.
Phased Delivery Phase 1 (MVP): Triage + priority queue — 2–3 weeks Phase 2: Proactive match suggestions, daily AM digest emails Phase 3: Deal health monitoring, stale deal alerts, predictive scoring
Key Files server/cron/index.js (new cron), server/apiRouter.js (new endpoint),
new server/cron/triageConversations.js,
new src/containers/AdminTriagePage/
sequenceDiagram
participant Cron as Cron (30min)
participant SDK as Sharetribe SDK
participant AI as Claude API
participant DB as MongoDB
participant Dash as Admin Dashboard
Cron->>SDK: Fetch recent txn messages
SDK-->>Cron: Conversation data
Cron->>AI: Classify conversations
AI-->>Cron: Structured scores
Cron->>DB: Store triage results
Dash->>DB: Query priority queue
DB-->>Dash: Ranked conversations
Note over Dash: Frankie sees priority queue, not raw txn list
AI-First Ideas
AI Deal Matching
Go beyond category/size/region. Use NLP on listing descriptions, conversation tone, and deal history to find non-obvious matches. "This yacht buyer also bought art last quarter."
Conversational Deal Room
AI-moderated deal rooms that auto-generate summaries, track action items, flag when parties go quiet, and suggest next steps based on deal stage.
Voice-to-Deal-Note
Members record a voice note after a call. AI transcribes, extracts key details (price discussed, timeline, conditions), and updates the deal record automatically.
Predictive Deal Scoring
Train on 1,223 historical transactions. Predict likelihood of deal closure based on conversation patterns, response times, member history, and asset characteristics.
Smart Onboarding Concierge
AI guides new members through profile setup, suggests relevant listings based on stated interests, and proactively introduces them to high-match opportunities.
Market Intelligence Dashboard
Aggregate anonymised platform data into market insights: trending asset classes, average deal sizes by category, regional demand heat maps, time-to-close benchmarks.
Membership Tiers
Tier
Price
Key Differentiator
Corporate Access
£500 – £5,000 p/a
4 sub-tiers: Core, Multi Desk, Multi Desk Premium, Exclusivity
Priority Managed
£4,000 p/a
AM uses platform on client's behalf, filters deal flow, advisory access
VIP
£20,000+ p/a
Insurance, storage, valuations, bespoke sourcing, max 2% of members
Roadmap: Tier 1 — MVP
Quick Win Desktop & mobile app experience
Quick Win Phone call button from inbox
Strategic Implement VIP tier
Strategic Paid access to revealed member list
Quick Win Referral button for non-members
Strategic Referral agreements in platform
Strategic Referral system across listings
Complex NDA gating (auto-filled, pre-intro)
Quick Win Report bad behaviour button
Quick Win Doc share optimisation
Quick Win Careers page
Quick Win Video content & help pop-ups
Quick Win Client feedback page
Strategic Landing page optimisation
Strategic Tiered memberships + upgrade buttons
Complex Integrated payments / uptiering
Quick Win Prevent duplicate transactions
Quick Win Restore deal titles in URLs
Quick Win Favourite / starred listings
Roadmap: Tier 2 — Advanced
Complex API integrations for large institutions
Strategic Proof-of-access for sell-side listings ← Move to Immediate
Complex Clear admin backend (away from Sharetribe)
Complex Buyer-seller matching on criteria + timing
Strategic Proactive introduction suggestions
Complex Agentic AI roadmap (personal AI, conversational interface)
Strategic Prevent forwardable PDFs
Quick Win Thumbnails for shared photos/docs
Quick Win One-click become-an-introducer
Strategic Improved conversation management views
Note: "Proof-of-access for sell-side" is listed as Tier 2 but should be prioritised immediately.
Josh described the current process as "super clunky" — the team manually messages sellers for proof.
S3 infrastructure already exists; this is a UX problem, not a technical one.
Roadmap: Tier 3 — Future / Premium
Complex Separate private debt & equity marketplace
Complex Separate real estate investment marketplace
Strategic Commercial RE / RE investment platform decision
sequenceDiagram
participant Listing as New Listing
participant Cron as approvedListings (every 2 min)
participant Match as Matching Engine
participant ST as Sharetribe
participant HS as HubSpot
participant SG as SendGrid
participant CD as CueDesk
participant User as Matched Users
Listing->>ST: Published
Cron->>ST: Fetch approved listings
ST-->>Cron: Listing data
Cron->>Match: Filter users
Match->>ST: Query all users
ST-->>Match: User profiles + interests
Match->>Match: Category → Size → Location → Subcategory
Match->>HS: Filter HubSpot leads
HS-->>Match: Matching contacts
Match->>SG: Send email notifications
SG->>User: "New listing matches your criteria"
Match->>CD: Send WhatsApp via CueDesk
CD->>User: WhatsApp notification
Note over User: User opens platform, inquires on listing