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.
Following up on quotes
AI texts every customer who got a quote 3+ days ago
Collecting unpaid invoices
AI texts everyone with an unpaid invoice and a payment link
Re-engaging past customers
AI sends a check-in to everyone you've worked with in the last 12 months
Filling next week's calendar
AI lists every booked job, every gap, every lead waiting for a quote
Quoting from a phone call
AI creates the lead, schedules a callback, drafts the quote — while you're still on the phone
Knowing who owes you what
AI gives you total outstanding, oldest invoice, and worst payer in 5 seconds
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
"Who owes me money right now? Total it."
Lists every unpaid invoice with customer name, amount, days overdue, and total balance owed.
"Text every customer with an invoice older than 14 days. Polite but firm."
Pulls all past-due invoices, drafts a personalized SMS per customer with their amount and a Stripe link, sends via Twilio.
"What did I make last month? Break it down by service type."
Sums all completed jobs in the last 30 days grouped by serviceType (Driveway, Patio, Sidewalk, etc.) with totals and counts.
"Who's my best-paying customer this year?"
Aggregates all paid jobs by client, sorted by total revenue. Shows top 10 with contact info.
Sales & follow-up
"Find every quote that's been sitting for more than 3 days with no answer. Text them a friendly nudge."
Pulls all SENT quotes 3+ days old without acceptance, drafts a personalized nudge per customer, sends via your iPhone.
"Show me every lead from the last 7 days that I haven't called yet."
Filters leads where status=NEW, sorted oldest first, with phone numbers ready to tap.
"Reach out to every past customer from 2025. Tell them I'm offering 10% off driveway sealing this month."
Pulls every client with a completed job in 2025, drafts a personalized offer text per customer, queues them up for review before sending.
"What did Mrs. Henderson pay for last time?"
Looks up Henderson, returns past job(s), service type, price, completion date, and any notes.
"Create a quote for a 20x40 stamped driveway in Cornelius for $9,500. Send it to John Davis at 704-555-0142."
Creates the client (or matches existing), creates a job draft, generates a quote, and texts the customer the link.
Schedule & ops
"What's on my calendar next week?"
Lists every scheduled job for the next 7 days with customer, address, service, and price.
"Schedule the McKenzie pour for Thursday at 8am."
Looks up McKenzie's job, sets scheduledDate to Thursday 8am, optionally texts customer with confirmation.
"Find every job in Concord that I haven't completed yet."
Filters jobs by city=Concord and status != COMPLETED, returns full list with addresses and prices.
"Move every Friday job to next Tuesday — rain in the forecast."
Lists Friday's scheduled jobs, asks for confirmation, then bulk-reschedules + texts each customer the new date.
Knowing your business
"How many leads did I get this month vs last month?"
Counts new leads created in current and previous month, returns both numbers and the % change.
"Which city brings me the most jobs?"
Groups completed jobs by city, returns top 5 with counts and revenue.
"Which sales rep is closing the most this month?"
Aggregates jobs per salesRepId for current month, ranks by close rate and revenue.
"What's my average ticket size for driveways?"
Filters jobs by serviceType=Driveway, returns mean, median, and range.
"How long does it take me on average to go from lead to paid job?"
Calculates median days between lead createdAt → job completedAt → invoice paidAt.
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.
Open Settings → API Tokens
Log into app.lowkly.com. In the sidebar, click Settings, then click the API Tokens tile.
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).
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_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXPaste it into your AI
Jump to whichever AI you want to 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.
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.
Open the MCP config file
On Mac: in Finder, hit Cmd + Shift + G and paste:
~/Library/Application Support/Claude/claude_desktop_config.jsonOn Windows: open the Run dialog (Win + R) and paste:
%APPDATA%\Claude\claude_desktop_config.jsonIf the file doesn't exist, create it. Open it in any text editor (TextEdit, VS Code, Notepad).
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.
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.
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.
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.
Open the GPT builder
In ChatGPT, click your name (bottom-left) → My GPTs → Create a GPT. (Or go straight to chatgpt.com/gpts/editor.)
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.Add the Action
Scroll down to Actions → Create new action. In the Authentication popup, pick API key → Auth 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": [] }]
}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 Save → Only me (or Anyone with a link if you want to share).
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.
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/jsonRecipes
New row in Google Sheets (lead form export)
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.
Every weekday at 8 AM
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.
New invoice marked PAID (Stripe webhook)
PATCH /api/v1/jobs/:id with status=COMPLETED
Auto-close jobs the moment payment hits. No more 'did they pay yet' questions.
Lead older than 24 hours with status=NEW
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.
New job created with price > $10,000
Slack DM the owner
Big jobs get an instant ping so the owner knows what's happening.
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 toGET /api/v1/clients?q=&limit=— list / search clientsPOST /api/v1/clients— create a clientGET /api/v1/clients/:id·PATCH /api/v1/clients/:idGET /api/v1/jobs?status=&limit=— list jobsPOST /api/v1/jobs— create a jobGET /api/v1/jobs/:id·PATCH /api/v1/jobs/:idGET /api/v1/leads?status=&limit=— list leadsPOST /api/v1/leads— create a leadGET /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>"
}'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.