Skip to content
Flywheel
Speed to lead, by text

Answer every lead in under 60 seconds.

The business that replies first usually gets the job. Flywheel texts your new leads back in under a minute, in your voice, and keeps asking the questions you would have asked — so what reaches you is a qualified conversation, not a voicemail you'll return tomorrow.

No demo gate, no sales call. Account creation is a public, unauthenticated endpoint — the same one we use ourselves.

Northside Plumbing · (773) 555-9000 Live
  1. hi, water is coming out from under the water heater
    Inbound · 2:14:06 PM
  2. What's going on — leak, clog, or install?
    Sent · 2:14:20 PM · 14s
  3. there's water everywhere
    Classified as leak
  4. Is water actively running right now?
    Branched on the answer, not the keyword

"There's water everywhere" is not the word leak. It matched because the business listed it as a synonym — Flywheel itself knows nothing about plumbing.

No customer logos yet — Flywheel is new

So here is the honest substitute: four claims on this page that you can check yourself before you trust any of the others.

The first reply can't be queued behind bulk work
New-lead replies run on a dedicated high-priority job lane. Follow-up blasts run on the default one. That's a structural guarantee, not a promise about load.
One engine, two unrelated businesses
A music studio and an emergency plumber run through the identical code path in our test suite, with no vertical branch anywhere.
There is no private back door
Every capability is a public REST endpoint. Signup is unauthenticated. The company that built this uses the same API a stranger does.
Compliance is one choke point, not a checklist
Every automated message leaves through a single class that enforces quiet hours, opt-outs, consent and idempotency in a fixed order. A second send path would be a bug.

You are not losing leads. You are losing the race to answer them.

Somebody fills in your form at 2:14 on a Tuesday. You're under a sink, in a lesson, with a client, on a ladder. You call back at six. By then they've texted three other businesses and booked whoever answered.

Nothing about that is a marketing problem. You already generated the lead — you paid for it. The gap is the ninety minutes between their message and your reply, and it is the only part of this you can close with software.

Flywheel closes it, then keeps going: it asks your questions, holds the thread, and steps aside the moment you pick it up.

The flywheel

Seven steps, and the seventh feeds the first.

Each turn costs you less than the last, because the customers you served are what brings the next ones in. All seven stages are live today, and every one of them is an endpoint you can call yourself.

  1. 1

    A lead arrives

    A form, a text, a missed call. However it comes in, it lands as a contact.

  2. 2

    You reply in <60s

    An SMS back in under a minute, in your voice, on a queue lane bulk work can't block.

  3. 3

    They get qualified

    Through the questions you wrote, branching on what they answer.

  4. 4

    They book

    A real slot on your calendar, computed when we offer it rather than when we queued the message.

  5. 5

    They're reminded

    At 24 hours and 2 hours, because the no-show is where the money quietly leaks out.

  6. 6

    They're asked

    One uniform review ask after they show up. Never gated, never incentivised.

  7. 7

    Reviews bring leads

    Which is where step one comes from next month. That's the wheel.

Every stage above is a documented endpoint — availability, slots, booking, attendance and review requests included. If it isn't in our OpenAPI spec, we haven't built it, and we'd rather you found that out here.

Configurable conversations

The questions are yours. There is no "plumbing mode".

Most lead bots hardcode one industry's script and sell you a dropdown. Flywheel's qualification ladder is data: a list of steps, each with a question, an expected answer shape, the field to write the answer to, and where to go next. You write it through the API, and it takes effect on the next message. No deploy, no code, no support ticket.

A music studio

vertical: music_lessons

The flow, as data

position: 1  expects: choice
  "Are lessons for you or your child?"
  choices: child ("son", "daughter", "my kid")
           adult ("me", "myself", "for me")
  branch:  child → 2   adult → 3

position: 2  expects: number   writes_to: age
  "Wonderful — how old are they?"
  default_next: 4

What the lead types

  • “for my daughter” learner: child
  • “she's seven” age: 7, bucket under_13

An emergency plumber

vertical: plumbing

The flow, as data

position: 1  expects: choice
  "What's going on — leak, clog, or install?"
  choices: leak    ("slab leak", "burst", "water everywhere")
           clog    ("backed up", "won't drain")
           install ("new water heater", "replace")
  branch:  leak → 2   clog → 3   install → 3

position: 2  expects: boolean  writes_to: active_flow
  "Is water actively running right now?"

What the lead types

  • “there's water everywhere” issue: leak
  • “2” issue: clog — because people answer lists with numbers

Same engine. Same code path. No branch anywhere that knows what a water heater is.

Both of those run end to end against the identical FlowRunner in our test suite, and the suite exists specifically to break the day Flywheel starts needing to know what it is selling. Domain knowledge lives in the synonyms you supply — which is why "slab leak" resolves to an emergency without the word plumbing appearing anywhere in the product.

The four things everyone asks.

Answered with what the software actually does, not with what would sound best.

Is my customer going to know it's a robot?

They're going to know they got a fast, relevant text. The words are yours — every message comes from a template you own and can edit, and there is no generative model improvising in the thread. The classifier's only job is recognising the shape of a reply: yes, no, a number, one of the options you listed.

When it can't tell, it doesn't guess and it doesn't loop. It re-asks once, and then it flags the thread for a human and goes quiet.

Will it text people at midnight?

No, and specifically: quiet hours are evaluated in the recipient's timezone, not yours. A business in Denver texting someone in Boston at 8pm local would be a 10pm message on the other end, and that's the mistake this is built to not make.

A message caught by quiet hours is requeued to the next open window, never dropped — something worth sending at 9pm is still worth sending at 8:30 the next morning, and silently binning it loses the lead.

What happens when somebody replies STOP?

It's honoured immediately, mid-conversation, wherever in the flow they are — and the suppression is recorded against that address for your account, so nothing else in the system can reach them either.

Consent records are append-only: they cannot be edited or deleted, by us or by you. If you ever have to prove someone opted in and when, the trail is the kind that holds up precisely because nobody can tidy it.

There's a structural rule underneath all of it: a minor is never the message recipient. When a contact has a guardian, the guardian receives the message and the guardian's consent is what gets checked. That isn't a setting you can misconfigure.

Do I lose control of my own customers?

The instant you type into a thread yourself, that thread's automation stops for 24 hours. You don't have to remember to switch anything off — a bot that talks over you in front of a customer is the worst thing this product could do, so silencing it is automatic rather than a button.

You can hand it back early with one call when you're done. And your own messages skip templates and quiet hours, because you deciding to answer your customer at 9pm is a judgement the software has no business overriding. They still don't skip opt-outs: "a person typed it" is not a defence against texting someone who replied STOP.

Everything else is yours too — your contacts, your conversations, your message history, all readable through the API at any time, in full.

API-first, and honestly so

Every single thing this product does is a public endpoint.

Lots of software has an API. This one is the API: there is no privileged internal path, no admin-only capability, and no partner tier that unlocks something you can't get. We know because our own first customer is built on it and would break immediately if we cheated.

Which means signup is an endpoint too. No "book a demo", no waiting for someone to enable your account. Paste this into a terminal and you have a working account and an API key.

There is a form as well, and it posts to that same endpoint with no credentials — the dashboard you land in is built on nothing but these calls, which is how we know they are enough to run a business on.

  • Stable error codes on every failure, so an agent never has to parse prose.
  • Records addressed by opaque slug, never a numeric id that leaks how many customers we have.
  • An OpenAPI 3.1 document and an llms.txt that describe what is deployed — including a section on what isn't built yet.
1. Create an account — no credentials required
curl -sX POST https://use-flywheel.com/api/v1/accounts \
  -H 'Content-Type: application/json' \
  -d '{
    "account": {
      "name": "Northside Plumbing",
      "time_zone": "America/Chicago",
      "vertical": "plumbing",
      "serves_minors": false
    }
  }'
201 Created — the token is shown exactly once
{
  "account": {
    "id": "k3Qk1u8mVzR2Xp0d",
    "name": "Northside Plumbing",
    "time_zone": "America/Chicago",
    "status": "active",
    "quiet_hours": { "start_minute": 1230, "end_minute": 510 }
  },
  "api_key": { "kind": "account", "token": "fw_live_..." }
}
2. Hand it a lead — this is the sub-60-second path
curl -sX POST https://use-flywheel.com/api/v1/accounts/$ID/contacts \
  -H "Authorization: Bearer $TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "contact": { "first_name": "Alex", "phone": "+13125550142" },
    "sms_consented": true,
    "start_conversation": true
  }'

That's the whole onboarding. One more call — POST /accounts/{id}/phone-number — buys the account a sending number in the area code you ask for, and it's yours to take with you. Full documentation covers templates, flows, takeover and webhooks.

Agencies and operators

Run one account, or run four hundred.

One account can operate many others. A partner key acts on the accounts it provisioned, and provisioning uses the same public signup endpoint everyone else uses — you get no special path, which is exactly why you can rely on it not disappearing.

The operator is never the voice. Messages sent in a client's account sound like that client, whoever is at the keyboard.

The next lead is going to text somebody back within a minute.

It may as well be you.

Pricing is not published yet — see the pricing page for exactly where that stands.