Set a user's description, job level & photo for what prospects see on the Lead Portal β a fallback for when staff haven't filled in their own profile.
This bypass touches only these three fields. It never changes their login, messages, community profile, or any other setting.
Matches staff to HighLevel team members by email and fills any empty photo.
Loadingβ¦
π€ View Bot Conversations in HighLevel
Workaround for the Custom Conversation Provider issue: instead of logging into HighLevel's Conversations tab, this adds a floating "View Bot Conversation" button directly onto every HighLevel contact page, opening a read-only page here with that contact's real chat history, qualification, and booking status.
Paste the snippet below into HighLevel β Agency Settings β Custom JS (applies account-wide, on every contact page).
Loadingβ¦
π Site Directory
Every page, API endpoint, and script in the portal, in one place. Click a page to open it, or a source file to view it on GitHub.
Same placeholders apply. Line breaks are preserved. Shown as context on the task either way β a Checklist task still keeps this description alongside its checkboxes.
Checklist: the assignee checks off each item below β the task auto-completes the instant every box is checked.
Backfill existing Prime49 merchants
The automation only fires on NEW uploads. Use this once to create catch-up tasks for Prime49 merchants that already existed before it was turned on. Matches the Prime49 Merchants report (partner-level Prime49). Uses the same title/description/assignee/priority above. Merchants that already have an auto-created task are skipped, so it's safe to run again.
Default = 2026 (matches the report). Click All time to clear the dates and include every Prime49 merchant since the first one added.
How It Works
Triggered every time merchants are uploaded via the CSV upload on the Merchants Dashboard
Only brand-new merchants are checked β existing records being updated are skipped
New merchants whose Agent ID is flagged as Prime49 in the system trigger this automation
One task is created per new Prime49 merchant using your configured title, description, assignee, and priority
Tasks appear instantly in the Task Center linked directly to the merchant record
Recent Auto-Created Tasks
Loadingβ¦
sms
Prime49 SMS Follow-Up Bot
Master switch for the AI SMS bot on Prime49 Path B (prospective partner) campaigns. Off = greyed out and labeled "Coming soon" in every campaign editor, regardless of that campaign's own setting.
Super Admin Only
Enable SMS Bot Feature
When ON, staff can turn the SMS bot on per-campaign in the Prime49 campaign editor. When OFF, it's disabled everywhere and shown as "Coming soon".
ShipStation modes (deployments & returns) and other global on/off switches.
link
GHL Contact IDs
Link partner records to their HighLevel contacts and review mappings.
block
Blocked IPs
A blocked IP is rejected on EVERY authenticated request app-wide (not just login) β added here, from Activity Logs, or auto-blocked by the attack-response system.
support_agent
Access Troubleshooter
"I lost access" from a real user? Search their email or IP β see instantly if they're blocked/locked and fix it yourself in one click, super_admin only.
sync
GHL Notes Backfill
Pull all existing notes from GoHighLevel for every partner already in the app. Safe to run multiple times β skips notes already synced.
phone_iphone
Partner Phones from HighLevel
This app never had its own phone field for partners β pulls the number from each partner's HighLevel contact into their record. Only fills BLANK numbers, never overwrites one already on file. Safe to run multiple times. Needed for the shipment-lookup bot's SMS verification option.
code
GHL Contact Button Generator
Generate the JavaScript snippet to install in GoHighLevel. Adds a "View in Portal" button to every contact page that deep-links to the partner's record.
π₯οΈ Equipment Catalog
store
Vendors
Add, edit, or remove equipment vendors/brands. Used by terminal types & ShipStation store mapping.
point_of_sale
Terminal Type Manager
Add, rename, reorder, or deactivate terminal types. Changes apply instantly across Inventory, ROI, and Repair Queue.
π§Ή Data Maintenance
call_merge
Merchant Merger
Fix incorrectly entered MIDs by merging duplicate merchants. Moves all notes, tasks, deployments, returns, and tickets to the correct record, then permanently deletes the duplicate.
people
Partner Merger
Merge duplicate partner records, moving all linked data to the correct partner.
Upload a CSV (merchant_id, title, body) to link notes to merchants via UUID.
history
Legacy Deployment Importer
Upload a CSV of pre-app (Salesforce) equipment deployments. Matches merchants by MID, estimates terminal types from serial numbers, and enables RMA filing for legacy hardware.
group_add
Bulk Partner Importer
Upload a GHL CSV export to onboard multiple partners at once. Reviews mapping before committing any changes.
π Reports & Monitoring
schedule_send
Sending Reports
Manage recipients and schedules for automated email reports β Partners & Merchants stats and Inventory/Deployments/Returns ops reports.
mark_email_read
Daily Task Email
Choose which staff get a daily email of their pending tasks + what they completed yesterday, with a button to their Task Center. Managers can receive a copy of a staff member's email.
Expected columns: Contact Id, First Name, Last Name, Phone, Email, Business Name, PRIME49 ID, Main ID, Partner ID 2β4, Main ID RevShare, RevShare 2β4 %, Approval Date
EXPECTED CSV COLUMN NAMES
${['Contact Id','First Name','Last Name','Phone','Email','Business Name','PRIME49 ID','Main ID','Partner ID 2','Partner ID 3','Partner ID 4','Main ID RevShare','RevShare 2 %','RevShare 3 %','RevShare 4 %','Approval Date'].map(f=>`${f}`).join('')}
Approval Date is optional β defaults to today if not in the CSV. Rev shares can be 50% or 50 β both work.
Mapping Preview
#
Name
Email
Company
IDs
Activate Date
Status
Bypass
Importing...
0 / 0
0
IMPORTED
0
FAILED
0
SKIPPED
π White-Label Portals
Partners with agency access run this portal as their own branded CRM on their own domain. Grant access per-partner on the Partners dashboard; the SSL/custom-domain engine is powered by Cloudflare for SaaS.
cloud Cloudflare for SaaS
Checkingβ¦
Create an API token with SSL and Certificates: Edit on your zone. These are stored encrypted and used to register partner domains + issue SSL automatically.
Vercel routes by hostname and 404s unknown domains. Add a token so connecting a domain also adds it to the Vercel project automatically. Token needs project access.
Agency portals
Loadingβ¦
πͺͺ HighLevel SSO (OIDC)
Makes this portal the identity provider for HighLevel's Agency → Company → Single Sign-On feature, so HighLevel's own login is powered by real staff accounts here β the reverse of trying to read identity out of an embedded iframe. Set this up once in HighLevel's SSO wizard using the values below.
Client credentials
Checkingβ¦
HighLevel's wizard (Step 1) asks for a Mechanism, Client ID, and Secret. Choose OIDC, then generate and paste these in. Generating new ones invalidates whatever is currently pasted into HighLevel.
Endpoints (Step 2 β OpenID Configuration)
If HighLevel asks "Do you have an OpenID configuration URL?" β click Yes and paste the Discovery URL below. If it says No instead, it'll ask for each endpoint separately β use Authorization URL / Token Endpoint / User Info Endpoint below for those three fields.
Scopes: openid profile email
Redirect URL (also on the Step 2 form)
This one goes the OTHER way β HighLevel's form pre-fills its own callback URL (something like https://app.mypayprotec.com/login/sso) and just shows it to you; there's nothing to type into HighLevel there. Copy that exact value from HighLevel's screen and paste it below, so our side only completes sign-ins that actually came from HighLevel.
User Details Mapping (Step 3) β type these exact field names: Remote ID Field = sub, ID Field = sub, Email Field = email, Email Verified Field = email_verified.
smart_toy AI Agent β Sophie Green
A real Gemini-powered LLM agent with her own portal, HighLevel, ClickUp, Gmail, and (soon) LinkedIn presence. ClickUp is one of several ways to reach her, not what she is.
Master switch
OFF = completely inert, no effect on anything. Flip ON only once everything in Setup & Access below is connected.
Features & changelog
Everything she can currently do, and what's changed β kept up to date with every change made to her. New here? Start by skimming this.
Loadingβ¦
Activity log
Loadingβ¦
Identity
Secrets
Webhook URL to paste into the ClickUp channel Automation:
For web lead search: in Google Cloud Console, enable the "Custom Search API" and create an API key; then at programmablesearchengine.google.com create a search engine set to "Search the entire web" and copy its Search Engine ID (cx) above.
GitHub token powers Boss Chat's read-only code access (github_read_path/github_search_code) β create a fine-grained personal access token scoped to just this repo with Contents: Read-only permission (nothing else). These two tools can only ever read β there's no write/delete call anywhere in the code for her to reach, and they're hard-gated to Boss Chat only, never ClickUp or email.
MCP server URL (for other AI clients, e.g. a Claude Code session β NOT Sophie herself, she's unaffected either way): β send the token above as Authorization: Bearer <token>. Exposes a hand-picked read-only subset of her tools (merchant/partner/ticket/deployment lookups, analyze_*, generate_report) β no write/mutate tools, and the GitHub tools stay Boss-Chat-only. Returns 503 (completely inert) until a token is set here.
Her own Gmail account (real inbox, not a transactional sender)
Checkingβ¦
One-time setup: add https://portal.mypayprotec.com/api/agent-gmail-oauth to the Google Cloud OAuth client's Authorized redirect URIs before connecting.
Check inbox now
The real inbox poller runs every 5 minutes on its own (Vercel cron) β this runs the exact same check on demand, for testing or if the scheduled run seems stuck.
Senders she never auto-replies to (inbound email)
For automated/system notices that slip past the built-in filters β e.g. a GoHighLevel account notification that isn't an obvious "noreply@" address. Add an exact address or @domain.com to block the whole domain.
Loadingβ¦
Model & limits
gemini-2.5-flash/pro retire Oct 20, 2026 β not offered here on purpose. gemini-3.8-flash was removed after it broke live β confirmed it rejects the role the SDK uses to continue a conversation after a tool runs ("Role 'function' is not supported"), breaking every tool call. gemini-3.1-pro-preview was pulled out of the same caution, but was never actually tested β use "Test a model" below to verify it (or any other model) before adding it back. This dropdown controls the LIVE chat path only (ClickUp + email) β it always falls back to a known-safe model in code even if something unverified gets set here some other way.
Only used by her scheduled jobs (the daily tasks, not live chat) β not latency-sensitive, so a stronger reasoning model can go here once verified with "Test a model" below, e.g. gemini-3.1-pro-preview. This field is NOT protected by the live-chat safety net β test it first.
Test a model
What this actually does: there's no chat box here on purpose β clicking "Run Test" makes ONE real, silent call to Google's Gemini API in the background (not visible anywhere else, not posted to any channel) that mimics exactly what breaks when she uses a tool: ask the model to call a test function, then continue the conversation afterward. That "continue afterward" step is the exact thing that failed with gemini-3.8-flash. Takes a few seconds, then shows β PASSED or β FAILED right below the button β that's the whole interaction, nothing to type into it yourself.
System prompt
Dos & don'ts (hard rules)
Boss oversight
This email is "the boss" β two things key off it: (1) every request anyone sends her and every reply/action she takes gets emailed here as it happens (toggle below), and (2) it's who's allowed into the π¬ Boss Chat tab β her private line, separate from client-facing ClickUp. Leave blank and Boss Chat falls back to any super admin.
Proactive follow-ups
Everything else she does is reactive (someone messages her, she replies). This is her one proactive habit: if SHE asked a genuine open question or a tool-confirmation prompt and nobody answered within the delay below, she checks back in once β never a generic "this thread went quiet" nudge, and never more than once per question. Off by default.
Tool allowlist
Nothing here is callable until you switch it on. "Requires confirmation" makes her ask in chat before running a write action.
Loadingβ¦
Skills (knowledge base)
Same idea as a Claude skill: a name, a one-line description of when it applies, and the actual knowledge β all in one. She searches these on demand via search_knowledge_base (enable it under Tools above), kept separate from the System Prompt so they only cost tokens when actually relevant. Click a skill below to edit it, or fill in the form to add a new one.
Loadingβ¦
Add a new skill
ClickUp channels
Which GROUP channels she's active in β deliberately curated, add each one on purpose. Add the matching channel Automation (Message is posted β Call webhook β the URL above) in ClickUp itself.
Loadingβ¦
π¬ Direct messages β fully automatic, nothing to set up
Resumed 2026-10-13 after a real incident (2026-10-12): the DM/GROUP_DM classification briefly misfired live β root-caused with the raw-data capture below (not guessed) to a deploy-timing gap, not bad logic; ClickUp's own "type" field reliably distinguishes DM/GROUP_DM/CHANNEL, confirmed against real data. Only a true 1:1 DM skips the @mention requirement; a GROUP_DM behaves like a normal channel. This button runs the check right now instead of waiting ~5 min.
Email threads
One row per real conversation in her inbox β these appear on their own as she exchanges email, nothing to add manually here.
Things she does on her own, on a schedule, without anyone tagging her β same brain/tools as chat, just triggered by time instead of a message. Runs hourly; a job fires once a day at the hour you pick (UTC).
UTC
Loadingβ¦
Boss Chat
Talk to her directly, employee-to-boss β not client-facing (that's ClickUp). Ask how her tools are performing, what's missing, whether something needs fixing or building. Same brain as ClickUp/email, she just knows this conversation is private and can speak candidly. Restricted to whoever is declared "Boss email" in the Behavior & Brain tab's Boss oversight panel (falls back to any super admin if that's blank).
Loadingβ¦
Enter to send, Shift+Enter for a new line.
toggle_on Feature Flags
Turn features on or off globally. Changes apply to all staff.
π£ Marketing Features
Turn each marketing tool on or off. When OFF it shows greyed with a βComing soonβ badge in the Marketing console (nothing is deleted). Defaults to ON.
π€ Jarvis Operator
Lets Jarvis perform actions (assign a rep to a prospect, award a certificate, update a ticket status) β every action still requires the staff member to click Confirm first, respects their access, and is logged. Defaults to OFF.
ShipStation-Ready Deployments β New Ticket Mode
Controls what the deployment dashboard's + New Ticket button shows. Pick one mode:
β’ Disabled β opens the current standard deployment form directly (no ShipStation, full fallback).
β’ Coming Soon β shows the wizard with ShipStation Ready greyed out + a "Coming Soon" badge; standard Create Ticket still works.
β’ ShipStation Only β wizard goes straight to ShipStation Ready; the plain Create Ticket option is hidden.
β’ Both β wizard shows both cards active; staff choose per ticket.
Loadingβ¦
ShipStation-Ready Returns β Mode
Controls the return flow (from the deployment edit modal's Log Return). Pick one mode:
β’ Disabled β standard return flow only (full fallback).
β’ Coming Soon β return method prompt shows ShipStation greyed; standard return works.
β’ ShipStation Only β every return goes through the ShipStation return modal.
β’ Both β staff pick Standard or ShipStation return each time.
Loadingβ¦
Reconcile Deliveries (backtrack)
Looks up live delivery status (ShipStation V2) for tickets that have a tracking number and aren't closed.
Delivered ones get their received date set and are closed (partner-first sets the partner date).
Processes up to 50 per run β click again to continue through the backlog.
π€ Bot Cap-Exempt IPs
IPs listed here skip the website bots' anti-abuse limits (qualified-lead daily cap, Partner ID/shipment lookup enumeration) β for staff/QA testing so repeated manual runs don't get flagged as abuse. One IP per line.
β° Proactive Alerts (SLA & Aging)
Hourly scan that posts in-app notifications only (the π bell β never email) to the item's owner + super-admins
when things age past these thresholds: overdue tasks, tickets past SLA, deployments stuck, and RMAs sitting open.
Only alerts items that recently crossed the line; deduped to once/day per item.
π§Ή Data Hygiene Scanner
Weekly (Sundays): fast, DB-only checks for real bug patterns this app has hit before β a checklist task with no items, a task's checklist and status disagreeing, the same visitor with multiple live chats open at once, a sub-partner ID pointing at a deleted parent, and an agent ID with no owning person.
Monthly (1st), slower: an External GHL Sweep β actually calls HighLevel per linked contact to catch what the DB alone can't see: a contact deleted in HighLevel but still referenced here, two separate HighLevel contacts for the same email that should've been merged, local info drifting out of sync with HighLevel, and placeholder contacts confirmed (via a live check, not just our own stale copy) to still be blank and safe to delete.
Fixed findings from either scan auto-resolve next run β nothing to clean up manually once the underlying issue is gone.
Weekly auto-scan enabled
Monthly external GHL sweep enabled
Click Refresh to load.
ποΈ Recycle Bin
Deleted tickets and RMAs are archived here (a snapshot is saved right before deletion β the original delete still runs exactly as before). Restore re-creates the record. (File attachments aren't included β their storage bytes are removed on delete.)
Click Refresh to load.
π Prime49 / Agent ID Webhook
Fires from a HighLevel workflow when a contact's ID custom fields get set. Two separate kinds in one payload: {{contact.prime49_id}} (fixed 50% rev share, no rev share field needed) and up to 4 REGULAR agent IDs β agent_id_1..4 paired with their own revshare__1..4 (HighLevel can't do a repeating field, hence 4 flat numbered slots). If the contact already has a portal record (matched by HighLevel contact id), whichever IDs are present in the payload are just added/updated on it. If not, a new person + agent record is created first from the name/email/phone/approval date, then the IDs are attached.
π Also syncs attribution (source/campaign/medium/landing page/referrer) on every call that resolves to an existing partner β pulled live from HighLevel's own attribution tracking on the contact using the contact_id already in this same payload. No extra custom data fields needed for it.
In HighLevel: Workflow β Webhook action β this URL β POST body (JSON) β omit any field you don't have for this contact:
{"contact_id":"{{contact.id}}","prime49_id":"{{contact.prime49_id}}","agent_id_1":"{{contact.agent_id_1}}","revshare__1":"{{contact.revshare__1}}","agent_id_2":"{{contact.agent_id_2}}","revshare__2":"{{contact.revshare__2}}","agent_id_3":"{{contact.agent_id_3}}","revshare__3":"{{contact.revshare__3}}","agent_id_4":"{{contact.agent_id_4}}","revshare__4":"{{contact.revshare__4}}","name":"{{contact.name}}","email":"{{contact.email}}","phone":"{{contact.phone}}","approval_date":"{{contact.approval_date}}"}
Loadingβ¦
Recent Webhook Calls (last 50)
Every call HighLevel makes to this webhook is logged here β including ones that failed auth or validation, which never showed up anywhere before. Click a row to see the exact payload HighLevel sent and the full error.
Click Refresh to load.
π Backfill Attribution for Existing Partners
The webhook above only captures attribution going forward, whenever HighLevel fires it for a contact. Partners onboarded before that existed will sit on "No Attribution Data" forever unless something asks HighLevel directly β this does that, once, for everyone already in the portal. Checks every partner with a HighLevel contact id and no attribution yet; a single click only gets partway through on a large list β click again to continue (it always resumes where it left off, nothing to lose).
Loadingβ¦
π₯οΈ Live Chat Desktop App
Powers the download links on the bot-live-chat-app.html staff page (linked from the Live Chat console's toolbar). Build the installers locally (desktop-app/ in this repo β see its README: npm run dist:win / npm run dist:mac), upload the resulting .exe/.dmg somewhere staff can download from (GHL media, cloud storage, etc.), and paste the direct download URL here. Leave a field blank to show "Not available yet" for that platform instead of a broken link.
Loadingβ¦
π Webhook Health
Recent outbound partner webhook deliveries. Retry re-sends the stored payload (signed) to the endpoint.
Click Refresh to load.
π Thumbs Up Webhook
URL that receives the payload when staff click Send Thumbs Up Message on a new-agent's first merchant
(Partners Dashboard β First Merchants Added). Leave blank to disable the button's action.
Loadingβ¦
π Thumbs Up Activity
Who clicked Send Thumbs Up, for which partner, and when. "Restore" re-enables the buttons (clears the sent state) β for testing.
Loadingβ¦
tour Product Tours
Intercom-style guided tours. Build a step-by-step walkthrough for any feature, point each step at a real element, then toggle it on. Staff see it once automatically; a "Take a tour" button lets them replay. Toggle off anytime β zero impact on the page.
Loading toursβ¦
New Tour
Steps
Tip: set the page first, then use Pick element to open that page and click the target. Leave the selector empty for a centered welcome card.
store Vendors / Brands
Add, edit, or remove equipment vendors. Vendor assignment is managed inside the Terminal Type Manager (Tools tab).
Loading vendorsβ¦
Legacy Deployment Importer
Import pre-app equipment records from Salesforce / spreadsheets
Step 1 β Upload CSV
Required columns: Deployment Date, TID, Serial Number, MID, Tracking Number, Notes, Purchase Type Optional: Terminal Type (if blank, system will estimate from serial number)
Step 2 β Review & Confirm
Serial
TID
MID
Merchant
Terminal Type
Date
Status
check_circle
storage Database Changes
Every schema change (new/altered/dropped tables, columns, functions, RLS policies) made directly against Supabase β by anyone with project access, through the dashboard, the CLI, or their own Claude Code session connected via the Supabase MCP server. This is the one trail that still shows those changes, since they never pass through this app's own code and so never reach the regular Audit Trail.
Only catches changes made through Supabase's migration mechanism. A one-off SQL statement run outside that flow (an ad-hoc edit in the SQL editor, or a raw query call that isn't wrapped as a migration) won't show up here β there's no way to catch that without Supabase's own Postgres query logs.
Loadingβ¦
rule Rep Code Audit
HighLevel's "Rep Code" contact field is meant as a human-readable summary of a partner's IDs β not the actual onboarding. Staff sometimes fill it in and stop there instead of running each ID through the onboarding wizard, which is what actually creates the records everything else in the portal reads from. This finds contacts where that happened: Rep Code has IDs that don't exist in the portal.
Scans only HighLevel contacts whose Rep Code is actually filled in. On a large account a single click may only get partway through β it picks up where it left off on the next click (progress is saved).
Click "Scan HighLevel" to check for gaps.
Every contact onboarded through this audit β who did it, when, and the IDs + company that were created. Doesn't include a gap that cleared itself because a later scan found the IDs already fixed elsewhere (that's not this tool's doing).