Skip to content
Lead Finder Media

[INSTALL GUIDE]

Install once. Everything else is in your dashboard.

Your dashboard has your personal code and copy buttons for each method. This page explains the steps and fixes.

1. Pick how to install

Agency admins: GHL Custom JS. Works for everyone on your sub-accounts. In GHL switch to Agency view → Settings → Company → Custom JS. Paste your code on its own lines after anything already there (don't delete existing code), save, then hard refresh a calendar page.

An agency runs your GHL. In your dashboard choose "An agency runs my GHL" and copy the note. It tells the agency where to paste it and that it only runs for the sub-accounts on your plan. Takes them about two minutes.

Just on your computer: Tampermonkey. Install the free Tampermonkey extension. In Chrome or Edge right-click its icon → Manage extension → turn on Allow User Scripts (or turn on Developer mode on the extensions page). Then Tampermonkey icon → Create a new script → delete everything → paste the script from your dashboard → save. Only you see the tools, in that browser.

2. Check it's running

Open any GHL page of the sub-account. Within a minute your dashboard lists it under Sub-accounts with "last load" time. Sub-accounts register themselves; you never type an ID.

3. Appointment Colors: mark your appointments

Start a title with your marker, e.g. 🔴 | Max - Lab. Typing emoji: Mac Ctrl+Cmd+Space, Windows Win+. (period). Set the colors and markers in Dashboard → Appointment Colors → Edit rules. Saved changes reach GHL on the next page load.

4. Header Buttons: add your links

Dashboard → Header Buttons → Edit settings. Add a button (one link) or a dropdown (up to 15 links), pick where it opens, then Save. Click a code such as {{contact.id}} to drop it into a link; GHL fills it in when the button is clicked. Links starting with / stay inside GHL, e.g. /v2/location/{{location.id}}/contacts/detail/{{contact.id}} opens the current contact.

First-run check: after saving, hard refresh any page of the sub-account. Your buttons sit in the top bar, left of GHL's own icons. Buttons set to show on "Contact records only" appear when you open a contact; "Calendar pages only" when you open a calendar. Under "Tidy GHL's header" you can also hide GHL's "What's new" pill and the green dialer phone; untick to bring them back.

No buttons at all?

Open Dashboard → Header Buttons → Edit settings and check at least one button is listed and saved. A new install starts with none, so nothing shows until you add one. Then hard refresh GHL.

Button shows on some pages only?

Check its "Show on" setting. "Contact records only" appears only on a contact's record page; "Calendar pages only" only on GHL calendar pages. Set it to "Every page" if the link doesn't use {{contact.id}}.

Side panel or pop-up is blank?

Many sites (Google, banks, most logins) refuse to open inside another site. Set that button to "New tab" or "Separate window". The panel's "Open in tab" link always works.

Separate window doesn't open, or Copy does nothing?

Your browser blocked the pop-up or the clipboard: allow pop-ups for your GHL address (icon at the right of the address bar), then click again. If copying is blocked, the link is shown on screen to copy by hand.

A code came out empty?

{{contact.id}} is only filled on a contact record page; {{location.name}} needs the sub-account page fully loaded. Check the link in the settings preview, which shows exactly where each button goes.

Won't save?

The settings page lists what to fix in red: a missing label or link, a link that doesn't start with https:// or /, a leftover YOUR_ placeholder, or a code that isn't in the list.

Remove just this tool: switch Header Buttons off in Dashboard → Your tools. The buttons disappear on the next page load; your other tools keep running.

5. Report Cards: daily report cards texted to owners

Each pet booked on the calendars you pick gets a card for the day. Staff fill it in on their phone (how the day went, energy, activities, a highlight, photos, homework), mark it Ready, and the owner gets one text with a link to a card in your colors. Ready cards not sent by hand go out at your auto-send time.

Settings (Dashboard → Report Cards → Edit settings): for each sub-account paste a GHL Private Integration token made in that sub-account (scopes are listed on the page), click Connect, tick your daycare calendars, then set your business name, visit name (Day Camp, Daycare, Boarding), activities, optional pet-name contact field, a File Upload contact field for photos (or click Create it for me), logo, colors, booking button, auto-send time and time zone, the text wording and a staff code. The token is stored encrypted and never shown again.

First-run check: open the staff page link from settings on your phone, enter the staff code, and today's bookings appear. Fill in one card and tap Preview. Texting starts switched off, so nothing reaches owners until you tick Texting on. To get the Report Cards button in GHL's top bar, install the loader (step 1) and hard refresh.

Photos won't add?

Pick a File Upload contact field under "Photos are saved to" in settings (or click Create it for me), and make sure the token has the Edit Forms scope. Photos land on the owner's contact in GHL.

"GHL didn't accept that token"?

Make the Private Integration inside the same sub-account you entered (Settings → Private Integrations in that sub-account, not the agency), tick every scope listed on the settings page, then paste the new token and click Connect.

Staff page says nobody is booked?

Check the right calendars are ticked in settings and that today's bookings are on them (cancelled and no-show bookings are left out). The day follows the time zone in settings.

Pet name is wrong or says "Name needed"?

Staff can type the right name on the card; it sticks. To fill names automatically, tick the contact field that holds the pet's name in settings (Connect first). Otherwise the booking title is used when it isn't the owner's name.

A card says "Not sent"?

The reason shows on the card: the owner has DND on, has no valid mobile number, the contact was deleted, or the booking was cancelled. Fix it in GHL, then tap Retry. Nothing is texted while Texting on is unticked.

Remove just this tool: untick Texting on to stop texts at once, or switch Report Cards off in Dashboard → Your tools (the staff page, auto-send and GHL button all stop). Remove on a sub-account deletes its cards and owner links stop working; photos stay on the contacts in GHL. Delete the Private Integration in GHL to revoke the token.

6. Vet Records: a vet finder for your form, and training records for each graduate's vet

Clients pick their vet from a Google Maps search above your GHL intake form, and the vet's name and phone go into the form. When an opportunity reaches your graduated stage, a training record is drafted for that pet's vet (skills, program, trainer, notes for the vet team). Staff check it on the staff page, tick the owner's OK and send it as an email from your GHL. Your clients are never messaged.

Settings (Dashboard → Vet Records → Edit settings): for each sub-account paste a GHL Private Integration token made in that sub-account (scopes are listed on the page), click Connect, pick the pipeline and its graduated / completed stage, map your contact fields (pet name, breed, vet name and phone, vaccines; each optional), then set your business details, skills checklist, days to look back and a staff code. The token is stored encrypted and never shown again. The sub-account must also be on your plan: install the loader (step 1) and open GHL there once.

Vet finder placement: add your website addresses and business location in settings and save. Copy the script tag shown there and paste it on your website page directly above your GHL form embed code (the iframe whose address contains /widget/form/). With several forms on a page the finder uses the first form after the tag; add data-form-id="your form id" to the tag to pick another. The finder only holds the form back while the page is loading, so it never reloads a form a client has started; "skip" shows the blank form.

First-run check: open your form page in a private window: "Who's your vet?" appears above the form. Search a clinic near you, pick it, and check the form shows its name and phone. Then move a test opportunity into your graduated stage, open the staff page (link in settings, or the Vet Records button in GHL), sign in with the staff code and tap Reload: the test graduate appears as a Draft. Fill it in and tap Preview. Emailing starts switched off, so nothing reaches any vet until you tick Emailing on.

The vet finder doesn't show on my website?

The page's address must be in "Your website addresses" in settings (e.g. www.yourbusiness.com), over https. Paste the script tag directly above the GHL form embed code (the form must come after it on the page). Save settings, then reload the page with the cache cleared. If your site sets a Content Security Policy, allow tools.leadfindermedia.com in script-src and connect-src.

The form shows but the vet isn't filled in?

The form query keys don't match. In GHL open the form → click the vet name field → Query Key, and type that exact key into "Form query key for the vet name" (same for phone). Keys are lowercase with underscores, without "contact.".

Search says "Search isn't available" or "Couldn't search"?

The day's included searches for this sub-account are used up (they reset at midnight UTC), or your own Google key is wrong or doesn't have Places API (New) enabled. Clients can still skip and type their vet. Add your own Google key in settings to lift the daily limit.

Graduates are missing from the staff page?

Check the pipeline and graduated stage in settings, and "Days to look back": only opportunities that moved into that stage within those days are listed. Tap Reload; up to 15 new graduates are added per load.

A record won't send?

Emailing on must be ticked in settings, the record needs a vet email and the owner's OK, and the token needs Edit Contacts plus View and Edit Conversation Messages. If GHL says it couldn't send, set up email sending in that sub-account (Settings → Email Services) and tap Retry send.

New "contact created" workflows fired for a clinic?

Sending adds each vet clinic as a contact in your GHL with the tag vet-clinic. Add a filter to your contact-created workflows: Tag does not include vet-clinic.

The staff page says the plan ended or the sub-account isn't active?

Renew in Dashboard → Manage billing, and make sure the sub-account is listed under Sub-accounts in your dashboard (install the loader and open GHL there once). The vet finder shows the plain form while the plan is off.

Remove just this tool: untick Emailing on to stop sends at once, or switch Vet Records off in Dashboard → Your tools (the staff page, GHL button and vet finder all stop; the form shows as normal). Delete the script tag from your website. Remove on a sub-account deletes its records and saved clinic emails; contacts already in GHL stay. Delete the Private Integration in GHL to revoke the token.

7. Creative Board: approve ads with your team or your client

Editors upload each creative (images, a video link, headlines, ad copy, description, call to action, landing page) to the board. Anyone signed in approves it, or rejects it with at least one reason, a note, and what the rebuild must keep. Rejected creatives wait under Needs rebuild; an editor clicks Upload replacement and the new version shows next to the original. Approved creatives export to CSV for your ads manager. It needs no GHL token and never touches your GHL data.

Settings (Dashboard → Creative Board → Edit settings): for each sub-account (client) enter its ID, a board name and accent color, the channels you run with their character limits, your reject reasons and keep options, and an editor code. Add a reviewer code if a client approves ads: reviewers can approve, reject, comment and suggest rules, but can't upload, edit or delete. Codes are stored hashed and never shown again. Changing a code signs out everyone who used the old one.

Brand rules: on the board's Rules tab, add Never rules with flag words (e.g. "guarantee, overnight"). Copy containing a flag word gets a red note on its card and in the upload form before anyone approves it. Reviewers' suggestions wait there until an editor activates them.

First-run check: open the board link from settings, sign in with the editor code and add a test creative with one image. Sign in from a private window with the reviewer code, reject it with a reason, then back as editor open Needs rebuild → Upload replacement. The replacement appears under Replacements next to the original. For the Creative Board button in GHL's top bar, install the loader (step 1) and hard refresh.

"That code didn't work"

Codes are case-sensitive. Check which code you were given: the editor code and the reviewer code are different. The owner can set a new code in Dashboard → Creative Board → Edit settings; everyone signed in with the old one has to sign in again.

"Too many tries"

8 wrong codes from one network lock that board for 15 minutes. Wait, then use the right code.

Reviewer can't upload or delete

That's by design. Reviewers approve, reject, comment and suggest rules. Uploading, editing, publishing and deleting need the editor code.

An image won't upload

JPEG, PNG, WebP and GIF only. The page shrinks images to 1600 pixels before sending; a single image can be up to 900 KB after that, and a board holds 60 MB. Free space by deleting old creatives forever in the Archive. Videos go in as a link (Drive, Dropbox, YouTube, Loom).

"Someone else just changed this"

Two people decided on the same creative at once. The board shows the latest version; check it and decide again if needed.

No Creative Board button in GHL

The board itself works without it. For the button, the loader must be installed (step 1) and that sub-account must have a board. Hard refresh GHL after saving.

Remove just this tool: switch Creative Board off in Dashboard → Your tools (the board pages and the GHL button stop; nothing is deleted). Delete board in settings removes that board's creatives, notes, rules and images for good; its link stops working.

8. Nag Guard: no follow-up texts after someone books

Your lead follow-ups ("still need help?", "pick a time", drips) keep running after a lead books unless every workflow checks for it. Nag Guard does it for all of them: every 5 minutes it reads the upcoming bookings on the calendars you pick and takes each booked contact out of the follow-up workflows you pick. It never sends anything and never touches any other workflow. Nothing to paste into GHL.

Settings (Dashboard → Nag Guard → Edit settings): for each sub-account paste a GHL Private Integration token made in that sub-account with View Calendars, View Calendar Events, View Workflows and Edit Contacts. Click Connect, tick the calendars that mean "booked" (phone consults, in-person evaluations, demos), then tick the follow-up workflows a booked lead should leave. Don't tick reminder or confirmation workflows: those are the ones you want them in. Optionally add a tag (for example "appt scheduled") that is added to each booked contact, and set how many days ahead to look (default 60). The token is stored encrypted and never shown again.

First-run check: save with Guard on unticked, then click Check now: it shows how many upcoming bookings and booked leads it found, without changing anything. Tick Guard on and save; the first run (within 5 minutes, or click Run now) clears every booked lead already on your calendars. Book a test contact who is in one of the picked workflows, wait a few minutes, and check the contact's Workflows panel in GHL: that workflow is gone. The settings page lists the last contacts it cleared.

Connect says it can't read workflows?

The token is missing the View Workflows scope. In GHL go to Settings → Private Integrations, edit the integration, tick View Workflows (plus View Calendars, View Calendar Events and Edit Contacts), save, then click Connect again. Editing scopes keeps the same token.

A booked lead still got a follow-up text?

Check three things in settings: the calendar they booked on is ticked, the workflow that texted them is ticked, and Guard on is ticked and saved. Then check "Last run" is within the last few minutes. The guard runs every 5 minutes, so a text scheduled in the same minute as the booking can still go out; for those, add your tag in settings and an "if tag" check before the text in that workflow.

"GHL refused the token" under Last run?

The token was deleted or its scopes changed in GHL. Make a new one in that sub-account with the scopes listed on the settings page, paste it, and save. Nothing runs for that sub-account until you do.

Check now finds 0 bookings?

Only live bookings count: new or confirmed, starting within your look-ahead window (or up to an hour ago). Cancelled, no-show and showed bookings are ignored. Make sure the right calendars are ticked and Look ahead is long enough.

The tag started a workflow I didn't expect?

Any workflow with a "Tag added" trigger for that tag fires when Nag Guard adds it. Clear the tag field in settings to stop adding it, or change those workflows' triggers. Leave the tag blank if you don't need it; removing contacts from workflows works without it.

Remove just this tool: untick Guard on (it stops at once), or switch Nag Guard off in Dashboard → Your tools. Remove on a sub-account deletes its setup; contacts already taken out of workflows stay out. Delete the Private Integration in GHL to revoke the token.

9. Opportunity Colors: color-code your pipeline cards

Turn the cards on your Opportunities board into a color-coded dashboard: red when a card carries a warning, green when it says Paid, grey when it's Lost, gold when the value is over a number you pick. It only changes how cards look in your browser. It needs no API key, reads nothing but the text already showing on the cards, and never edits an opportunity.

Settings (Dashboard → Opportunity Colors → Edit settings): pick a starting point (Warnings, Payments, Won / Lost / big deals) or add your own rules. Each rule has a When (card text contains, opportunity name contains, status is, value is at least, or a pattern), the Text, a Color and a Look (tint the card + color bar, bar only, or solid). Rules are checked top to bottom and the first match wins. Up to 20 rules. The preview runs the same code GHL runs; type the words from one of your cards into Try your own card to see which rule it hits.

Coloring by something that isn't on the card: a rule can only see what the card shows. To color by a field, a payment status or a warning, show it on the card first (Pipelines → Customize card, or a Smart Tag in GHL), then match its text here.

First-run check: save, hard refresh GHL, open Opportunities in a sub-account listed in your dashboard. Cards that match a rule are tinted with a bar on the left; hover one to see its rule name.

No cards are colored?

Hard refresh GHL on the Opportunities page (Ctrl+Shift+R, Mac: Cmd+Shift+R), and check your sub-account is listed in Dashboard → Sub-accounts. Colors show on the board view only, not the table list. Then open the tool's settings and type a word that is on one of your cards into "Try your own card": it names the rule that matches.

A rule never matches?

Rules only see what is showing on the card: the opportunity name, the chips, the stage, the value and Won / Lost. If the word isn't on the card in GHL, add it first (Pipelines → Customize card, or a Smart Tag). The match ignores capital letters but needs the exact spelling.

Wrong color?

Rules are checked top to bottom and the first match wins. Move the rule you want higher with the arrows.

Won cards stay green?

GHL tints Won cards green itself. A rule that matches the card wins over it. Add a rule for the warning or payment word above any Won rule.

Worked, then stopped?

Check your plan in the dashboard. If GHL changed its board layout, we update the tool for everyone; no action needed on your side.

Remove just this tool: switch Opportunity Colors off in Dashboard → Your tools (the colors disappear on the next page load). Nothing in GHL was ever changed, so there is nothing to undo.

10. Dog Alerts: safety and care alerts on your cards and calendar

Define up to 8 alerts (for example Aggression, Food Allergy, Bite, Give Meds, Leash, Fearful, Feed Lunch), each with its own color and a short pill label. Wherever one of your alert words shows on an Opportunities card or a calendar appointment, a small pill appears, and the card or appointment is tinted with the color of the most important alert on it. It only changes how things look in your browser. It needs no API key, reads nothing but the text already showing on the page, and never edits an opportunity or an appointment.

Settings (Dashboard → Dog Alerts → Edit settings): start from the dog list or add your own. Each alert has a name, pill text (up to 14 characters), the words to look for (comma separated; leave blank to use the name; each matches a whole word or the start of one, in any case, so “Aggress” finds “Aggressive” but “Bit” does not find “habit”) and a color. The list is your priority order: the alert nearest the top sets the color, and every alert present gets a pill, in that order. Tick whether to show alerts on the Opportunities board, the calendar, or both, and whether to add pills or only the tint. The preview runs the same code GHL runs; type words from one of your cards into Try your own text to see which alerts fire.

What it can see: only text that is on the card or the appointment: the opportunity name, chips and Smart Tags, the stage, and the appointment title and time. Contact fields (such as a custom field on the contact) and contact tags that are not shown on the card are not visible to it. To alert on one of those, show it on the card first (Pipelines → Customize card, or a Smart Tag), or put the word in the appointment title.

First-run check: save, hard refresh GHL, and open Opportunities in a sub-account listed in your dashboard. Cards with an alert word show pills and a tint with a bar on the left. Open the calendar: appointments with an alert word in the title do the same. Edit a title to remove the word and the pill goes away within a second or two.

No pills or colors show?

Hard refresh GHL (Ctrl+Shift+R, Mac: Cmd+Shift+R) and check your sub-account is listed in Dashboard → Sub-accounts and the tool is switched on in Your tools. Alerts show on the Opportunities board view and on the calendar Day, Week and Month views, not on table or list views. Then open the tool's settings and type a word from one of your cards into "Try your own text" to confirm an alert matches it.

An alert never fires?

Alerts only see text that is showing on the card or the appointment: the name, chips, Smart Tags, stage and the appointment title. Contact fields and tags that aren't on the card are invisible to it. Add the word to the card first (Pipelines → Customize card, or a Smart Tag) or put it in the appointment title, then list it under Words to look for. Matching ignores capital letters and finds the word inside longer words, so "Aggress" catches "Aggressive".

The wrong color wins?

The color comes from the alert nearest the top of your list that is on the card. Move the one you want to win higher with the arrows. Every alert on the card still gets its own pill.

An alert fires on the wrong cards?

Your word is too short or too common. "Bit" also matches "habit". Use a longer fragment ("Bitten") or the full word in Words to look for.

Worked, then stopped?

Check your plan in the dashboard. If GHL changed its board or calendar layout, we update the tool for everyone; no action needed on your side.

Remove just this tool: switch Dog Alerts off in Dashboard → Your tools (the pills and colors disappear on the next page load). Nothing in GHL was ever changed, so there is nothing to undo.

11. Lead to Sale: where your leads go, and what each channel costs

One report built from your own GHL: new leads, booked consults, shows and no-shows, won sales and revenue, by month, by week and by channel, plus when leads come in and (if GHL has your call log) how many calls you miss and how fast you call back. Add your monthly ad spend and it shows cost per lead, per booked consult, per show and per sale for each channel. It only reads; it never changes anything in GHL.

Settings (Dashboard → Lead to Sale → Edit settings): for each sub-account paste a GHL Private Integration token made in that sub-account with View Calendars, View Calendar Events, View Contacts and View Opportunities (add View Conversation Messages for the Calls tab). Click Connect, tick the calendar or calendars a consult is booked on, tick the pipeline where a Won deal is a sale, and set a staff code. The token is stored encrypted and never shown again.

Channels: each line is a channel name, a colon, and the words that mean it when they appear in a lead's GHL source (for example "Meta ads: facebook, instagram, fb"). A lead goes to the first channel that matches. No source means Unattributed; a source that matches nothing means Other. Ad spend (optional): one line per month and channel, for example "2026-09, Meta ads, 1800".

First-run check: save, then click Check now. It rebuilds the report from GHL and shows your totals (leads, booked, showed, sales, revenue, calls) and a note for anything missing, such as no pipeline picked or no spend entered. Click Open report, sign in with the staff code, and compare the Funnel tab with a month you know. Staff can bookmark the report link, or you can paste the loader into GHL Custom JS (step 1) and a Lead to Sale button appears in the top bar of each connected sub-account.

How it counts: leads by the day the contact was created, consults by the appointment date, sales by the day the opportunity was marked Won. Show rate is showed ÷ (showed + no-show); close rate is sales ÷ showed. Past consults still marked New or Confirmed show as Not resolved: mark them Showed or No-show in GHL and the rates sharpen. The report reads up to 6,000 new contacts per refresh.

Connect says GHL didn't accept the token?

Make the token inside the sub-account you are connecting (Settings → Private Integrations), with View Calendars, View Calendar Events, View Contacts and View Opportunities. A token from another sub-account or the agency view won't work. Editing scopes keeps the same token.

Leads show 0 or far too few?

Leads are contacts created in GHL during the period. Click Check now and read the notes under it. If contacts come in through another system and are added to GHL later, they count on the day they were added to GHL.

Booked consults show 0?

Only appointments on the calendars you ticked count. Click Connect, tick every calendar a consult is booked on, save, then Check now. Appointments marked invalid are ignored; cancelled ones show in the Cancelled column.

Sales and revenue show 0?

Pick the pipeline where you move a deal to Won. A sale is an opportunity with status Won in a picked pipeline; revenue is its Lead Value. Deals with no value count as a sale with $0 revenue.

Everything lands in Unattributed or Other?

A lead's channel comes from the source GHL recorded on the contact. Unattributed means no source at all. Other means a source that matched none of your channel lines: add its words to a channel in settings (for example "Meta ads: facebook, instagram, fb"). Words of 3 letters or fewer must match a whole word.

No cost per booked consult?

Add your monthly ad spend in settings, one line per month and channel (for example 2026-09, Meta ads, 1800). Cost columns in the channel table show only for a channel with spend and at least 5 booked consults in that period.

There is no Calls tab, or it is empty?

It needs the View Conversation Messages scope on the token and call records in GHL's own phone system. If you use another dialer, the tab stays off. Untick Include the Calls tab in settings to hide the message.

Numbers look old?

The report is saved for 30 minutes so it opens fast. Press Refresh from GHL on the report (at most once every 20 seconds), or Check now in settings.

Remove just this tool: switch Lead to Sale off in Dashboard → Your tools (the report page and the GHL button stop). Remove on a sub-account deletes its setup and saved report; nothing in GHL is changed. Delete the Private Integration in GHL to revoke the token.

12. Review Printer: print every new 5-star review

Each new 5-star review becomes a one-page landscape PDF: double-rule frame in your accent color, centered, text sized as large as fits (poster-big for a short review, smaller for a long one) and never closer than your margin (1 inch minimum) to the paper edge. It goes to your printer by email, to your inbox as a document, and/or into saved copies you can download. No GHL token and nothing to paste into the GHL page.

Which printer to get: one that prints by email. An Epson with Epson Connect is the safest pick: turning on Epson Connect gives the printer its own email address, you can limit it to approved senders (add the sender address shown on the Review Printer page), and it prints PDF attachments on Letter paper. HP's older ePrint feature is limited to older models and newer HP printers print from an app instead. Any other printer works if it gives you an email address to print to; check your model's manual for "print by email". No such printer? Use Email me the PDF or Keep copies here and print from your computer.

Settings (Dashboard → Review Printer → Edit settings): name the setup, choose 5 stars only or 4 and 5, paper (Letter or A4), margin, accent color and an optional line under the reviewer (your business name). Tick where it goes: Print on my printer (paste its email address), Email me the PDF (up to 3 addresses), Keep copies here. Click Send test page to see exactly what prints. Then tick Printing on and save.

Connect GHL: create a workflow with the trigger New Review Received (it's contactless), filter Review Rating to 5 (add 4 if you chose 4 and 5), optionally filter Review Spam to No, then add a Webhook action: method POST, URL = your private link from the settings page. Under custom data add rating, review_text and reviewer_name (and source if you like) and pick the matching review values from GHL's variable picker. Publish it. After the next review the settings page shows when it was last called and what GHL sent, so you can fix a wrong field name.

Nothing printed and the test page didn't arrive?

Open the printer's own email-print settings and check two things: the printer email address is typed exactly as the printer shows it, and the sender address shown on the Review Printer page is on the printer's approved-sender list (Epson Connect: Email Print → Approved Senders → add it). Then send the test page again. Epson holds jobs for 72 hours if the printer is off.

The settings page says email sending is still being switched on?

Printer and inbox delivery work as soon as we finish switching on email sending. Saved copies work now: tick Keep copies and download the PDF from the settings page.

I don't have a printer that prints by email?

Tick Email me the PDF (or just Keep copies here). Open the PDF on your computer or phone and print it from there. Many newer printers (including newer HP models) print from an app instead of an email address, so they can't use the printer option.

GHL ran the workflow but no page was made?

The settings page shows the field names of the last call GHL made and any problem (for example it couldn't find the star rating or review text). In the workflow's Webhook action, add custom data named rating, review_text and reviewer_name and pick the matching review values from GHL's variable picker, then run it again.

It printed a 4-star review, or skipped a 5-star one?

Printing follows the Print reviews of setting: 5 stars only, or 4 and 5. Also check the workflow trigger's own Review Rating filter, which decides which reviews ever reach us.

The same review printed twice?

It shouldn't: the same reviewer and text is only processed once. If you edited the review on Google, it counts as a new one. Use Make a new link if you think the link leaked: the old one stops at once.

The text looks small, or ends with ...?

Long reviews shrink to fit the frame (down to 11 point). Anything past about 1,800 characters, or that wouldn't fit even at 11 point, is cut with an ellipsis. A bigger margin makes the text smaller.

Remove just this tool: untick Printing on (it stops at once), switch Review Printer off in Dashboard → Your tools, or delete the workflow in GHL. Delete setup removes its saved copies for good; reviews already printed stay printed. Make a new link replaces your private link if you think it was shared.

13. Lobby Display: a TV that shows who is here today

A TV in your lobby shows today's First Day and Graduation lessons, Day Camp dogs with pickup times, consult guests, birthdays, upcoming events and a Google review QR code, read live from your GHL calendars. Dog first names and times only. It never shows owner names, phones, emails or notes, and it never writes to GHL.

Settings (Dashboard → Lobby Display → Edit settings): paste a GHL Private Integration token made in the sub-account with View Calendars and View Calendar Events (read-only). Click Connect, then say what each calendar is for. Add your business name, logo address, accent color, Google review link, group class times and upcoming events. Click Preview today to see what the screen would show right now, tick Screen on and save. Copy your private screen link from the top of the settings page.

How titles are read: start each booking title with the dog's name. Owner names in (parentheses), times, FREE, p/u notes and words like Day Camp or Graduation are stripped; anything that still has digits, slashes or an @ is dropped rather than risk showing it. Put [nd] anywhere in a title to hide that booking. On a training calendar, a title like "Luna D1/5" is a First Day and "Luna D5/5" is a Graduation; the lessons in between are not shown. Day camp pickup is the booking's end time. During your group class times (from 15 minutes before to 15 minutes after) the screen switches to a group-class welcome.

Which TV to buy: a Fire TV Edition TV or any TV plus a Fire TV Stick 4K or 4K Max (about $40) is the easiest and cheapest route. Choose a Fire OS stick: Amazon's newest entry-level stick runs Vega OS and can't install the apps below. For a lobby that runs all day, a 43 to 55 inch commercial or business display (Samsung QM-series, LG UH-series, about $550 to $900) is built for long hours, but an ordinary consumer LED TV is fine for normal business hours. Avoid OLED (static layouts can burn in). Any size works; the layout is built for a TV mounted vertically, and a landscape TV works too.

Set up the TV (Fire TV): (1) Settings → My Fire TV → Developer Options: turn on Install unknown apps for Downloader, then install Downloader from the Amazon app store. (2) In Downloader, install Fully Kiosk Browser (or just use Silk, the built-in browser, if you prefer). (3) Open Fully Kiosk, set Start URL to your private screen link, turn on Keep Screen On and Launch on Boot. (4) Settings → Display & Sounds → Screen Saver: Start Time = Never. Settings → Preferences → Energy Saver: set both to Never. Turn off the TV's own sleep timer and auto power off. (5) For a vertical mount, rotate the TV and keep the default "clockwise" setting, or pick "counter-clockwise" if it's upside down. The page rotates itself, so you don't change any Fire TV display setting.

The screen says "This screen is off"

Tick Screen on in Dashboard → Lobby Display and save. The TV picks it up within 5 minutes without a restart.

The screen shows nothing for a card

That card has no calendar. Give a calendar that job in settings (Connect, then pick First Day, Day Camp, Consult guests...). Click Preview today to see exactly what the screen would show.

A dog is missing

The booking title has to start with the dog's name ("Luna D1/5", "Bella (Smith)"). Titles with [nd], cancelled or no-show bookings, and middle lessons (D2/5 to D4/5 on a training calendar) are never shown. Titles that are only a phone number, an email or a date can't be reduced to a first name and are skipped.

Camp shows no dogs

Camp pulls from every calendar you marked Day Camp. If your campers are booked on a different calendar, mark that calendar Day Camp too (you can mark more than one).

"Schedule may be out of date"

The TV hasn't reached the screen server for 20 minutes (Wi-Fi or a GHL outage). It keeps showing the last good schedule and recovers by itself.

The screen went dark or shows a screensaver

That's the TV, not Lobby Display. Set the TV's screensaver and energy saver to Never (see the TV guide above).

I shared the link by mistake

Make a new link in settings. The old one stops working at once; enter the new one on the TV.

Remove just this tool: untick Screen on (the TV shows "This screen is off" within 5 minutes) or switch Lobby Display off in Dashboard → Your tools. Remove on a sub-account deletes its setup and link. Delete the Private Integration in GHL to revoke the token.

14. Client Appointments: a private page for each client

Each client gets one link that shows their own upcoming appointments from your GHL calendars: the name you give the calendar ("Private lesson", "Day camp"), the day, the time and Booked or Confirmed. It only reads. It never shows booking titles, notes, other people on a booking or contact details, it has no payments, no cancel or reschedule, and it never sends anyone a message. We keep nothing about your clients: every time a link opens, we read that one contact from your GHL.

Settings (Dashboard → Client Appointments → Edit settings): in the sub-account go to Settings → Private Integrations → Create new integration, tick View Calendars and View Contacts, and paste the token. Click Connect, tick the calendars clients should see and give each a plain name. Add your business name, logo address (https), color, time zone (pick your sub-account's; Connect only fills it in if the token also has View Locations), how many days ahead to show, a heading, a footer note and an optional button (for example "Book a class"). Paste a contact's ID into Preview a client to see exactly what that client will see. Tick Page on and save.

Send the link: copy your client link from the top of the settings page. It ends in {{contact.id}}. Leave that part exactly as written: GHL swaps in each client's own ID. Paste the link into a workflow text or email, a snippet, a template, or a header button (Header Buttons lets you open it from a contact record). The tool never sends anything itself, so you decide when and to whom the link goes.

Privacy: the link is the key. Anyone who has a client's link can see that client's appointments, so send each client only their own. Make all links new in settings kills every link you ever sent, at once; there is no way to cancel just one client's link. Pages are not indexed by search engines, carry no trackers, and the page you open uses no scripts.

The link says "Not available"?

Open Dashboard → Client Appointments, tick Page on and save. It also shows this if your plan is paused or the saved token stopped working: paste a new token and save.

The link says "Link not found"?

The link was cut off or you made all links new. The text you send must end in {{contact.id}} exactly (GHL fills it in); copy a fresh link from settings and put it into your template. After Make all links new, every old message's link is dead by design.

The page shows no appointments but the client has some?

Check the booking is on a calendar you ticked, it is in the future and inside Days ahead, and it isn't cancelled or no-show. Paste the contact's ID into Preview a client to see exactly what the page reads. Bookings attached to a different contact (for example a spouse) show on that contact's page.

Times look an hour off?

The page uses the time zone in settings. It is filled in from your sub-account when you first connect; change it in settings if your clients are in another zone.

Connect says GHL didn't let this token read contacts?

Edit the Private Integration in GHL, tick View Contacts (and View Calendars), save, then Connect again. Editing scopes keeps the same token.

A client forwarded their link

Anyone with a client's link sees that client's appointments (calendar name, day, time, status). If a link got out, Make all links new in settings and resend; there is no per-client cancel.

Remove just this tool: untick Page on (every link shows "not available" at once) or switch Client Appointments off in Dashboard → Your tools. Remove on a sub-account deletes its setup and links. Delete the Private Integration in GHL to revoke the token.

15. Card Pills: see what each client still owes, right on the card

Small outlined pills on your Opportunities board show what a client still has to do, for example Payment, Signature and Vaccines. Pick up to 6 pills, each with its own text (up to 14 characters), color and one rule. Because that information is not on the card, Card Pills asks GHL for each contact using a read-only token you create in your own sub-account. It only reads; it never changes a contact, an opportunity or a message.

Connect (Dashboard → Card Pills): in each sub-account go to Settings → Private Integrations → Create new integration, tick View Contacts (contacts.readonly), View Custom Fields (locations/customFields.readonly) and View Tags (locations/tags.readonly), copy the token and paste it with the sub-account ID. Card Pills tests it on the spot and shows Connected. The token is stored encrypted and never shown again; Remove deletes it.

Pills and rules: each pill shows when one of these is true: the contact does not have a tag, the contact has a tag, a custom field is empty, a custom field is filled in, a custom field equals a value, or does not equal it. Pick tags and fields from the lists (read from your sub-account) instead of typing ids. The three starter pills (Payment, Signature, Vaccines) have no rule yet and stay hidden until you give them one. Pills are outlined, so they read apart from filled alert pills such as Dog Alerts.

Payment and Signature: GHL keeps invoice and document status where a pill can't read it, so add a small workflow that leaves a tag or field behind. Example: Workflow "when invoice paid → add tag paid", then the pill Payment with the rule Contact does NOT have tag paid. The same works for signatures (tag signed) and for anything a form fills in.

First-run check: connect a sub-account (it must show Connected), give one pill a rule you know applies to a card on your board, save, hard refresh GHL and open Opportunities. That card shows the pill within a couple of seconds. Add the tag the rule is looking for to the contact in GHL and, within about a minute, the pill goes away.

No pills show at all?

Hard refresh GHL (Ctrl+Shift+R, Mac: Cmd+Shift+R) on the Opportunities board. Then check four things: the sub-account is listed in Dashboard → Sub-accounts, Card Pills is switched on in Your tools, the sub-account shows Connected on the Card Pills page, and at least one pill has a rule (a pill with no rule stays hidden).

The page says Token rejected?

GHL stopped accepting the token. Make a new Private Integration inside the same sub-account (Settings → Private Integrations) with View Contacts, View Custom Fields and View Tags ticked, paste it under Replace token and click Replace and test. Pills stay hidden until the test passes.

Payment or Signature never changes?

GHL keeps invoice and document status where a pill can't read it. Add a workflow that sets something the pill can see: "when invoice paid → add tag paid" or "when document signed → add tag signed", then use the rule Contact does NOT have tag paid. Contacts paid before the workflow existed need the tag added once (bulk action).

A pill shows on the wrong cards, or not on the right ones?

Check the rule: tag names match by name, ignoring capitals, and a custom field has to be the exact field you meant (the list shows its name). Remember pills refresh about once a minute per contact, so give GHL a minute after a change.

Pills take a long time on a big board?

Card Pills reads each card's contact once a minute and stays well inside GHL's limits, so a board with hundreds of cards fills in over several seconds, newest scroll first. Cards you scroll to later show their pills a moment after they appear.

Remove just this tool: switch Card Pills off in Dashboard → Your tools (the pills disappear on the next page load). To stop it reading from a sub-account, click Remove on the Card Pills page, which deletes the saved token, and delete the Private Integration in that sub-account. Nothing in GHL was ever changed, so there is nothing to undo.

16. If it's not working

Did you hard refresh?

GHL only reads Custom JS on a full reload. On the calendar page press Ctrl+Shift+R (Mac: Cmd+Shift+R).

Does your dashboard list the sub-account?

Open your dashboard → Sub-accounts. If it's not there, the code isn't running: check it was saved in Custom JS (or the Tampermonkey script is on) and that both the opening and closing script lines were pasted.

Does it say seats are full?

Single-tool plans cover 10 sub-accounts. Remove one you don't use (it can come back after 7 days) or move to All-Access for unlimited.

Is the tool switched on?

Dashboard → Your tools. Each tool has an on/off switch.

Does the title match a rule?

Open the tool's settings and type the exact title into the test box. With "text before | " rules the title needs a space, a vertical bar and a space after the marker.

Wrong color?

Rules are checked top to bottom and the first match wins. Move the rule you want higher.

Worked, then stopped?

Check your plan in the dashboard (an expired card ends access after Stripe's retries). If GHL changed its calendar page, we update the tool for everyone; no action needed on your side.

Phone app?

The GHL phone app doesn't run custom code, so tools show in a web browser only.

17. Build-it-yourself prompts (free)

What it is: register free at the sign-up page and open Dashboard → Build-it-yourself prompts. Each tool has a prompt you paste into any AI to build your own copy for your own GHL. Every prompt opens with what the build leaves out compared with the hosted tool, and what you would need to run yourself.

First-run check: the prompt ends with an acceptance checklist. Run it in the AI, then open GHL, hard refresh (Ctrl+Shift+R, Mac Cmd+Shift+R) and confirm the tool appears. For tools that need hosting, open the page your AI deployed and confirm the sign-in works before connecting your GHL.

The sign-in email never arrived.

Look in spam, wait two minutes, then use Lost your key? on the sign-in page. We send at most a few links per address per hour.

The AI built something that doesn't show up in GHL.

Re-check where you pasted it (Agency view → Settings → Company → Custom JS), hard refresh, and open the browser console for errors. GHL changes its page markup, so selectors in a build can go stale.

Hosted build: the page loads but shows no data.

Check the environment variables the prompt lists, the GHL token's scopes, and the host's logs. The prompt's first-connect check tells you what GHL returned.

It worked, then stopped.

GHL likely changed something. Ask your AI to re-check the selectors or API fields the prompt lists under Maintenance. The hosted plan is kept current for you.

Uninstall: delete the code from Custom JS (or the Tampermonkey script), and for hosted builds delete the project and its database at your host. Nothing of yours is stored with us beyond your free account.

18. Your account

Signing in: use your account key (it starts with LFM-). It's printed on every LeadFinder Media receipt and invoice from Stripe.

Billing, cards, invoices, cancelling: Dashboard → Manage billing. Cancelling keeps tools on until the end of the paid period.

Code leaked or shared by mistake? Dashboard → Get a new install code. The old code stops working; paste the new one.

Removing everything: delete the code block from Custom JS (or the Tampermonkey script) and cancel in billing.