The DatoCMS Blog

A look back at 2025

Posted on December 22nd, 2025 by Stefano Verna

As 2025 comes to a close, it's once again time to reflect. It’s been another packed twelve months, and it’s great to look back at everything we achieved, day by day. (Yes, we're patting ourselves on the back. It's our blog, we're allowed to.)

Want to take a walk down memory lane? Here are previous editions: 2024, 2023, 2022, 2021, 2020.


Financials: Strong growth, with best-in-class margins

This year, we reached €6.5 million in revenue, a solid 10% year-over-year growth. Not that many companies still have double-digit growth after ten years! Most are either dead, laying off half their teams, acqui-hired, or pivoting to AI-something.

With our continued focus on sustainable operations and disciplined execution, we achieved an EBIT margin of 65%. To put this in perspective: while most SaaS companies celebrate 20-30% margins, and industry leaders hover around 40%, DatoCMS has reached a level of profitability that places us in the top 5% of SaaS companies globally.

For those familiar with SaaS metrics, the "Rule of 40" states that growth rate plus profit margin should exceed 40%. Ours is 75%. We're not bragging (okay, we're bragging a little) but it turns out that not burning through VC cash on ping-pong tables and "growth at all costs" actually works.

Annual Recurring Revenue

Partners: More and more of you are joining us

With 185 agency partners now fully enrolled in our partner network (!!!), we're genuinely blown away. These are people who build websites for a living, with real deadlines and real clients breathing down their necks. They don't have time for tools that get in the way — and they chose us. We don't take that for granted.

This year, we doubled down on making your work more visible. All that real work for real clients? It adds up — we now have 340 projects in the showcase (63 added this year alone!), enough that we had to revamp the page with proper filters so people can actually find things.

And what projects they are. You’ve used DatoCMS to power offline wayfinding. You’ve helped shape the early days of the entire GraphQL community. Heck, one of you even took a day to graffiti the streets of Switzerland about us — which is either peak brand loyalty or a cry for help, we're not sure. Either way, never felt so loved.

If you're an agency and you're not in the partner program yet — come on. We're not collecting logos here. We want to build a real relationship, learn what's slowing you down, and give you the perfect tool to ship quality work fast and painlessly. Half the features we shipped this year came from partner feedback. You're literally shaping the product. That's the whole point. No awkward sales calls, promise, we hate those too.

Product: Another incredible round of improvements

2025 has been another year of relentless shipping. We didn't just focus on one area — we improved the entire stack, from the way developers write code to how editors manage content, all while hardening security and preparing for the AI era (gosh, we said it, now we need to wash our mouths).

Here is an exhaustive look at everything we shipped this year, grouped by how they help you:

Type Safety & Developer Confidence
  • Records, finally typed — The biggest DX win of the year. The JavaScript client now supports full end-to-end type safety, generating types directly from your schema for real autocomplete and compile-time safety. No more any types haunting your dreams.

  • Reactive Plugins — Plugin settings are now synced in real-time across users, preventing configuration conflicts when multiple people are working on complex setups simultaneously.

AI & LLM Readiness
  • LLM-Ready Documentation — We made our docs AI-friendly with llms-full.txt and a "Copy as Markdown" feature on every page, so you can easily feed context to ChatGPT or Claude. Because let's be honest, that's how half of you read documentation now anyway.

  • MCP Server — We released a Model Context Protocol (MCP) server that enables AI assistants to interact directly with your DatoCMS projects. It works. Sometimes. We wrote a whole blog post about the "sometimes" part.

  • AI Translations — Bulk-translate entire records with OpenAI, Claude, Gemini, or DeepL. Finally, a reason to stop copy-pasting into Google Translate.

  • Structured Text to Markdown — A new package that turns Structured Text fields back into clean, CommonMark-compatible Markdown: perfect for LLM pipelines or migration scripts.

Content Editing Experience
  • Inline Blocks in Structured Text — One of our most requested features! You can now insert blocks directly inside Structured Text fields — perfect for inline links, mentions, or notes — unlocking infinite nesting possibilities.

  • Tabular View for Trees — Hierarchical models got a massive upgrade with a new Tabular View, bringing custom columns, pagination, and sorting to tree structures.

  • Favorite Locales — Editors can now pin their most-used languages to the top of the UI, hiding the noise of unused locales in massive multi-language projects. Finally, some peace for the people managing 40+ locales.

  • Enhanced Previews — We introduced inline previews for blocks and link fields, letting you see colors, dates, and images directly in the list view without clicking through.

  • Single Block Presentation — You can now use a Single Block field as a model's presentation title or image, perfect for models where the main info is nested inside a block.

  • Improved Link Field Filtering — Link fields now correctly filter records by the current locale, eliminating confusion when referencing localized content.

  • Fixed Headers — We unified the UI with fixed headers across all sections, ensuring that save and publish buttons are always within reach. A small change that sounds boring until you realize how much scrolling it saves.

API & Tooling Power
  • New CLI cma:call command — You can now call any API method directly from the terminal without writing custom scripts, thanks to dynamic discovery of API resources.

  • Filter uploads by path — We added a new path filter to the GraphQL API, allowing you to query assets based on their storage path with inclusion, exclusion, and exact matching.

  • Increased GraphQL Pagination — We bumped the maximum number of items you can fetch in a single GraphQL query from 100 to 500, reducing the number of requests needed for large datasets. Five times more stuff in one go — you're welcome.

  • Site Search Decoupled — Site Search is now an independent entity, separate from Build Triggers. You can control indexing explicitly and access detailed crawler logs to debug robots.txt and sitemap issues.

  • Enhanced Build Triggers Activity — We enhanced the Activity view to show events beyond the 30-item limit, with better filtering and detailed logs for every operation.

Security & Governance
  • Access to CDA Playground with Limited Permissions — Developers can now use the GraphQL Playground without needing full API token management permissions, safer for contractors and temporary access.

  • All API Tokens are Deletable — For better security hygiene, you can now delete any API token, including the default read-only ones generated by the system.

  • API Token Last Used Time — You can now see when each API token was last used directly in Project Settings, making it easy to identify stale tokens and clean up ones that haven't been active in months. Or years. We don't judge.

  • No Default Full-Access Token — New projects no longer come with a full-access API token by default, encouraging the principle of least privilege from day one.

  • Improved Roles & Permissions — We revamped the roles interface to clearly show inherited permissions and human-readable summaries of what a user can actually do.

Workflow & Quality Control
  • DatoCMS Recipes & Import/Export — We launched a marketplace of reusable project "recipes" — pre-built models and blocks you can install into any project to save setup time, powered by the new Schema Import/Export plugin.

  • Dedicated SEO Fallback Options — We decoupled SEO metadata from internal preview fields, allowing you to set specific fallbacks for SEO titles and images without affecting the CMS UI.

  • Force Validations on Publishing — You can now prevent the publishing of records that don't meet current validation rules — crucial when you've tightened schema requirements on existing content.

  • Save Invalid Drafts — Conversely, you can now save drafts even if they are invalid, allowing editors to save their work-in-progress without being blocked by strict validation rules until they are ready to publish. Because sometimes "half-done" is better than "lost."

  • Draft Mode by Default — To encourage better editorial workflows, "Draft/Published" mode is now the default setting for all new models.

  • Smart Confirmation Guardrails — Destructive actions now calculate their impact before execution. If you're about to delete something used in 10+ records, we force a typed confirmation to prevent accidents. We've all been there. This is us protecting you from yourself.

...and we also cleaned up some tech debt by sunsetting legacy batch endpoints and removing unused CI triggers, keeping the platform lean and fast.

Plugins: The ecosystem keeps growing

30 new public plugins landed in the marketplace this year — plus countless private ones we'll never see. The community (and our support team!) keeps surprising us with stuff we didn't even know we needed.

Infrastructure: The journey to independence

This year, DatoCMS handled an average of 3.5B API calls/month (+80%), while serving 500TB of traffic/month and 4.5M optimized video views/month. At the same time, we executed the most ambitious engineering project in our history: a complete migration from Heroku to a custom Kubernetes cluster on AWS.

For almost ten years, managed hosting served us well — but by mid-2024, we had hit a ceiling. Costs were rising while our need for granular control grew. We realized we were paying a premium for convenience we no longer needed. It was time to build our own home.

The journey began back in October 2024, kicking off a nine-month marathon. We spent the winter prototyping (experimenting with everything from bare metal to alternative PaaS providers — some of which shall remain unnamed to protect the guilty), the spring architecting, and the early summer stress-testing.

After months of planning, we flipped the switch on Saturday, June 7th. We prepared for a battle, but we mostly ended up watching dashboards. Aside from a tiny detail that cost us exactly 1 minute of downtime, the transition was flawless. By the time we turned the writes back on, every byte of data had been successfully secured in AWS.

The results were immediate and startling:

  • Speed: Response times for the Content Delivery API (CDA) were halved instantly.

  • Efficiency: We are now running on 64GB RAM database instances on AWS that handle traffic better than the 256GB instances we used on Heroku. Yes, you read that right. Four times less RAM, better performance.

It was a massive bet, but looking at the metrics today, it is undeniably one of the best wins of our year.

Response time, before and after the switch

We didn't just move servers and DBs; while moving our core applications to AWS EKS was the main event, we executed a total overhaul of the ecosystem surrounding it:

  • Infrastructure as Code: We codified our entire environment using Terraform, giving us a reproducible, version-controlled blueprint of our infrastructure that eliminates manual configuration drift.

  • CDN Caching: We switched from Fastly to Cloudflare for our CDN cache, implementing smarter caching rules that improved our hit ratio from 85% to 97%.

  • Storage: We migrated from AWS S3 to Cloudflare R2, eliminating massive egress fees and optimizing asset delivery. Goodbye, AWS data transfer bills. We won't miss you.

  • Observability: We ditched expensive CloudWatch logs for a custom Prometheus & Loki stack, slashing our monitoring bills to near zero while improving data quality.

  • Developer Experience: To tame Kubernetes complexity, we built cubo, a custom kubectl wrapper tailored around our needs that handles everything from generating K8S manifests and orchestrating rollouts to managing cronjobs, real-time logs, and one-off commands, preserving the "git push" and CLI simplicity we loved on Heroku.

If you want to know more about cubo, just ask! :)

The Bottom Line: We lowered overall infrastructure costs by over 25%, reduced Content Delivery API latency by 50%, expanded Realtime API capacity by 10×, and gained full control across every infrastructure layer. And we kept our sanity. Mostly.

Beyond code: Taking control of the books

While liberating ourselves from managed hosting, we made another quiet move: we fully internalized our accounting. For years, we outsourced this to external firms — the typical setup where you hand over receipts and hope for the best. But as we grew, flying blind between quarterly reports became untenable.

Now we run everything in-house with full visibility into our finances at any moment. No more waiting for external accountants to reconcile things. Same philosophy as the infrastructure migration: control beats convenience when you're building for the long term.

Team: Still small by design

This year marked our 10th anniversary — a decade of surviving frontend trends, CMS wars, and the occasional existential crisis about whether "headless" is still a cool term. To celebrate, we flew our entire team to the Tuscan countryside to eat, drink, and ride quad bikes. You can read the full story of our trip (and our "25% Matteo concentration rate") here: Dato Turns 10.

Despite our growth in revenue and traffic, we remain a team of just 13 people. This isn't an accident — it's a deliberate choice.

As we wrote in "How can you be eight people?" (well, now thirteen), building a massive organization is optional. We choose to ignore the pressure to maximize headcount or chase VC funding. Instead, we focus on what actually matters: a solid product, a healthy work-life balance, and staying profitable on our own terms. We don't mind "leaving a little water in the cloth" if it means we get to keep building the software we love, the way we want to build it.

What's next?

No idea. And honestly, we like it that way.

We're not going to pretend we have a five-year vision carved in stone or a slide deck about "the future of content." We'll keep shipping what matters, keep ignoring the hype cycles, and keep cashing checks instead of burning through runway.

That said... we may have a few things cooking that we're genuinely excited about. But we're not going to jinx it by overpromising — you'll see them when they ship.

Well, see you in 2026. We'll still be here. Probably still 13 people. Definitely still not taking ourselves too seriously. 🧡

Start using DatoCMS today
According to Gartner 89% of companies plan to compete primarily on the basis of customer experience this year. Don't get caught unprepared.
  • No credit card
  • Easy setup
Subscribe to our newsletter! 📥
One update per month. All the latest news and sneak peeks directly in your inbox.
support@datocms.com ©2025 Dato srl, all rights reserved P.IVA 06969620480