Holded has an open, well-documented API, and that changes what you can do with it. Instead of admin copying by hand what sales has closed, what the website has received or what the team has worked on, the systems talk to each other. Here's what can be integrated and how we've set it up in our own agency, which is the best testing ground we have.
What the Holded API exposes
Practically everything you see in the interface: contacts, quotes, pro-forma invoices, invoices, payments, products and services, projects, tasks, time entries, employees, leads and events. With that, your website, your shop, your CRM or any custom tool can read from and write to Holded as if it were just another user, but without copying errors or delays.
Five integrations we see time and again
- Web form → contact and lead. Every enquiry from the website creates the contact in Holded and the lead in the sales funnel, with its source. Nobody forgets a lead in the inbox ever again.
- Quote builder → quote. If your website or your sales team configures offers (packages, options, quantities), the quote is born in Holded already numbered, with its lines and taxes, ready to send.
- Closed sale → project and tasks. When the client accepts, the project is created with its predefined tasks and its owner. Operations start without a handover meeting.
- Hours and deliverables → invoicing. Logged hours or completed milestones generate the recurring or per-project invoice, and the payment is reconciled with the bank.
- Status in Holded → client portal. The client sees their quotes, invoices and project status on your website, read in real time from Holded. Fewer "could you send me the invoice?" emails.
How we use it at staycreative
Our management dashboard, custom-built in Laravel, is connected to Holded in both directions. When a salesperson prepares a quote in the dashboard, it's created in Holded with its series number; when the client accepts, the sale opens the project in Holded with its preconfigured tasks according to the service (a monthly social media retainer doesn't have the same tasks as a website). Support tickets from our maintenance clients create a mirror task in the corresponding project, and recurring plans invoice themselves. Admin doesn't enter data; it reviews. And the accounts reach the accountant already balanced.
What to decide before writing code
- Who owns each piece of data. If a contact is edited on the website and in Holded at the same time, which one wins? Without a single source of truth per entity, the integration creates more chaos than it removes.
- Real time or synchronisation. Holded's webhooks notify changes instantly; for other things a sync every 15 minutes is enough. Choosing well avoids hammering the API unnecessarily.
- What happens when it fails. The API can be down or return an error. The integration has to retry, notify and never duplicate an invoice.
- Series, taxes and numbering. It looks like a detail and it's where things break: a quote created via API with the wrong series is a tax problem, not a technical one.
When it's worth it
When the volume turns manual copying into a job in itself (more than a few dozen documents a month), when copying errors cost you money or reputation, or when you want to give clients visibility without giving them access to your Holded. As an official Holded partner and custom developers, we do both halves of the work. If you have a process where someone "puts the data into Holded" every week, tell us about it: it can almost certainly be automated.