You have built your own CRM, or you are part way through building one, and you want Booked Solid to use it. The question usually arrives close to this: How can I use my own CRM or connect... I have one I've been working in developing and eventually I will offer it to the community here, but in the meantime I want to use it the booked solid app. Or in its shorter form: I would like to have my crm integrated into Booked Solid. It's been created using Claude. This article gives you the whole answer, including the parts that are a plain no. Everything below applies just as well to any custom tool of your own, not only to a CRM.
The straight answer, in two halves
There is no button anywhere in the app that says connect my own CRM, and nothing that will import my CRM in one action. What exists is two separate one-way rails, and they are worth keeping straight in your head because they are set up in completely different places:
- Data coming in (Otto reads your CRM): only through an MCP server. A plain REST API on its own will not connect. Whatever you bring in this way stays read-only permanently.
- Leads going out (Otto hands a new lead to your CRM): only through the Lead Outbox, a first-party webhook connection that creates one new lead and nothing else.
Adopting your CRM as a tool does not give you the outbound half, and setting up the Lead Outbox does not give you the inbound half. If you want both, you set up both.
Bringing your CRM data in: Otto talks to outside tools through MCP only
The precise version of this question, from a performer who was about to start writing code: Does Otto require a proper MCP server to talk to an outside tool, or can it work with a plain authenticated API (a few endpoints behind an API key)?
Otto talks to outside tools through MCP, not a raw REST API. There is no paste your base URL and API key and Otto will call your endpoints mode. A plain authenticated API will not connect on its own, no matter how well documented it is or how properly it is secured. Your CRM has to speak MCP.
The good news is that this is a smaller job than it sounds, and you throw nothing away. Keep your authenticated endpoints exactly as you planned them, then put a thin MCP server in front of them. A handful of tools, for example list_leads, get_lead and list_gigs, where each tool does nothing but call one of your existing endpoints with your API key. That wrapper is usually a few dozen lines. Your API key lives inside your MCP server and never enters Booked Solid or Otto.
Two run modes both work:
- Local: a small stdio command that runs on the same computer as Booked Solid. In a config file this is a
commandentry. - Remote: an HTTP endpoint, with your key in its headers. In a config file this is a
urlentry.
If you want a template for the shape you are about to build, two real CRMs already ride this exact rail as built-in connectors: GoHighLevel and Mago CRM. Both are a REST API behind a key, wrapped so that Otto sees clean tools. From the performer's side those two are finished work, so all you do is paste a key on the Connections screen, but underneath they are the same pattern as your wrapper.
The wiring catch: there is no add a server by URL box
Almost everyone hunts through the app for a place to paste their server address, or for a way to add my own integration by hand. That box does not exist. Skip looking for it. It is a real gap, it is known, and pretending otherwise would only cost you an evening.
The only way Booked Solid picks up an outside tool is by scanning the MCP setups already present on that computer - the configs belonging to Claude Code, Claude Desktop, and Cursor. So the order below is load-bearing. Do step 1 first or the scan in step 2 finds nothing and there is no other door.
- Outside Booked Solid, add your MCP server to one of these config files, on the same computer you run Booked Solid on: Claude Code's
~/.claude.json, Cursor's~/.cursor/mcp.json, or Claude Desktop'sclaude_desktop_config.json. Use acommandentry for a local stdio server, or aurlentry for a remote HTTP one. - In Booked Solid, run the scan. There are two entry points and they do the same thing: open Settings > Permissions, scroll to Discover installed tools and click Scan this computer; or open the Connections screen, scroll to Tool access (optional) and click Discover integrations.
- Your server appears in the results by whatever name you gave it in the config. Click Add next to it.
- Check that it is now listed under Settings > Permissions with its switch on. Seeing your server in the discovery list does not mean Otto has it. Discovery is not adoption.
Four things that waste time if you get them wrong:
- The config has to be on the machine running Booked Solid. The scan only reads local files, so a server configured on your laptop is invisible to the app on your desktop.
- The app launches your adopted server exactly as your config says. If your entry runs through
npxornode, that computer needs the free Node.js tool from nodejs.org, or the server will not start. Installing it takes a couple of minutes: the steps are in An add-on refuses to turn on: the three blockers. - Do not put your API key into Booked Solid. It belongs inside your MCP server.
- If the scan finds nothing at all, no other app on that computer has an MCP tool set up that can be reused. The fix is step 1, not another scan.
An adopted tool stays read-only, and the dropdown really will not open
This is the next ticket every time: It allows me to toggle the on and off switch, but the read-only dropdown won't open to let me pick Read & write - is this expected for a freshly integrated tool or a bug?
Expected, and not a bug. Any tool you bring in yourself through Discover is held at read-only on purpose, which is why its on/off switch works while its access dropdown stays greyed. The app says as much on the row itself: a tool found on your computer was not built by Booked Solid, so it stays on the shortest leash. There is no in-app way to widen it, and none is coming through that dropdown.
The reason is worth knowing, because it explains why the answer is not simply loosened for you. Turning write on for an adopted tool would trust that tool's entire write side, since there is no way today to allow one write verb and block the rest. So a create-a-lead permission and a delete-everything permission would arrive in the same click. The app will not do that.
The general read and write article, Settings > Permissions: how far each connected tool can reach, describes widening a discovered integration from read-only. That applies to the built-in connections in that list. It does not apply to a server you adopted yourself through Discover, which is pinned to read-only regardless of what its saved setting says.
Sending new leads out: the Lead Outbox webhook
Here is the thing most people actually want, described by the performer who asked for it: when Otto sources a lead worth pursuing, hand that lead directly into my CRM's pipeline - name, contact info, event type/date if known, and a note on where it came from. And scoped tightly: a single, narrow action - create one new lead. Nothing about editing existing bookings, changing quote statuses, or touching anything financial.
That is exactly what the Lead Outbox does, and it shipped in version 1.9.0. It is a first-party, create-only bridge that hands a new lead to your CRM through a webhook you control. The payload is a fixed shape: name (required), email or phone (at least one required), event type, event date, location, a note on where the lead came from, and a short source label. Unknown fields are rejected. It never edits an existing record, never changes a status, and never touches money.
Setup takes about two minutes, in this order:
- Update the app first. The Lead Outbox shipped in 1.9.0, but in installed builds before 1.11.5 its tool program was left out of the installer's unpack list, so everything looked green while Otto started without the tool. If you set this up once and it never worked, that was probably why. Update to the newest build and the problem is gone. If the built-in updater has not swapped it in, it usually needs a full quit and relaunch, or grab the installer directly from booked.kivimedia.co/download/mac or booked.kivimedia.co/download/win.
- Create an inbound catch webhook that accepts a JSON POST and creates one new lead from it. Zapier and Make work out of the box, and so does your CRM's own inbound URL.
- Open the Connections screen, find the Client book section and the card Lead Outbox (your CRM). Click Paste key and put your address in the Webhook URL field of the secure form. It is stored encrypted on your computer. The URL must use https, with one exception: a loopback address (
http://localhost:...orhttp://127.0.0.1:...) is accepted plain, so a CRM running on your own machine can receive leads without a certificate. - Open Settings > Permissions, find Lead Outbox (your CRM) and set its access to Read & write. This dropdown does open, because the Lead Outbox is a built-in connection rather than a tool you adopted. Until you do this, Otto has no create tool at all.
- Decide about Drafts need your OK. Left on, every lead Otto sources is staged rather than sent: it appears on the Lead Outbox panel on the Connections screen and posts only when you click Deliver. Switch it off later, once you trust the flow, and leads go straight through.
- Click Send a test lead on that panel and confirm it arrived at the other end. Do not skip this. A wrong webhook URL fails quietly at the far side, and you would rather find that out now than three real leads later. The button only appears once a webhook URL is saved.
- Tell Otto in plain words what you want: "When you source a lead worth pursuing, hand it to my CRM through the Lead Outbox."
What is not built, said plainly
A first-class, bespoke integration with one named third-party CRM is not on the near-term build list, and there is no date to give you. The near-term investment is Booked Solid's own pipeline. Two things would change that. First, if your CRM exposes a small API or an MCP tool, Otto can read it today with nothing bespoke, which is the realistic bridge. Second, once a CRM opens up beyond a single author and several performers want the same lead-to-pipeline hand-off, a real integration earns its keep. Requests like this are logged with the use case attached, so it is worth writing in rather than assuming it is heard.
If you wanted a pipeline more than a bridge
Some people arrive at this question because their leads are scattered, not because they are committed to running two systems. If that is you, the built-in pipeline is the Gig Desk tab: every gig is a card, the columns are your stages from lead through to confirmed, you drag cards between them, and you can rename the columns to match how you actually work. Each card also counts the booking milestones recorded against that gig - proposal sent, proposal viewed, accepted, signed, retainer paid, date reserved - so you can see at a glance which gigs are real and which are still hopeful. It will hold your pipeline perfectly well while you keep hardening your own CRM.
If it still does not work
- The scan finds nothing: your server is not in a Claude Code, Claude Desktop, or Cursor config on that computer yet, or the config is on a different machine.
- Your server was found but Otto never uses it: you saw it in the discovery list but never clicked Add, or it was added and later switched off under Settings > Permissions.
- It was added but nothing works: if it launches through
npxornode, install Node.js from nodejs.org and try again. - The test lead never lands: re-check the webhook URL character for character, confirm your catch hook accepts a JSON POST, and confirm the access on the Lead Outbox row is Read & write and not Read-only.
- Otto stages leads but they never leave: that is Drafts need your OK doing its job. They are waiting on the Lead Outbox panel for your Deliver click.
For the wider tour of the Discover flow and the other optional add-ons, see Optional add-ons: integrations, Microsoft 365 sign-in, and Discover and Connect your accounts.
Still stuck? Email bookedsolid@kivimedia.freshdesk.com or submit a ticket from this help center. Tell us how your CRM is built - a web app with an API, a local app, something else - and we will point you at the shortest path.
Was this article helpful?
That’s Great!
Thank you for your feedback
Sorry! We couldn't be helpful
Thank you for your feedback
Feedback sent
We appreciate your effort and will try to fix the article