Run your CRM by talking to AI

Stop clicking. Start asking.

Generate one token, paste it into Claude or ChatGPT, and your AI runs your CRM for you. Text every unpaid customer. Send a quote. Schedule next week. Find every job in Charlotte. You never have to click a button again.

The stuff you hate doing

Every contractor we talk to has the same list. AI handles all of it now.

Hard

Following up on quotes

With AI

AI texts every customer who got a quote 3+ days ago

Hard

Collecting unpaid invoices

With AI

AI texts everyone with an unpaid invoice and a payment link

Hard

Re-engaging past customers

With AI

AI sends a check-in to everyone you've worked with in the last 12 months

Hard

Filling next week's calendar

With AI

AI lists every booked job, every gap, every lead waiting for a quote

Hard

Quoting from a phone call

With AI

AI creates the lead, schedules a callback, drafts the quote — while you're still on the phone

Hard

Knowing who owes you what

With AI

AI gives you total outstanding, oldest invoice, and worst payer in 5 seconds

What to ask

18 prompts that run your business for you

Once your AI is connected, you literally just talk to it. Here are real prompts contractors are using right now. Copy any of them straight into Claude or ChatGPT.

Money

You ask

"Who owes me money right now? Total it."

It does

Lists every unpaid invoice with customer name, amount, days overdue, and total balance owed.

You ask

"Text every customer with an invoice older than 14 days. Polite but firm."

It does

Pulls all past-due invoices, drafts a personalized SMS per customer with their amount and a Stripe link, sends via Twilio.

You ask

"What did I make last month? Break it down by service type."

It does

Sums all completed jobs in the last 30 days grouped by serviceType (Driveway, Patio, Sidewalk, etc.) with totals and counts.

You ask

"Who's my best-paying customer this year?"

It does

Aggregates all paid jobs by client, sorted by total revenue. Shows top 10 with contact info.

Sales & follow-up

You ask

"Find every quote that's been sitting for more than 3 days with no answer. Text them a friendly nudge."

It does

Pulls all SENT quotes 3+ days old without acceptance, drafts a personalized nudge per customer, sends via your iPhone.

You ask

"Show me every lead from the last 7 days that I haven't called yet."

It does

Filters leads where status=NEW, sorted oldest first, with phone numbers ready to tap.

You ask

"Reach out to every past customer from 2025. Tell them I'm offering 10% off driveway sealing this month."

It does

Pulls every client with a completed job in 2025, drafts a personalized offer text per customer, queues them up for review before sending.

You ask

"What did Mrs. Henderson pay for last time?"

It does

Looks up Henderson, returns past job(s), service type, price, completion date, and any notes.

You ask

"Create a quote for a 20x40 stamped driveway in Cornelius for $9,500. Send it to John Davis at 704-555-0142."

It does

Creates the client (or matches existing), creates a job draft, generates a quote, and texts the customer the link.

Schedule & ops

You ask

"What's on my calendar next week?"

It does

Lists every scheduled job for the next 7 days with customer, address, service, and price.

You ask

"Schedule the McKenzie pour for Thursday at 8am."

It does

Looks up McKenzie's job, sets scheduledDate to Thursday 8am, optionally texts customer with confirmation.

You ask

"Find every job in Concord that I haven't completed yet."

It does

Filters jobs by city=Concord and status != COMPLETED, returns full list with addresses and prices.

You ask

"Move every Friday job to next Tuesday — rain in the forecast."

It does

Lists Friday's scheduled jobs, asks for confirmation, then bulk-reschedules + texts each customer the new date.

Knowing your business

You ask

"How many leads did I get this month vs last month?"

It does

Counts new leads created in current and previous month, returns both numbers and the % change.

You ask

"Which city brings me the most jobs?"

It does

Groups completed jobs by city, returns top 5 with counts and revenue.

You ask

"Which sales rep is closing the most this month?"

It does

Aggregates jobs per salesRepId for current month, ranks by close rate and revenue.

You ask

"What's my average ticket size for driveways?"

It does

Filters jobs by serviceType=Driveway, returns mean, median, and range.

You ask

"How long does it take me on average to go from lead to paid job?"

It does

Calculates median days between lead createdAt → job completedAt → invoice paidAt.

Pro tip: The first time you use any of these, your AI will ask before doing anything destructive (like sending texts or creating jobs). Once you trust it, you can tell it "you don't have to ask, just do it" and it'll move faster.
Step 0

Generate your token (60 seconds)

This is the one piece of setup that's the same no matter which AI you use. Generate a token once, then paste it into whatever tool you want.

1

Open Settings → API Tokens

Log into app.lowkly.com. In the sidebar, click Settings, then click the API Tokens tile.

2

Click 'Generate token'

Give it a name you'll recognize later (e.g. "Claude on my MacBook" or "ChatGPT phone GPT"). Pick an expiry — for personal use, "Never" is fine. For something you're sharing with a contractor, use 30 days or 6 months.

Pick a scope: Full (read + write — recommended) or Read-only (just looking, no changes).

3

Copy the token

You'll see lwk_live_ followed by a long string. Copy it now — you won't be able to see it again. (You can always generate a new one.)

lwk_live_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
4

Paste it into your AI

Jump to whichever AI you want to use:

Best for daily use

Connect Claude Desktop (full walkthrough)

Claude Desktop is Anthropic's free Mac/Windows app. It supports MCP — a standard way for Claude to talk to outside tools. Once Lowkly is wired in, Claude can read and write to your CRM directly.

1

Download Claude Desktop

Go to claude.ai/download and install for your OS. The free plan works fine to start. Sign in with the email you want to use.

2

Open the MCP config file

On Mac: in Finder, hit Cmd + Shift + G and paste:

~/Library/Application Support/Claude/claude_desktop_config.json

On Windows: open the Run dialog (Win + R) and paste:

%APPDATA%\Claude\claude_desktop_config.json

If the file doesn't exist, create it. Open it in any text editor (TextEdit, VS Code, Notepad).

3

Paste this config

Copy the block below into the file. Replace the lwk_live_xxx… with your real token from Step 0.

{
  "mcpServers": {
    "lowkly": {
      "command": "npx",
      "args": ["-y", "mcp-server-fetch"],
      "env": {
        "LOWKLY_TOKEN": "lwk_live_xxxxxxxxxxxxxxxxxxxxxxxx",
        "LOWKLY_BASE": "https://app.lowkly.com"
      }
    }
  }
}

If you already have other MCP servers, just add the "lowkly" block alongside them — don't replace the whole file.

4

Restart Claude Desktop

Quit Claude Desktop completely (Cmd+Q on Mac), then reopen. The MCP server connects on startup. You should see a small tools icon at the bottom of the input — that means Lowkly is wired up.

5

Test it

Type in the chat:

Use the lowkly tool to call /api/v1/me. What company am I connected to?

Claude will hit the API and reply with your company name. You're live. Now try any of the prompts above.

Best for sharing with team

Connect ChatGPT (custom GPT)

If you have ChatGPT Plus ($20/mo), you can build a custom GPT that knows how to use Lowkly. Anyone you share it with can use it without setting anything up themselves.

1

Open the GPT builder

In ChatGPT, click your name (bottom-left) → My GPTsCreate a GPT. (Or go straight to chatgpt.com/gpts/editor.)

2

Name it + give it instructions

Click Configure at the top. Suggested name: "Lowkly CRM". Suggested instructions:

You are an assistant for a contracting business that uses the Lowkly CRM. You can read and write to the CRM via the connected actions.

When the user asks about clients, jobs, leads, or money, hit the API. Always confirm before:
- creating new records
- sending texts to customers
- changing job status

Use US date format. Be concise. When you list customers or jobs, use a tight markdown table.
3

Add the Action

Scroll down to ActionsCreate new action. In the Authentication popup, pick API keyAuth Type: Bearer → paste your lwk_live_… token.

In the Schema field, paste this:

{
  "openapi": "3.1.0",
  "info": { "title": "Lowkly API", "version": "1.0.0" },
  "servers": [{ "url": "https://app.lowkly.com" }],
  "paths": {
    "/api/v1/me": {
      "get": { "operationId": "getMe", "summary": "Get the connected company",
        "responses": { "200": { "description": "OK" } } }
    },
    "/api/v1/clients": {
      "get": { "operationId": "listClients", "summary": "List clients",
        "parameters": [
          { "name": "q", "in": "query", "schema": { "type": "string" } },
          { "name": "limit", "in": "query", "schema": { "type": "integer" } }
        ],
        "responses": { "200": { "description": "OK" } } },
      "post": { "operationId": "createClient", "summary": "Create a client",
        "requestBody": { "required": true,
          "content": { "application/json": { "schema": { "type": "object",
            "required": ["name", "phone"],
            "properties": {
              "name": { "type": "string" }, "phone": { "type": "string" },
              "email": { "type": "string" }, "address": { "type": "string" },
              "city": { "type": "string" }, "state": { "type": "string" },
              "zip": { "type": "string" }, "notes": { "type": "string" }
            } } } } },
        "responses": { "201": { "description": "Created" } } }
    },
    "/api/v1/jobs": {
      "get": { "operationId": "listJobs", "summary": "List jobs",
        "parameters": [
          { "name": "status", "in": "query", "schema": { "type": "string" } },
          { "name": "limit", "in": "query", "schema": { "type": "integer" } }
        ],
        "responses": { "200": { "description": "OK" } } },
      "post": { "operationId": "createJob", "summary": "Create a job",
        "responses": { "201": { "description": "Created" } } }
    },
    "/api/v1/leads": {
      "get": { "operationId": "listLeads", "summary": "List leads",
        "parameters": [
          { "name": "status", "in": "query", "schema": { "type": "string" } },
          { "name": "limit", "in": "query", "schema": { "type": "integer" } }
        ],
        "responses": { "200": { "description": "OK" } } },
      "post": { "operationId": "createLead", "summary": "Create a lead",
        "responses": { "201": { "description": "Created" } } }
    }
  },
  "components": { "securitySchemes": { "bearerAuth": { "type": "http", "scheme": "bearer" } } },
  "security": [{ "bearerAuth": [] }]
}
4

Test in the right pane

The right side of the GPT editor is a live preview. Type:

Show me my last 10 leads.

It should hit /api/v1/leads and show them. That's it. Click SaveOnly me (or Anyone with a link if you want to share).

5

Use it from your phone

Open the ChatGPT mobile app, tap the GPT icon, find your custom GPT. Now you can text-to-Lowkly from your phone in the field.

No-code automations

Zapier, n8n, Make — recipe library

If you'd rather have things happen automatically (not just when you ask), wire Lowkly into Zapier or n8n. Every endpoint works with any tool that can hit a URL.

Setup (any tool)

Add an HTTP Request / Webhook step. Method: GET, POST, or PATCH depending on what you want. Headers:

Authorization: Bearer lwk_live_xxxxxxxxxxxxxxxxxxxxxxxx
Content-Type: application/json

Recipes

When

New row in Google Sheets (lead form export)

Do

POST /api/v1/leads with the row data

Anything that hits a Google Sheet becomes a Lowkly lead. Form fills, MailChimp signups, even forwarded emails.

When

Every weekday at 8 AM

Do

GET /api/v1/jobs?status=SCHEDULED → Slack message with today's jobs

Morning briefing in Slack so your team knows what's on the calendar before coffee.

When

New invoice marked PAID (Stripe webhook)

Do

PATCH /api/v1/jobs/:id with status=COMPLETED

Auto-close jobs the moment payment hits. No more 'did they pay yet' questions.

When

Lead older than 24 hours with status=NEW

Do

POST text via Twilio with a friendly check-in

Never let a lead sit cold. Auto-text within a day if no one's reached out.

When

New job created with price > $10,000

Do

Slack DM the owner

Big jobs get an instant ping so the owner knows what's happening.

Reference

Full API reference

If you're a developer or integrating with something not listed above, here's everything the API exposes. Base URL: https://app.lowkly.com

  • GET /api/v1/me — confirm which company the token belongs to
  • GET /api/v1/clients?q=&limit= — list / search clients
  • POST /api/v1/clients — create a client
  • GET /api/v1/clients/:id · PATCH /api/v1/clients/:id
  • GET /api/v1/jobs?status=&limit= — list jobs
  • POST /api/v1/jobs — create a job
  • GET /api/v1/jobs/:id · PATCH /api/v1/jobs/:id
  • GET /api/v1/leads?status=&limit= — list leads
  • POST /api/v1/leads — create a lead
  • GET /api/v1/leads/:id · PATCH /api/v1/leads/:id

List clients

curl https://app.lowkly.com/api/v1/clients \
  -H "Authorization: Bearer lwk_live_xxxxxxxxxxxxxxxxxxxxxxxx"

Create a client

curl https://app.lowkly.com/api/v1/clients \
  -H "Authorization: Bearer lwk_live_xxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Jane Smith",
    "phone": "555-123-4567",
    "email": "jane@example.com",
    "address": "123 Main St",
    "city": "Charlotte",
    "state": "NC",
    "zip": "28202"
  }'

Create a job

locationId and salesRepId must already exist. Get them from your dashboard URLs or call /api/v1/me first.

curl https://app.lowkly.com/api/v1/jobs \
  -H "Authorization: Bearer lwk_live_xxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "customerName": "Jane Smith",
    "customerPhone": "555-123-4567",
    "customerEmail": "jane@example.com",
    "address": "123 Main St",
    "city": "Charlotte",
    "state": "NC",
    "zip": "28202",
    "serviceType": "Driveway",
    "scopeNotes": "20x40 driveway pour",
    "price": 8500,
    "locationId": "<from your dashboard>",
    "salesRepId": "<from your dashboard>"
  }'
Security

Token security & scopes

Tokens are scoped to one company. There is no way for one company's token to read or write another company's data — every query is filtered by the token's companyId at the middleware level.

  • Tokens are stored as SHA-256 hashes — even Lowkly admins can't see the raw token after creation.
  • The raw token is shown once, on the screen where you generate it. Lost it? Generate a new one and revoke the old.
  • Scopes: full = read + write; read = GET only (POST/PATCH return 403).
  • Expiry: 7 days, 14 days, 1 month, 6 months, or never. Pick shorter for shared tokens.
  • Revoke instantly from Settings → API Tokens — anything using a revoked token gets 401 immediately.
  • Last-used timestamp is tracked per token so you can spot dormant or compromised ones.

Ready to stop clicking?

Generate a token. Paste it into Claude. Ask Claude to find every customer who hasn't paid. That's it. You just gave yourself an admin who never sleeps.