The office tool of Porta Potty To Go (PPTG): orders, invoices, collections, recurring billing, customers, routes and reports for two markets. GoHighLevel (GHL) is the accounting book (contacts, invoices, payments); Stripe holds the saved cards; the dashboard is the collector (cobrador) and the screen people work in.
Sign in: Google sign-in with a company account. The role (owner, manager, office, finance, field) decides which tiles you see. Preview mode (access key) is NOT a sandbox: it talks to the real server and real GHL / Stripe data — for safe tests, mock the endpoints or use the robot contact only.
Views: Phone view (tiles) everywhere; Office view (left navigation, dense tables, side panel) on desktop. The header's View switch (Auto / Phone / Office) is remembered per user and device; Auto = Office at 1200 px and wider; phones (< 640 px) see no switch.
Markets: West Palm — PPTG (wpb); Orlando — partner (orl)
Screens (Pantallas)
Home (Inicio)
#/home (Office) · the tile grid (Phone)
The start page: greeting, today's numbers (today's stops, open quotes, invoices due / overdue = open invoices at or past their due date, won this month = paid invoices issued this month), the Ask or dictate box, and the tiles your role may open.
How to get there: Sign in. The PPTG logo or the back arrow on any screen returns here.
What you see:
Number chips (a source that could not be read shows '?')
All / West Palm / Orlando buttons and a 'By market —' line (a market that failed says 'unavailable')
'Recurring drafts awaiting activation' line when there are any (opens Invoices)
Ask or dictate (the Assistant)
Tiles: Sales & Billing, Operations, Tools & Reports, and the Manual link
Buttons:
All / West Palm / Orlando — Re-filters the numbers by market. read only
Recurring drafts awaiting activation — Opens Invoices, where they are activated. read only
The number chips are not links (in the Office view the Home tiles are).
New Order (Nueva orden)
tile New Order · Office: #/orders · tile text: “Create customer, quote, invoice”
Build an order for a customer and turn it into an invoice (factura) or a quote (cotización): customer, service address, lines from the catalog, delivery date, notes, Job/PO, tax.
How to get there: Tile 'New Order', '+ New' in Office, 'New order' on a customer profile, or a draft's 'Edit draft'.
What you see:
1 Customer: search by phone / name / email, or create one ('Save customer')
Billing market badge (decided by the service address; Override needs a reason)
2 Service address (site address, ZIP prices the zone, optional place name); 'Schedule pickup' and 'Adds to an active site' options
3 Order: the catalog by category, quantity, price; 'Prices from …' tells how old the prices are
Payment: our pay page by default (saves the card), 'Enter card now', 'Use saved card'; 'Send GHL's link instead' is the secondary path
Send as QUOTE, Preview, Send as INVOICE, Save invoice draft, Save quote draft
Buttons:
Send as INVOICE — The confirm sheet (lines, tax, total, where it goes); Confirm creates the invoice in GHL, makes our pay page and sends it by email (and text where enabled). It also books the delivery on the Google Calendar (and a pickup when ticked), and for recurring lines drafts an inactive GHL recurring template (or enrolls the site in billing when mixedOrders is on). contacts the customerasks first
Payment: Enter card now — Creates the invoice and opens our pay page in staff mode to type the card; the screen waits until it is paid. MONEYasks first
Payment: Use saved card — Creates the invoice and charges the contact's saved card. MONEYasks first
Send as QUOTE — Creates the estimate (cotización) and sends it by email / text. contacts the customerasks first
Preview — How the customer will see it. Read only. read only
Save invoice draft (Guardar borrador) — Creates (or updates, when editing a draft) a GHL draft invoice. Nothing is sent. writes GHL
Save quote draft — Creates a GHL estimate as a draft; send it from Quotes. writes GHL
Save customer / Save contact — Creates the GHL contact, or saves its edits from the customer strip. writes GHL
Override (market) — Bills the order in the other market. A reason is required and goes on the invoice. read only
Create recurring template (draft) — on the result screen — Drafts an inactive GHL recurring invoice template for the recurring lines, after an in-app confirm. writes GHLasks first
Leaving an order with unsaved lines asks 'Discard this order?' first.
The market follows the SERVICE address, not the billing address.
A county with no tax configured in that market blocks invoicing (fail loud) — add the tax in GHL first.
Tax exempt needs a reason (and the certificate on the contact).
'Prices from … (<age>)' next to 'Refresh catalogue' tells how old the prices are; older than 2 days is flagged (the owner can update them in Admin).
Every customer invoice email also goes to the owner as a '[Copy]' (CONFIG.invoiceOwnerCopy; when no GHL contact has that email, CONFIG.ownerContactId). A copy that was not sent is said on the result screen and in a toast.
+ New customer — Creates the GHL contact (read back). writes GHL
Edit — Edits the GHL contact (CC emails, place reference, tax exemption); every save is read back. writes GHL
+ Add site / Save site — Saves a service address on the contact's sites (read back). writes GHL
Remove (site) — Removes a saved site; click twice ("Confirm remove?"). writes GHLasks first
New order / New invoice — Opens New Order with this exact contact. read only
Add note — Writes an internal note on the contact (read back). writes GHL
Recurring… (Sites card) — Opens this customer's recurring templates (active and draft, in that market) with 'Cancel schedule' on each: an in-app confirm ('Keep it' does nothing), then GHL stops making invoices from it — re-read to confirm it shows cancelled, and a 'RECURRING CANCELLED' note goes on the customer's History. Invoices already made stay as they are. There is no Pause (no proxy action yet). writes GHLasks first
'Back' returns to the screen the name was clicked on.
The past-due queue for both markets, worst first, with the reminder ladder: the screen suggests the next step, a human clicks.
How to get there: Tile 'Collections' (its badge counts past-due invoices in both markets).
What you see:
Per-market totals and a market filter
Each invoice: days over, last reminder, the NEXT step
Send reminder (the ladder dialog), Call, Promised to pay, and the shared invoice menu
Buttons:
Send reminder — Opens the reminder dialog with the ladder's step and a preview; Send emails / texts the customer and records a note. contacts the customerasks first
Promised to pay — Hides the invoice from the queue until the promised date (recorded as a note). Asks the date in an in-app date box; Cancel records nothing. writes GHL
Nothing auto-sends: GHL's own reminders are switched off on purpose.
A market that failed to load says 'unavailable', never 0.
When the invoice has no stored pay link, the reminder dialog sends GHL's own invoice email / text instead.
The recurring-billing engine (billing.php): which sites are enrolled, what the next cycle charges, holds that need approval, the daily run, and the activity timeline.
How to get there: Tile 'Billing'.
What you see:
Recurring charging ON / OFF (the kill switch), last run, enrolled / on hold / charged so far, daily limit
Enrolled sites per market with the per-cycle amount and a market filter
Holds (first cycle, amount changed, over a cap)
Waiting for a saved card
Activity timeline by name (raw ids in the tooltip and in 'Show raw log')
Buttons:
Turn charging ON / OFF — The kill switch of automatic charges. MONEYasks first
Authorize charge (a hold) — Charges the saved card NOW for that held cycle. MONEYasks first
Preview today — Shows what today's run would charge. Read only. read only
Enroll (waiting for a saved card) — Enrolls the site in recurring billing once its card is saved. MONEYasks first
Remove (waiting for a saved card) / Unenroll — Stops future automatic charges for that site (the card stays saved; no money moves). read onlyasks first
The first cycle of every site is always held for approval.
Charges stop at the gates (tolerance, jump vs. last cycle, per-charge cap, daily total).
The engine sends no receipt of its own: GHL sends it when the payment is recorded.
Every invoice in both markets: search, filter, sort, and the invoice menu (details, links, send, preview, record payment, refund, edit, void).
How to get there: Tile 'Invoices'.
What you see:
Search (number, name, company, email, phone; address and notes once the invoice's Details were opened)
Filters: market, past due, status, dates, amount, county, source
'Recurring drafts awaiting activation' card when there are any
Rows with status, market and the invoice menu
Buttons:
Details — The invoice as GHL has it. 'Edit line items' (draft, sent, overdue, partially paid: qty, price, name, description, add / remove lines) saves to GHL and, for a sent invoice, asks whether to resend; 'Edit full order' opens a draft in New Order. writes GHL
Open payment link / Copy link — Our pay page link (refreshed when it expired), or GHL's link for invoices made in GHL. read only
Send invoice / Send receipt — The channel dialog (email / text) with a preview; Send contacts the customer. On a draft it first asks: our pay page or GHL's standard email (GHL's is not previewed). contacts the customerasks first
Preview — How the customer will see it (our templates). Read only. read only
Send pay page (saves card) — Makes our pay page (pays the invoice and saves the card), then the email / text choice. A DRAFT is finalized in GHL first (it becomes SENT) — cancelling the choice leaves it sent, nothing reaches the customer. contacts the customerasks first
Charge saved card — Charges the card on file for the amount due (only shown when the contact has a card). MONEYasks first
Record payment — Records a cash / check / Zelle payment in GHL (no card is charged); open invoices only; click twice. writes GHLasks firstflag recordPayments
Refund — Full or partial refund to the card (owner only), also on partially paid invoices; 'Paid outside the card' records the refund only; click twice. A full refund also voids the invoice. MONEYasks firstflag refunds
Edit draft — Opens a draft in New Order, fully editable; 'Save changes' updates the same draft. writes GHL
Edit invoice (sent, unpaid) — Opens a sent / overdue / partially paid invoice in New Order; 'Save changes to invoice #N' updates the SAME invoice (number, dates, status kept; an 'Updated <date>: …' line in its notes and on the customer's History); never below what was already paid. Then 'Resend updated invoice' sends one message with a fresh pay link — the old link stops working. If GHL refuses the update: 'Replace invoice' (new draft, old one voided). writes GHLflag editSentInvoices
Void — Two steps: confirm, then a required reason (saved on the customer). Disabled on paid invoices — refund instead. writes GHLasks first
Send reminder — A payment reminder with the pay link (email, text where enabled), recorded as a note. contacts the customerasks first
Open customer — The customer's profile. read only
Activate (recurring drafts card) — Activates a drafted GHL recurring invoice schedule, charged to the customer's card each cycle. MONEYasks first
Recurring… (invoice menu) — Opens this customer's recurring templates (active and draft, in that market) with 'Cancel schedule' on each: an in-app confirm ('Keep it' does nothing), then GHL stops making invoices from it — re-read to confirm it shows cancelled, and a 'RECURRING CANCELLED' note goes on the customer's History. Invoices already made stay as they are. There is no Pause (no proxy action yet). Shown when the customer has a live template. writes GHLasks first
The SAME invoice menu is in Invoices, Collections, Customers, Office and the New Order result screen.
The customer-facing title is 'PPTG Order — <customer> · Job/PO <po>'; internal stamps (zone, county) ride a 'Dashboard ref:' line in the terms.
Paying through GHL's link does not save the card; our pay page does.
Cancel an activated recurring schedule: 'Recurring…' on the customer card or the invoice menu → 'Cancel schedule'. Pause is not in the dashboard (no proxy action) — pause it in GHL.
Edit → Save draft — Edits a draft quote in GHL. writes GHL
Send to customer / Resend — Sends the estimate to the customer. contacts the customerasks first
Create invoice (accepted quote) — Creates the real invoice (due on receipt) with the quote's lines and the county tax, then sends OUR pay page (pays and saves the card; stored on the invoice) by email + text. If the pay page cannot be made it sends GHL's link and says so. One request every 3 s, so it takes about half a minute. contacts the customerasks first
Request a pickup for an active rental: the request is written on the customer as a note for dispatch. It does NOT book the calendar, stop billing or remove the route stop — dispatch does those.
How to get there: Tile 'Schedule Pickup'.
What you see:
Active rentals in both markets
Search by name or phone
'Request pickup' per customer
Buttons:
Request pickup — One in-app dialog: the date (or 'ASAP', required) and an optional dispatch note, then 'Save pickup note' writes 'PICKUP REQUESTED — <date> — <note>' on the contact. Cancel saves nothing. It does NOT book the calendar and does NOT stop billing (the dialog says so). writes GHL
After the request: book the pickup on the calendar, stop the billing ('Recurring…' on the customer card → Cancel schedule, or Billing → Unenroll) and adjust the route.
Revenue by month: totals by market, zone and status, a separate sales-tax-by-county table, CSV exports.
How to get there: Tile 'Reports'.
What you see:
Prev / This month / Next, Refresh
'By market' lines (WPB / ORL), zone and status totals
'Sales tax by county' table (taxable, tax, lines) with its own Export CSV
Export CSV of the invoices
Buttons:
Export CSV — Downloads exactly what the month view shows (market column WPB / ORL). read only
Export CSV (tax by county) — Downloads the county tax table. read only
What Orlando billed: Reports, pick the month, read the ORL line in 'By market' (or the CSV, market = ORL).
Drafts and voided invoices are excluded.
A past month reads until the start of THAT month (one request every 3 s, so a far month takes a few seconds). A market that could not be read fully is said in red above the totals ('Orlando: incomplete — …; these totals are LOW') — refresh, or check that market in GHL.
Assistant (Asistente)
tile Assistant · the Ask or dictate box · tile text: “Dictate an order, ask anything”
A read-only beta: ask in words (prices by ZIP, customer lookups, invoice status) or dictate; it answers, it takes no action.
How to get there: Tile 'Assistant' or the Ask or dictate box on Home.
What you see:
Chat
Microphone (dictation)
With the assistantDrafts flag: draft cards and customer candidates that open in New Order
Buttons:
Open draft in New Order — Fills New Order with the dictated lines; nothing is sent. read onlyflag assistantDrafts
The Assistant never sends or charges anything by itself.
With assistantDrafts on, 'Open in New Order' asks 'Discard this order?' first when New Order has unsaved lines; Cancel keeps that order.
Prices (catalog) per market, config summary and live health checks (owner).
How to get there: Tile 'Admin' (owner only).
What you see:
Prices (catalog): each market's last update ('West Palm: N products, M prices · from <time> (<age>)')
'Update prices now' (owner)
Config: host, market, service-worker build
Pricing data summary
Health checks: GHL proxy per market, routes proxy (HelloTracks)
Diagnostics (collapsed): billing version and file hashes (click to copy)
Buttons:
Update prices now — Re-reads every product and price from GHL for West Palm, then Orlando (3 s apart) and says the result per market (✓ / ✗ previous prices stay / ? check). Nothing is sent or charged; New Order reads the fresh prices on its next visit. read onlyasks first
Re-run checks — Runs the health checks again. read only
Office view (Vista oficina)
?view=office (only while the officeMode flag is on, and for roles with Customers / Invoices / Collections / Billing / New Order) · #/home #/customers #/invoices #/orders #/collections #/billing #/payments
The desktop layout of the same dashboard: left navigation, global search, dense Customers / Invoices tables with a side panel, + New, bookmarkable routes.
How to get there: View = Office in the header (desktop, when the officeMode flag is on), or ?view=office.
What you see:
Left nav: Home, Customers, Orders / Sites (opens New Order), Invoices, Collections, Recurring billing, Payments (invoices with a payment received)
Global search (name, company, phone, email, address, invoice #)
Invoices title row: summary tiles Drafts / Open / Overdue / Paid (30 days) — a click filters the list to exactly that tile (search and dates cleared); again = all
Market chips
+ New: New order / New invoice (both open New Order), Record payment (jumps to open invoices), New customer
Invoice side panel: the shared invoice menu + tabs Summary (status, customer, dates, pay link, amounts, open balance, addresses) · Lines (the line editor) · Payments · Activity (the customer's notes about THIS invoice) · Notes (what the customer reads)
Colors (brand): Deep Blue sidebar, Brand Blue on the active item, ONE green button per screen (+ New)
Buttons:
+ New — Starts a new order / invoice / customer (asks before discarding an unsaved order). read only
Send reminder (N) — Invoices table — Runs the Collections reminder dialog for each selected open invoice. contacts the customerasks first
Export CSV — Invoices table — Downloads the table. read only
Office spaces its server requests 3 seconds apart (the host blocks bursts).
Keys: / search, n + New, Esc closes the panel.
The Payments / Activity tabs show only notes that name THIS invoice (inv=, num=, 'invoice #N', the proxy's payment / refund notes) — a note that mentions the invoice some other way is on the customer's Notes tab.
Pay page (Página de pago)
app/pay.html?t=<token>
OUR customer-facing pay page (Stripe): pays one invoice and saves the card for future services (with consent).
How to get there: The link in the invoice email / text, 'Open payment link', 'Copy link'.
What you see:
Invoice number and amount
Card / Apple Pay / Google Pay
After paying: 'Send receipt' by email or text
Staff mode (opened by New Order 'Enter card now'): 'Enter the customer's card', no wallets; after a partial charge, 'Charge the remaining … to another card'
Buttons:
Pay now — Charges the card at once (the consent text is shown above it), records the payment in GHL, saves the card. MONEY
Send receipt — Emails or texts the receipt. contacts the customer
One live link per invoice: a newer link replaces the older one ('use the link in the most recent email or text').
The page re-checks the invoice before charging (paid, void, amount changed -> refused).
The code keeps Stripe's Link in customer mode while the decision log says card only — architect to confirm.
The invoice / reminder / receipt EMAILS and the pay page have the website look (D70): blue band with the white logo and the invoice number, the amount, a green PAY NOW button, a Deep Blue footer with the main phone line.
How to … (Cómo hacer)
Send an invoice that saves the card
new-order — Find the customer (or create one), set the service address, add the lines (The market badge follows the address.)
new-order — Leave 'Send GHL's link instead' unticked (the default is our pay page)
new-order — Send as INVOICE, then Confirm (The confirm sheet shows lines, tax, total and the channels.)
Outcome: The invoice exists in GHL as sent; the customer gets our pay page link; paying saves the card. Check it in: The result screen (Pay link = our pay page) and Invoices (status sent).
Send our pay page for an invoice that already exists
payments — Send pay page (saves card), choose email / text, Send (A draft is finalized first; nothing reaches the customer before Send.)
Outcome: The customer gets our pay page link. Check it in: Invoices row (status), the customer's History (note).
Record a cash / check / Zelle payment
payments — Record payment on the invoice (Behind the recordPayments flag.)
payments — Amount, method, date -> Record (click twice)
Outcome: The payment is recorded in GHL (no card charged); the invoice shows paid or the new balance. Check it in: Invoices row ('Paid … of …') and the customer's History.
Refund a card payment
payments — Refund on a paid invoice (owner only) (Behind the refunds flag.)
payments — Full or partial amount, reason -> Refund (A full refund also voids the invoice.)
Outcome: Stripe refunds the card; a note records it. Check it in: The toast, the invoice status, Stripe.
Charge a saved card
payments — 'Charge <amount> to <card>' on an open invoice (Only shown when the contact has a card.)
payments — Confirm (The server charges the exact amount due.)
Outcome: The invoice is paid by the card on file. Check it in: The toast (PI id) and the invoice status.
Edit a draft invoice
payments — Edit draft (Opens in New Order with everything loaded.)
new-order — Change lines / notes / address -> Save changes to draft #N (Updates the same draft; sending it replaces the draft.)
Outcome: The same draft, updated. Check it in: Invoices (draft row).
Bill an order in the other market
new-order — Override next to the market badge, pick the market
new-order — Type the reason (Required; it goes on the invoice.)
Outcome: The invoice is created in the chosen market with 'Market override: … — <reason>' in its terms. Check it in: The invoice terms and the market badge.
Find a customer and its history
customers — Search by name, phone or email (or click the name anywhere)
customers — Read History (invoices, payments, notes, orders, recurring) (Searchable.)
Outcome: Everything about the customer in one place. Check it in: The profile.
Preview before sending
payments — Preview on the invoice (Read only, our templates.)
Outcome: You see the email / text the customer would get. Check it in: The preview dialog.
reports — Read the ORL line in 'By market', or Export CSV (market = ORL)
Outcome: Orlando's billed total for the month (see the Reports known gap for past months). Check it in: Reports.
Work the past-due queue
collections — Start at the top (worst first), read NEXT
collections — Send reminder (the ladder dialog) or Call / Promised to pay (Every action is recorded as a note.)
Outcome: Each past-due invoice has its next step done and recorded. Check it in: Collections (last reminder) and the customer's History.
Change an invoice that was already sent (add a line)
payments — Edit invoice on the sent invoice (Behind the editSentInvoices flag; not for paid invoices.)
new-order — Add / change lines, notes, Job/PO -> Save changes to invoice #N (Nothing reaches the customer yet.)
new-order — Resend updated invoice (One message with a new pay link for the new amount.)
Outcome: The same invoice with the new lines and total; the customer has one link that pays the new amount. Check it in: The invoice's notes ('Updated …') and the customer's History.
Stop a customer's recurring billing (early pickup, cancelled service)
customers — Open the customer → Sites card → Recurring… (Or 'Recurring…' on one of their invoices.)
customers — Cancel schedule on the template → confirm (House rule: the period already started is charged in full — no proration, no refunds.)
Outcome: GHL makes no more invoices from that template; already-made invoices are unchanged (void or refund them separately). Check it in: The dialog re-reads GHL and no longer lists it; a 'RECURRING CANCELLED' note on the customer's History.
Rules the dashboard follows (Reglas)
The market (West Palm / Orlando) is decided by the SERVICE address: its ZIP's zone first, then the county list; overriding needs a reason that goes on the invoice. (docs/DESIGN-market-attribution.md)
Base prices are the SEFL column of the master catalog (v20); zones are applied on top by the agents, never in ServiceCore. (DECISIONES.md · Precios (2026-09-19))
Trailers cost the same in every zone (no zone factor). (DECISIONES.md · Precios (2026-08-28))
Trailers rent by Day/Event (up to 4 days), 7 days or 28 days; one extra day is another Day/Event, two or more extra days = quote the week. No extension rate. (DECISIONES.md · Precios (2026-08-28))
Price increases apply to new orders only; existing customers keep their price until decided otherwise. (DECISIONES.md · Precios (2026-09-26))
'Deluxe' is not a separate unit: it is a standard unit in better condition, reserved for events. VIP is only the VIP with flush. (DECISIONES.md · Producto y flota (2026-09-26))
Trailer fleet: 2, 3, 4, 6, 8 and 10 stations; 5, 7 and 9 exist on invoices but deliver 6, 8 or 10 at the same price — never a smaller one. (DECISIONES.md · Producto y flota (2026-09-29))
The catalog never mentions third-party providers. (DECISIONES.md · Producto y flota (2026-09-18))
Recurring services bill every 28 days, no proration (event vs. construction rule); billing comparisons use billingStart / billingEnd, never the issue date. (DECISIONES.md · Datos y herramientas (2026-09-19, 2026-09-26))
The dashboard is the collector; GHL is the accounting book. GHL autopay is not used (paying one invoice there does not save the card). (DECISIONES.md · Datos y herramientas (2026-09-19))
The billing engine always holds the first cycle of every site for approval, and stops a charge at its gates (tolerance, jump vs. last cycle, per-charge cap, daily total). (DECISIONES.md · Datos y herramientas (2026-09-19))
Dashboard payments are by card only (Apple Pay and Google Pay included); Link and PayPal are off on purpose. (DECISIONES.md · Datos y herramientas)
Sales tax is the county of the service address (Florida, destination based); a county with no tax configured in the billing market blocks invoicing until it is added in GHL. (app/county-taxes.json)
Tax exempt needs a reason, and for a customer the Florida certificate on the contact; an expired certificate is said on screen. (D43 / D46)
Invoices are due on receipt (house rule). (New Order / Quotes)
No discounts: price is price. (DECISIONES.md · Agentes de voz y SMS (2026-09-23))
Nothing reaches a customer or moves money without a human click in the dashboard; GHL's automatic reminders are off. (PPTG-AGENT-BRIEF.md)
One live pay link per invoice: a newer link replaces the older one, and the pay page refuses an invoice that is paid, void or whose amount changed. (reviews/ARCH-D61-PHP-2026-10-10.md)
Feature flags (app/config.js)
officeMode = ON — Shows the View switch (Auto / Phone / Office) in the header and the Office layout on desktop. ON since D73 (owner, 2026-10-13). Owner decision, Code changes app/config.js in a PR.
recordPayments = OFF — 'Record payment' (cash / check / Zelle) on open invoices. Owner decision, Code in a PR.
refunds = OFF — 'Refund' on paid invoices (owner only on the server too). Owner decision, Code in a PR.
mixedOrders = OFF — Once / Recurring per line and the billing cycle in New Order. Owner decision, Code in a PR.
taxExempt = ON — The 'No tax on this invoice' option with a required reason. Owner decision, Code in a PR.
invoiceCc = ON — CC emails on an invoice (saved back to the contact). Owner decision, Code in a PR.
assistantDrafts = OFF — The Assistant can hand a dictated order to New Order. Owner decision, Code in a PR.
editSentInvoices = ON — 'Edit invoice' on sent / overdue / partially paid invoices (edit in New Order, Save updates the same invoice, then 'Resend updated invoice' with a fresh pay link). ON since batch 3 (proxy.php e1821ce4 live); the architect checks it live with the robot after the deploy. Owner decision (the architect runs the robot live check right after), Code in a PR.
Never (Nunca)
Never send, charge, refund or void without a human click in the dashboard.
Use only the robot contact for probes and tests; never a real customer.
Never paste or print secrets (tokens, keys, secrets.php).
Never re-enable GHL's automatic reminders.
Never make more than one server request every 3 seconds in automation (the host blocks bursts).
Never edit PHP from the dashboard side (proxy.php and billing.php belong to the architect; the owner uploads them).
Never merge or deploy without the owner.
Never promise a price or a discount that the catalog does not have.
Never treat preview / access-key mode as a sandbox: it reaches the real server.
Glossary (Glosario)
Invoice (Factura) — A GHL invoice; the dashboard sends and collects it.
Draft (Borrador) — An invoice that exists but was not sent.
Quote / Estimate (Cotización) — A price proposal; becomes an invoice when accepted.
Pay page (Página de pago) — Our Stripe page that pays an invoice and saves the card.
Market (Mercado) — West Palm (PPTG) or Orlando (partner), each a GHL sub-account.
Service address / Site (Dirección de servicio / Sitio) — Where the units are; decides market, zone and tax.
Zone (Zona) — The price band of a ZIP (SEFL is the base).
Cycle (Ciclo) — One 28-day billing period of a recurring service.
Collections (Cobranza) — Following up past-due invoices.
Past due (Vencida) — An open invoice after its due date.
Void (Anular) — Cancel an unpaid invoice (it stays as a record).
Refund (Reembolso) — Return money to the card.
Job/PO (Trabajo / Orden de compra) — The customer's job or purchase-order number, printed on the invoice.
Robot contact (Contacto robot) — The test contact used for every probe.
For an AI operator
Read manual.json (schema 1) or manual.md: the same content, plus the server actions (names and purposes) and the files. Probe with the robot contact only; never send, charge, refund or void without a human click.