# Galaxy Unit — for AI agents Galaxy Unit is a business operating system for small service businesses (boat and auto detailing, cleaning, landscaping, contractors and 28 industry templates): CRM, jobs and scheduling, quotes, invoices with PDF and e-mail, expenses with AI receipt capture, workers and hours, materials, a bookkeeper view, analytics and a copilot that reads the business and proposes actions a person confirms. Canada and the United States; English, French, Spanish and Ukrainian UI. ## Status for agents (read this first) Live today: the discovery layer (this page, /llms.txt, /llms-full.txt, /capabilities.json, /pricing.json, /pricing.md, the two .well-known cards) and REST API v1 at https://app.galaxyunit.app/api/v1 — contract in /openapi.json. An owner or admin issues an API key in Settings → Integrations; the key acts as that member (never above admin) under row-level security, with read and optional write scope. First call: GET /api/v1/me. What v1 covers: list/get contacts, jobs, quotes, invoices (with items), expenses; create any of them (write scope, Idempotency-Key required, ?dry_run=1 previews a priced quote/invoice without writing); POST /estimate prices services from the business price list; GET /business/summary (what needs attention), /business/money (unpaid, spend, revenue), /events (activity log). Money is a decimal string; dates are YYYY-MM-DD in the business time zone. Errors carry code, field and a hint. A 402 answer is a PLAN_REQUIRED envelope: relay message_for_owner and approve_url to the human, then retry the same call. MCP: https://app.galaxyunit.app/api/mcp (Streamable HTTP, spec 2026-07-28, POST only) with the same Bearer API key. Add it to any MCP client: {"mcpServers":{"galaxy-unit":{"url":"https://app.galaxyunit.app/api/mcp","headers":{"Authorization":"Bearer gu_live_..."}}}}. Tools = the capability registry filtered by the key's role and scope, plus whoami, business_summary, business_money. PATCH /api/v1/contacts/{id} and /api/v1/jobs/{id} update a record with If-Match: (optimistic concurrency, 412 on a stale version). Quotes, invoices and expenses are not patchable yet. The roadmap below says what is being built and in which order. OAuth 2.1 is live for MCP clients: protected-resource metadata at https://app.galaxyunit.app/.well-known/oauth-protected-resource/api/mcp, authorization server at https://app.galaxyunit.app (PKCE S256, Client ID Metadata Documents, dynamic registration for older clients). In Claude.ai: Settings → Connectors → Add custom connector → URL https://app.galaxyunit.app/api/mcp; the owner signs in and approves read or read+write; the consent appears as a key in Settings → Integrations and can be revoked there. ## How a person connects an agent today A human owner signs up at https://app.galaxyunit.app/register (free plan, no card), completes a 7-step onboarding (country and tax first), and uses the built-in copilot (text and voice) inside the app. The copilot runs on the same capability registry listed in /capabilities.json: reads answer immediately, writes are proposals the owner confirms in the UI. If you are an agent acting for such an owner, the useful thing you can do right now is: read /pricing.json, read /capabilities.json to know what the product can do, and send the owner to /register or to /contact. ## What the capability registry contains Reads: find a client by any handle, schedule for a day or range, unpaid invoices, spend by category, the price list, job details, client history, revenue, one invoice, an estimate priced from the business's own price list (per-foot, per-hour, flat), workers, tasks, and setup gaps. Writes (owner-confirmed): create contact, job, quote, invoice, expense, task and expense category; update job and contact; add a payment; log job hours; remember a note; complete or reschedule a task; draft a message. Every capability carries the permission a caller must hold (owner, admin, helper, accountant). The same registry will back the REST API and the MCP server, so the names you see in /capabilities.json are the names you will call. ## Roadmap for agents (plan 100), in order Each item ships as its own release. Nothing below is available until it appears in the Status section above. - DONE — PR-2 API keys, PR-3 REST v1 with /openapi.json, PR-4a MCP endpoint, PR-4b OAuth 2.1 for MCP clients. - PR-5 — row versions and 412 on stale updates, so an agent and a person cannot silently overwrite each other. - PR-6 — owner confirmation outside the app (e-mail approve / reject), signed webhooks (invoice.paid, quote.approved, lead.created, job.completed), a trust ladder that lets an owner grant an agent autonomy per action. - PR-7 — agent-initiated signup: the agent registers a business for its owner; the key is issued only after the owner clicks a confirmation e-mail. ## Security posture (what will not change) Every record belongs to a business; access is by membership and role, enforced in the application and by row-level security in the database. A key will never exceed the admin role. Money is computed on the server (Decimal, never floats); totals sent by a caller are recomputed. Writes by agents require a human confirmation until the owner explicitly grants autonomy for that action type. Report a security finding through https://galaxyunit.app/contact?topic=security. Please do not test against real customer accounts. ## Links - https://galaxyunit.app/llms.txt — index - https://galaxyunit.app/llms-full.txt — this content plus the capability list and pricing, one file - https://galaxyunit.app/capabilities.json — copilot capability registry (generated from code) - https://galaxyunit.app/pricing.json — live plan ladder; https://galaxyunit.app/pricing.md — the same as markdown - https://galaxyunit.app/.well-known/ai-catalog.json — index of machine entry points - https://galaxyunit.app/.well-known/agent-card.json — identity card - https://galaxyunit.app/openapi.json — OpenAPI 3.1 for https://app.galaxyunit.app/api/v1 - https://app.galaxyunit.app/api/mcp — MCP endpoint (Bearer API key) - https://galaxyunit.app/industries — 28 industry templates; https://galaxyunit.app/compare/jobber — vs Jobber - https://galaxyunit.app/legal — terms, privacy, AI and data use - https://app.galaxyunit.app/register — a human creates the workspace ## Capability registry (from code, same as /capabilities.json) - find_contact (read, needs contacts.read.billing): Look up a client by ANY handle the owner remembers — person name, company, boat/object name or location ("клиент с лодкой Милос", "the guy at Port Credit") — to get their phone, email, location, object and size. Use whenever the user asks about a specific client. A miss returns similar existing clients to offer. - get_schedule (read, needs jobs.read): Get jobs for a date or date range. Use for "what's on today/tomorrow/this week" and for a NAMED day ("what do I have on Thursday", "на пятницу") — for a named day pass `date`, resolved against TODAY in the context, not `range`. - get_unpaid (read, needs invoices.read): List invoices that still owe money (sent/overdue/partially paid) with balances. Use for "who hasn't paid", AR questions. - get_spend (read, needs expenses.read): Total expenses for a period, broken down by category — the OUTGOING side and nothing else. Use for "how much did I spend", "what went on fuel this month". NEVER for profit, margin or "what did I earn": profit needs the incoming side too and belongs to get_revenue, which already includes expenses. - get_price_list (read, needs settings.services.read): The business price list: unit RATES per service. Use only to SHOW the menu ("what services do we have", "what is our rate for X"). To price an actual job for a client — any question with a size, a quantity or a total in it — call `estimate` instead: it returns the same rates already multiplied and taxed on the server. - get_job_details (read, needs jobs.read): Full details of specific job(s) by client name or job title: price, deposit, services, workers with hours, payroll, expenses and profit. Use for "how did the X job do", "who worked on…", job profit questions. - get_client_history (read, needs invoices.read): Everything about one client: all their jobs, invoices, how much they were billed and paid lifetime. Use for "history with X", "how much has X spent with us". - get_revenue (read, needs analytics.read): The WHOLE money picture for a period: payments received, amount invoiced, expenses, and profit — both sides at once. Use for "how much did I make", "какой профит", revenue, profit and margin questions. Every PROFIT question comes here and never to get_spend: this already carries the expense figure, so there is nothing to fetch separately. - get_invoice (read, needs invoices.read): One invoice in full by its number: line items, payments, balance. Use for "what's on invoice X", "is INV-… paid". - estimate (read, needs settings.services.read): Price a set of services into a quote-ready estimate using the business price list (per-unit, hourly and flat pricing, tax included in the total). Use ONLY when the owner is ASKING what something costs: "how much for X and Y", "quote a hull polish for a 42-footer", "what would that cost". If they are TELLING you to book/create/schedule a job — even one with prices in the sentence — call create_job instead; this tool books nothing. The server does ALL the math from the real price list — never multiply, add or invent a price yourself, not even for a single line. - get_workers (read, needs expenses.read): Workers/crew: rates and this period's labor pay, split into paid vs unpaid. Use for "who do I owe", payroll questions. - get_tasks (read, needs jobs.read): The to-do list: what is due today, what is overdue, what is coming. Use for "what do I need to do", "any tasks today", "what did I forget". - open_page (read, needs copilot.use): Navigate the user to a Galaxy page: a client's CRM profile, a job, an invoice, or a main section. Use ONLY when the user explicitly asks to OPEN / GO TO / SHOW the page ("открой клиента X", "open the Nuno job", "покажи счёт INV-…", "открой календарь"). Do NOT use it to answer data questions ("who owes me", "what's this week") or "where do I change X" questions — answer those with words instead. - create_expense (write, needs expenses.write): Record a business expense. Use for "log/record an expense", "I spent X on Y". - create_contact (write, needs contacts.write): Add a client/contact. Use for "add a client", "new customer". - create_task (write, needs jobs.write): Add a to-do/task for a date, optionally at a time. Use for "remind me to…", "add a task", "task tomorrow at 9". - create_job (write, needs jobs.write): Create a job/booking for a client. Can set price, deposit, services and assigned workers with hours. Use for "book a job", "schedule…", "create a job for X at $Y with worker Z for N hours". BOOK FIRST: a job needs only a client, a title and a date — do NOT ask for size, price or deposit before creating it, and do not withhold the booking because pricing is unknown. Always pass the requested service as a services line; give a price ONLY when the owner said one — otherwise OMIT price and the server takes it from the price list (per-foot services are multiplied by the client's boat length on the server). Never invent a price. - add_payment (write, needs payments.write): Record a payment against an invoice. Use for "mark invoice X paid", "got paid". - remember_note (write, needs copilot.use): Save a lasting preference/fact about this business for future chats. - complete_task (write, needs jobs.write): Mark a to-do / checklist item as DONE (or undone). Use whenever the user reports something is finished or bought: "I bought the compound", "mark X done", "отметь что сделано", "я купил краску — отметь", "uncheck X". This is the tool for "done" — not log_job_hours (worker hours) and not create_task (a new to-do). - reschedule_task (write, needs jobs.write): Move a to-do to another day, or set/clear its time. Use for "push X to tomorrow", "move X to Friday at 9". - draft_message (draft, needs contacts.read.billing): Compose a ready-to-send message DRAFT to a client (payment reminder, arrival heads-up, quote follow-up, thank-you…). NOTHING is sent — the owner gets the text with Copy/Share buttons and sends it themselves. Write in the language the CLIENT is spoken to (clients here are usually English-speaking even when the owner talks to you in another language; follow any stored note about the client's language). CRITICAL: any amount, invoice number, date or balance in the draft must be copied EXACTLY from a read tool result in this conversation — call get_unpaid / get_invoice / get_client_history first if you don't have the figure; never compute or recall money from memory. - create_expense_category (write, needs expenses.write): Add a NEW expense category to this business. Use ONLY when the user EXPLICITLY asks to add/create a category ("добавь категорию разрешения", "make a Permits category"). Never call it while logging an expense — create_expense handles that on its own with the existing keys. If a same-meaning category already exists in any language, use the existing one; the server refuses lookalikes and returns the existing category instead. - update_job (write, needs jobs.write): Change an EXISTING job: its stage, dates, title, location, price, deposit or notes, or its service lines (add / reprice / remove a line; the total is recomputed on the server). Use for "move X to scheduled", "перенеси на пятницу", "поменяй этап", "raise the price on Y". Only pass the fields being changed — everything omitted is left exactly as it is. To create a NEW job use create_job; for worker hours use log_job_hours. - log_job_hours (write, needs workers.log_hours): PAYROLL ONLY: record hours a WORKER spent on an existing job — "добавь Диме 3 часа на джоб Нуно", "log 4 hours for Max on the Roscoe job". Requires a worker NAME and a number of HOURS in the request. NOT for marking tasks or checklist items done (that is complete_task), not for creating jobs (create_job), not for prices or services (update_job). The pay rate comes from the worker card on the server — never pass a rate. - update_contact (write, needs contacts.write): Change an EXISTING client/contact: phone, email, location (marina), object (boat) name / size / model / year, slip, notes, billing address, company or name. Use for "поменяй телефон Janet", "Sarah moved to Bluffers Park", "update Mike's boat length to 40". Only pass the fields being changed — everything omitted is left exactly as it is. NEVER create a second contact to "fix" one; to add a NEW client use create_contact. For jobs use update_job. - create_quote (write, needs quotes.write): Create a QUOTE (estimate) for a client as a draft document. Use for "send a quote", "quote Kai for…", "сделай квоту / смету". Either name the JOB to quote (its service lines are copied) or give the client and the line items with prices. Never invent a price: take it from what the user said or from get_price_list, otherwise ask. Tax comes from the business settings; the card shows lines and total before anything is created. - create_invoice (write, needs invoices.write): Create an INVOICE as a draft document. Use for "invoice X", "bill Nuno for yesterday's job", "выставь счёт". Either name the JOB (its service lines are copied) or give the client and the line items with prices. Never invent a price — ask. Tax comes from the business settings and the due date from its payment terms; the card shows lines, tax and total before anything is created. To record money already received use add_payment, not this. - get_setup_gaps (read, needs settings.financial.read): What is missing or wrong in this business's setup — the tester's eyes. Call it when the owner asks what to improve, what is not set up, "посмотри, что не так / что улучшить", "what am I missing", "is everything configured". Returns concrete gaps (empty payment instructions, services with no price, tax off where the state charges it, no logo, no clients yet, drafts never sent, invoices unpaid past terms…) with where to fix each. Answer with the gaps most important first; propose fixes as actions the owner confirms — never change anything on your own. - update_invoice (write, needs invoices.write): Change the DATES or NOTES of an EXISTING invoice: the issue date ("поставь дату счёта 17 сентября", "the invoice should be dated the job day"), the due date, or the notes. Name the invoice by its number ("INV-2026-0196") or by the client ("last invoice for Joe") — the card shows was → will be before anything changes. Only pass the fields being changed. NOT for line items, prices or tax (that is still the invoice page), not for recording money (add_payment), not for creating one (create_invoice). Paid and cancelled invoices cannot be changed. - create_proposal (write, needs quotes.write): Create a PROPOSAL — a quote with OPTIONS — as a draft document: two or three levels of the same job (budget / mid / premium), each with its own services and its own total, one marked recommended. Use when the owner asks for options, variants or packages ("сделай предложение с тремя вариантами", "quote him three options", "give her a budget and a premium version"). For ONE fixed scope use create_quote. Name every service EXACTLY as it is in get_price_list (call it first if you have not this conversation): the server takes each rate, unit and "what's included" list from the price list and multiplies per-foot rates by the client's size — never pass or compute a price. Write the intro and each option's summary honestly: what the option will and will NOT achieve. The card shows every option with its total before anything is created. # Galaxy Unit — pricing Currency: CAD. Flat price per business, no per-user fees. Early access: every plan is free right now; the prices below are the expected prices after early access. Trial: 14 days of Pro, no card. ## Free - Monthly: $0.00 · Annual: $0.00/month - Start running the business properly. - For: For a new or very small business that needs one place for customers and work before it is ready to pay. - Includes: 1 user - Includes: Core CRM & customers - Includes: Jobs, tasks & calendar - Includes: Quotes & invoices - Includes: Basic expenses - Includes: Limited receipt scans - Includes: Limited Galaxy Copilot ## Solo - Monthly: $29.00 · Annual: $21.00/month - Run the business. - For: For the owner who is still the salesperson, scheduler, operator and bookkeeper. - Includes: 1 user - Includes: Full CRM, jobs & calendar - Includes: Quotes & invoices with branded PDFs - Includes: Expenses, materials & equipment - Includes: Receipt Scanner - Includes: Job costing & actual profitability - Includes: Core Bookkeeper - Includes: Galaxy Copilot included ## Pro (recommended) - Monthly: $48.00 · Annual: $32.00/month - Understand + act. - For: For the owner who wants Galaxy to understand the whole business and help operate it. - Includes: 3 users included - Includes: Everything in Solo - Includes: Advanced Galaxy Copilot - Includes: Voice Copilot allowance - Includes: Prepared actions + confirmation - Includes: Full Bookkeeper & tax position - Includes: Advanced analytics - Includes: Higher receipt + AI capacity ## Team - Monthly: $89.00 · Annual: $78.00/month - Coordinate the crew. - For: For a working team where assignments, labor cost, capacity and accountability matter every day. - Includes: 8 users included - Includes: Everything in Pro - Includes: Team scheduling & assignments - Includes: Capacity visibility - Includes: Worker hours & labor cost - Includes: Team tasks & accountability - Includes: Crew profitability context - Includes: Higher Copilot + Voice capacity ## Scale - Monthly: $299.99 · Annual: $194.00/month - Control the operation. - For: For a larger service business where the owner can no longer personally touch every customer, job and decision. - Includes: 15 users included - Includes: Everything in Team - Includes: High Copilot + Voice capacity - Includes: Higher receipt volume - Includes: Advanced roles & permissions - Includes: Large workspace capacity - Includes: Priority onboarding - Includes: Priority support Sign up: https://app.galaxyunit.app/register · Human page: https://galaxyunit.app/pricing ## One-line summary Galaxy Unit is a business operating system for small service businesses (boat and auto detailing, cleaning, landscaping, contractors and 28 industry templates): CRM, jobs and scheduling, quotes, invoices with PDF and e-mail, expenses with AI receipt capture, workers and hours, materials, a bookkeeper view, analytics and a copilot that reads the business and proposes actions a person confirms. Canada and the United States; English, French, Spanish and Ukrainian UI.