10年自筹资金:13人团队,营收650万欧元
10 years bootstrapped: €6.5M revenue with a team of 13

原始链接: https://www.datocms.com/blog/a-look-back-at-2025

## DatoCMS 年度回顾:2025 - 强劲增长与独立 DatoCMS 在 2025 年取得了令人印象深刻的成绩,实现 **650 万欧元的收入** – 较去年同比增长 **10%** – 并拥有高达 **65% 的息税前利润率**,使其在全球 SaaS 公司中名列前 5% ( “40 法则” 得分为 75!)。 这一成功归功于可持续运营和严格执行,避免了“不惜一切代价追求增长”的模式。 该平台将其 **代理合作伙伴网络扩展至 185 家**,展示了实际项目成功案例,目前已展示 **340 个项目**。 产品开发持续不断,关键改进包括 **JavaScript 的完全类型安全**、**响应式插件设置**以及 **AI 准备就绪**功能,例如适合 LLM 的文档和 AI 翻译。 一项重大成就是从 Heroku 完全迁移到 **AWS 上的自定义 Kubernetes 集群**,从而实现了 **响应时间提高 50%** 和 **基础设施成本降低 25%**。 公司还将其会计工作内部化,以获得更大的财务控制权。 DatoCMS 保持着 **13 人**的精简团队,优先考虑产品质量、工作生活平衡和盈利能力,而不是快速扩张,专注于提供价值并避免炒作。 他们计划在 2026 年继续这种方法,专注于发布有影响力的功能,而不过度承诺。

## Datocms 历经十年自筹资金,实现 650 万欧元营收 Datocms,一个内容管理系统,最近宣布在自筹资金十年后,营收达到 650 万欧元。该公司仅用 13 人的精简团队就取得了这一里程碑。 这一消息在 Hacker News 社区引发了赞扬,许多人将 Datocms 的成功视为对风险投资驱动的“不惜一切代价增长”模式的反面教材。评论员强调了盈利能力和建立*真正*业务的重要性,而不是依赖外部资金和丰厚的福利。 Datocms 的创始人承认对他们的成就感到自豪,并巧妙地倡导自筹资金作为一种可行且有效的成功途径。这篇帖子引起了其他自筹资金创业者的共鸣,并引发了关于替代创业策略的讨论。
相关文章

原文

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:

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

`;class o extends HTMLElement{loading;fullImage;overlay;loadingOverlay;img;constructor(){super(),this.loading=!1,this.attachShadow({mode:"open"})}connectedCallback(){this.shadowRoot?.appendChild(i.content.cloneNode(!0)),this.overlay=this.shadowRoot?.querySelector("#overlay"),this.loadingOverlay=this.shadowRoot?.querySelector("#loader"),this.tabIndex=0;const t=this.querySelector("a"),e=this.querySelector("img");t?(this.fullImage=t.getAttribute("href")||"",t.tabIndex=-1):e&&(this.fullImage=e.getAttribute("src")||""),this.fullImage&&this._addListeners()}_addListeners(){this.addEventListener("click",this.showLightbox.bind(this),!0),this.addEventListener("keydown",t=>{t.altKey||(t.key==="Enter"||t.key===" ")&&this.showLightbox(t)},!0)}showLightbox(t){t.preventDefault(),!this.loading&&this.fullImage&&(this.loading=!0,this._showOverlay(this.loadingOverlay),this.img?this.showImage():(this.img=document.createElement("img"),this.img.addEventListener("load",this.showImage.bind(this)),this.img.src=this.fullImage,this.img.tabIndex=1,["click","keydown"].forEach(e=>{this.overlay?.addEventListener(e,s=>this._hideOverlay(s.currentTarget))}),this.overlay?.appendChild(this.img)))}showImage(){this.img&&(this.img.style.transform="scale(0.1)",this._hideOverlay(this.loadingOverlay),this._showOverlay(this.overlay),this.overlay?.focus(),this.img.style.transform="scale(1)",this.loading=!1)}_showOverlay(t){t.style.display="flex"}_hideOverlay(t){t.style.display=""}static template}customElements.define("img-lightbox",o);
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. 🧡

联系我们 contact @ memedata.com