Add CleanQuote Sidebar Menu Items with Custom JS
The marketplace app install allows only one custom menu item. You can use Agency Custom JS to inject additional sidebar entries (Dashboard, Quotes, Contacts, Inbox, Leads, Tools, Service Areas, Pricing, Settings) that load CleanQuote pages in the same iframe with the correct location context.
Steps
- In your account, go to Agency (or Company) → Settings → Company → Custom JS.
- Add the script. Try Option A first. If the menu never appears, The platform may not run external script tags — use Option B (inline loader).
- Option A — script tag:
<script src="https://www.cleanquote.io/api/script/ghl-sidebar-menu.js" crossorigin="anonymous"></script>
Option B — inline loader (paste this if Option A does nothing):<script> (function(){ var url = 'https://www.cleanquote.io/api/script/ghl-sidebar-menu.js?v=' + (Date.now ? Date.now() : '1'); var s = document.createElement('script'); s.src = url; s.crossOrigin = 'anonymous'; s.async = false; (document.head || document.documentElement).appendChild(s); })(); </script> - Save. The script runs on all sub-accounts. Menu items only appear when you are in a location (sub-account) context so that a location ID is available.
How it works
The script gets the current location ID from the platform (via AppUtils.Utilities.getCurrentLocation() when available, or from the page URL). It injects a small list of menu items into the sidebar. When you click an item, it finds the CleanQuote iframe (the one opened by your single Custom Menu Link) and sets its src to /v2/location/{locationId}?page=quotes (or contacts, inbox, etc.). Your app then loads the correct dashboard page with location context.
White-label or different domain
To use a different base URL (e.g. my.cleanquote.io), set it before the script runs:
<script>window.CLEANQUOTE_SIDEBAR_BASE = 'https://my.cleanquote.io';</script> <script src="https://www.cleanquote.io/api/script/ghl-sidebar-menu.js" crossorigin="anonymous"></script>
Important
You must be inside a sub-account (location), not the Agency view, for the injected menu items to appear. Open CleanQuote at least once from your single Custom Menu Link so the iframe is loaded; then the script can navigate it when you click the injected items. If the iframe is not found, the script opens the CleanQuote URL in a new tab.
Script not loading?
Many Custom JS panels only run inline code and ignore <script src="...">. If nothing runs:
- Use Option B (inline loader) above so the only thing the platform executes is a short snippet that injects our script tag; the browser then loads the script from our server.
- In a new tab, open
https://www.cleanquote.io/api/script/ghl-sidebar-menu.jsand confirm it returns JavaScript (not a 404 or HTML). - Ensure you are in a location (sub-account) view — the menu is only injected when a location ID is present in the URL or context.
Caveats
- The platform's sidebar DOM is not documented. If the platform updates its UI, the script’s selectors may need updating; the injected container has
id="cleanquote-ghl-sidebar-menu"for debugging. - If menu items do not appear, ensure you are in a location context (URL contains
/location/or similar) and that Custom JS is enabled for your agency. - If clicks open a new tab instead of updating the iframe, open CleanQuote from the sidebar once so the iframe exists, then try the injected items again.
Set up the single Custom Menu Link first · Back to setup guides