TL;DR: SaaS doesn’t remove implementation work, it relocates it: from servers and patches to configuration, declarative automation, and the complex weaving of platform features needed to deliver an enterprise capability over custom code written against vendor interfaces. Demos can be deceiving, though not always intentionally so. More often it’s the expectation that everything you need is available “out of the box” that makes SaaS look like a magic bullet instead of just another tool that takes skill and effort to build with.
When There Is No Box
SaaS can be the perfect architectural choice for an organization that wants to focus on business value instead of unique technology capability. You don’t buy SaaS, you rent it, and that distinction is the whole point: the vendor manages refresh cycles as part of the subscription through continuous updates instead of it landing on the organization as a project it has to fund and staff itself. Traditional software, whether licensed on-prem or custom built (even “cloud native”), doesn’t work that way. The organization owns maintaining the platform and the business functionality, which is what kills custom builds and heavily customized on-prem systems over time.
OpEx to fix something that already mostly works is chronically underfunded, while CapEx for something new gets approved, so the old system just accumulates risk until it becomes a crisis project instead of routine maintenance. And when that crisis project finally lands, it doesn’t just replace the platform, it resets the maintenance maturity the team spent years building. Admins who knew every quirk of the old system now spend the next year reskilling on the new one instead of shipping features on a platform they already understood. Commodity capability is almost always better rented than lovingly handcrafted by an internal team armed with a five-year roadmap and an (overly) optimistic estimate.
That doesn’t make the product finished on arrival. The gray area is what it takes to turn a collection of separate-but-related features into an enterprise capability: level of effort, support, and everything the demo skipped. That demo was built for the business buyer with a checkbook, not the developer with a deadline. A single capability, shown on its own, looks like a checkbox. Implementing it by wiring together ten other features, each documented as if the others didn’t exist is a different job entirely, and it’s the job nobody demos.
Which brings us to one of the more durable phrases in enterprise software: “out of the box.” SaaS has no box. It has a tenant, a contract, a configuration console, a few license tiers, an identity integration, and eventually a backlog. No box.
The assumption worth challenging is that SaaS is a pre-built application, so implementation is mostly a matter of switching it on. A more accurate model: enterprise SaaS is a product (and, with successful vendors, a collection of acquired, competing, products) sitting on a platform shared by thousands of other customers. The product supplies standard capabilities. The platform supplies the ways to configure, automate, extend, secure, integrate, monitor (sometimes) and govern them. Both are legitimate. They are not the same implementation problem.
While there’s no box, SaaS still delivers many of the same benefits standard software has always had over custom builds, and a small company running a fairly standardized process can get close to production-ready with limited setup. Those are the things business users are so used to that they forget to count them: security, role management, standard integrations, audit logging, backup and disaster recovery, single sign-on, and standard compliance (support) built in rather than bolted on. A department adds users, roles, approvals, reports, and a few local variations, and configuration becomes real work. An enterprise running the same product across business units, regulations, and integrations turns it into a configurable platform that needs architecture and governance, whether or not anyone wrote a line of code. “SaaS” describes all three. It is not remotely the same project in each case.
Cloud Has Changed the Meaning of OOTB
“Out of the box” used to mean a shrink-wrapped disk that installed a working application on a server you owned. Cloud didn’t kill the phrase, it’s just no more literal than dialing a phone or pasting text. The concepts are still the same, though sometimes mis-applied because the meaning has been lost in translation.
To a vendor, “out of the box” usually means the feature exists in the licensed edition, fits the product’s intended model, and can be enabled or demonstrated without a separate application. That’s an honest intent. It’s also incomplete. The platform including the building blocks is not the same as an organization putting the thing into production next week with its own data, users, policies, integrations, processes, and exceptions.
To a business stakeholder, “out of the box” often means something closer to done: complete, supported, included in the purchase, ready with minimal effort, sensible about exceptions to processes that “everyone” follows. That’s a fair expectation for a consumer app. It gets unreliable fast in enterprise SaaS, because “normal” is in the eye of the beholder (or buyer) and the vendor is thinking about a normal defined by the lowest common denominator across their entire customer base.
To an engineer or an experienced administrator, it means the capability exists, there’s probably a supported configuration path, and there may also be three licensing constraints, a technical prerequisite nobody mentioned, and a limitation that won’t surface until a user asks a perfectly reasonable question in production.
The reason those three points of view keep colliding is simple: a feature demo is a planned, orchestrated, and practiced event to showcase what a product does. An enterprise capability is the business secret sauce baked into solution that relies on twice as many features and sometimes held together by bubblegum and baling wire. One is maybe out of the box. The other never saw a box, and the instructions were in a different language for a different purpose and required a lot of creativity that often goes unrecognized.
Enterprise SaaS is less a finished solution than a pile of Legos with an incomplete picture and no instructions (but sometimes a blog post, which isn’t always going to mention the complexity required or the dozens of failed attempts that came before it). The pieces are good. Plenty fit together well. But the pieces being in the box, metaphorically, since SaaS still doesn’t have one, doesn’t tell you what to build, whether the model survives the next upgrade, or who fixes it when someone changes a foundational rule six months from now.
Take a routing requirement. In a demo: a new request comes in, gets assigned by region, triggers a notification. Simple. In production: region comes from more than one system, the request touches multiple accounts, the assigned team depends on product line and contract status, some records are role-restricted, the notification has to respect local hours, and the downstream system is occasionally down. The feature didn’t get worse. The business process just showed up. (And that is a simple scenario. Most real enterprise requirements are far more complex.)
“OOTB” is a capability statement. It is not an implementation estimate, an operational guarantee, or a substitute for architecture.
The Simpler the Configuration, the More Complex the Code It Hides
None of these categories are moral rankings. The right choice depends on fit, lifecycle, foundation stability, and whether the organization can actually own what it builds.
An out-of-the-box capability is a feature the platform supplies. It may work as-is for the standard case. It usually needs configuration, permissions, data setup, licensing, and training before it’s useful, and it may not match the current process exactly, which is often a reason to reconsider the process before reaching for a customization.
Configuration means shaping standard behavior through supported settings: roles, page layouts, field validation, reports, routing rules, approval structures, notifications, integration endpoints. Once it affects production behavior, it’s implementation work, full stop. It needs requirements, design review, test cases, deployment control, documentation, and an owner. Calling it “not development” is technically defensible in the narrowest sense. It’s also how a team ends up with 437 rules, three administrators who understand half of them, and no confident answer for what happens when a customer’s status changes. It’s the same failure mode behind a real migration where teams leaned on undocumented flexfields to hit a deadline, then paid for it months later reverse-engineering their own configuration before the migration could finish (see Agile is not Ready, Fire, Aim for more on this).
Declarative development is a platform-provided way to define logic without conventional code: workflow tools, rules engines, visual process designers, formula fields, event triggers. No-code and low-code are still code. Not usually code in the sense of someone typing a language into an editor, but they still define conditions, state changes, data dependencies, permissions, and error paths. The platform abstracts the code away from the person assembling it. It doesn’t abstract away the consequences.
That abstraction is genuinely useful, and worth being honest about both directions of the trade-off. A well-designed visual workflow lets an administrator build real automation without implementing a transaction engine or learning the vendor’s internal data-access framework. The platform absorbs a lot: runtime behavior, orchestration, retries, security enforcement, scale. That’s real value, not a small one.
The cost is that the simplified surface can hide complexity from the person changing it. A few boxes connected by arrows can represent a substantial amount of execution logic, error handling, and dependency chains. The canvas looks calm. Production tends to have other opinions, usually delivered at an inconvenient hour. This is the same pattern behind the observation that easier isn’t always faster: stacking enough simple, individually-reasonable configurations produces a system that’s simple nowhere and complex everywhere at once (Sound familiar? See 5 Considerations About Low-Code/No-Code).
That’s not a flaw to be engineered away. It’s the mechanism that makes SaaS scale in the first place. A platform flexible enough to fit a hospital system, a bank, and a mid-size distributor without three separate codebases has to carry that flexibility as complexity somewhere. The vendor pushes it down into configuration and declarative tooling instead of custom code, which is a genuine improvement. It doesn’t make the complexity optional. It just changes who has to manage it and what tools they get to do it with.
That’s the shift underneath all of this: implementation effort now defaults to weaving platform features together through configuration and declarative tooling, not to writing custom code against the vendor’s exposed interfaces. Custom development still has its place. It’s just further down the list, not the default.
Custom development covers code within supported extension mechanisms, custom applications on the platform, middleware, integration services, and specialized interfaces. It is not automatically a failure of SaaS. Sometimes it’s the right response to a genuine differentiator. Sometimes it’s less risky than an increasingly tortured declarative workaround built by someone determined to avoid writing “real” code. A five-line extension with source control, automated tests, logging, and a documented owner can be safer than a heroic visual flow nobody wants to touch because the canvas now resembles an airport terminal map. The safer default is buy-before-build: standard components first, AppExchange next, custom code only when nothing else genuinely fits (see Enterprise Salesforce Team Recipe for a longer rant on this aspect).
The distinction that matters isn’t code versus clicks. It’s whether the resulting solution can be understood, tested, secured, upgraded, and supported by whoever inherits it. Microsoft’s own guidance on low-code governance is telling on this point: it talks about guiding “both professional and citizen developers who build custom applications for business needs” (see What Is Low-Code Governance and Why Is It Necessary?). A low-code solution is still a custom application. Custom applications need roles, controls, and oversight, regardless of how few characters got typed to build them.
“Can Be Done” Is Not “Is Supported”
This is worth repeating more than once: almost anything is technically possible with enough extensions, workarounds, APIs, and questionable judgment. Whether it’s supported is a different question entirely (insert Jeff Goldblum Jurassic Park meme here).
Being supported by the vendor means the mechanism is documented, stood behind, and preserved through normal releases. Being supportable by the organization means internal teams can diagnose, test, change, and hand it off. Sustainable means the whole thing stays economically and operationally reasonable as the platform, the process, and the team keep changing. A demo answering yes to “can it be done” tells you nothing about the other three.
Undocumented API behavior, browser automation standing in for a real integration, a customization that quietly modifies vendor-delivered files, a workflow built on a feature the vendor has already announced it’s retiring, a marketplace add-on with one maintainer and an optimistic roadmap: all technically working. None of them are the same commitment as a documented, versioned extension point.
The cost and risk of “custom” depends less on the label and more on the stability of what it’s built on. A stable foundation has published APIs with deprecation notices, documented extension points, sandboxes, deployment and rollback mechanisms, and a realistic talent pool that can maintain it. An unstable one has undocumented internals, screen scraping, direct database access outside vendor guidance, fragile third-party dependencies, and configuration too tangled to inventory. A small customization on a documented extension point can have a modest lifecycle cost. A small customization on undocumented behavior can turn into a recurring upgrade project. The line count, or the number of boxes in a flow, is a weak predictor. The stability of the surface being extended is a much better one.
Standard declarative features aren’t automatically exempt from this either. Salesforce ended support for Workflow Rules and Process Builder after December 31, 2025. Existing automation can keep running. Salesforce’s own documentation puts the distinction plainly: “Your active Workflow Rules and Process Builder processes continue to run as they do today,” followed immediately by the limitation that “customer support is not available, and bugs will not be fixed” (from Workflow Rules and Process Builder End of Support). Salesforce’s own stated reasoning for the consolidation was that spreading automation across multiple tools “hampers both maintenance and innovation” (see Go with the Flow: What’s Happening with Workflow Rules and Process Builder?), which is a reasonable product decision. It doesn’t change who pays for inventorying, testing, migrating, and retraining on what got built on the old feature. “We didn’t write code” was never a lifecycle strategy.
Which is where architects earn their keep, not by vetoing low-code or routing every request through a custom-dev project, but by distinguishing product configuration from business-critical custom behavior, spotting dependency and lifecycle risk before it’s load-bearing, and asking what happens when the vendor retires the thing three years from now. The job isn’t making the solution more complicated. It’s making the complexity visible early enough that the organization can choose where to carry it.
The Ocean View Capability
Every enterprise SaaS platform has Ocean View capabilities. They look excellent from the balcony. The demo is clean, the data is cooperative, the presenter knows the route, and the integration has already been arranged. The value is obvious.
Shiny things can be dazzling, but don’t mistake them for a trick. A ninety-second demo has to compress a hard problem into something presentable, and that compression is what quietly removes the cases that would make the problem visible.
Then implementation starts, and someone asks about identity federation, field-level security, migration errors, audit history, a regional exception, an approval delegation, an API failure, and the department that’s been running its actual process out of a shared mailbox since 2014. The ocean’s still there. It’s just farther from the lobby than the brochure implied.
Vendor blogs are good for learning what a feature is intended to do. They’re written to explain a capability, not to catalog every limitation, so they lean on clean prepared data, follow the happy path, and rarely dwell on edition-specific licensing, exception handling, or recovery scenarios. A vendor blog can show that a feature exists. It rarely proves the feature fits your operating model.
Demos are orchestrated on purpose, not deceptively, just deliberately: prepared dataset, existing roles and permissions, the expected route through the workflow, integrations already wired, no duplicate records, no outages, no data-quality problems, no last-minute policy exception. That’s not fraud. It’s theater. It’s designed to explain a capability quickly, not reproduce a customer’s production environment. The mistake is mistaking a successful demo for a fit assessment.
The fix is straightforward, if less exciting than watching a polished walkthrough: ask the vendor to run the organization’s actual process with representative data, not the generic version. Require the exception path, not just the happy one. Test the real identity, role, and approval requirements. Ask what happens when an integration or automation fails. Get the licensing tier requirements in writing. Ask about support boundaries and lifecycle commitments. The best single question in the room is usually, “Show me what happens when it doesn’t work.”
Gregor Hohpe, (the definitive author on architecture, IMO) states the reality experienced architects live in more plainly than almost anyone writing about this, goes further in The Quest for Low-Code. His starting point: there’s no magic in software. Every code-reduction mechanism implies a trade-off, and the evaluation job is naming which one you’re accepting. From there his checklist gets concrete: is what’s left actually low cognitive load, or just low line-count with the complexity relocated into a jumble of custom syntax buried in quotes inside a YAML file? How does the solution evolve, is there version control, can you roll back, does it hold up past the scale of the demo? And what happens on the unhappy path, do the error messages help or just leak the tool’s internals? His three vendor exercises put that last question to the test directly: introduce an error on purpose and read what the message actually tells you, leave the room and have the vendor break the thing and debug it live, or take the keyboard yourself and see how much hand-holding it takes to build something real.
Configure Deliberately, Extend Carefully
SaaS is frequently the right call. It reduces unnecessary ownership, accelerates access to mature capability, and spares an organization from rebuilding commodity software it has no business rebuilding. Standard functionality should be the default. Sometimes the business process should adapt to a proven product model instead of demanding a bespoke replica of every legacy exception it’s accumulated out of habit.
None of that means every use case gets covered for free. The same flexibility that lets the platform serve wildly different businesses is what makes your specific business’s edge cases someone’s implementation problem, not a checkbox someone forgot to include. And custom code isn’t automatically the harder path. A clean extension against a documented interface can take less time and less risk than the half-dozen declarative features it would take to fake the same behavior through configuration. The label on the technique, code or clicks, was never a reliable way to estimate the work.
Watch for the case study that shows someone getting a complex capability working by wiring together three or four platform features. That’s real, and it’s also incomplete: what made it into the write-up is the wiring, not the weeks of trial, error, and platform-specific knowledge that came before it worked cleanly enough to demo. A capability that took a seasoned admin forty hours to get right the third time doesn’t become a ten-minute task because the polished version only takes ten minutes to watch someone build.
And the decision to go with SaaS is not where the architecture ends. A workflow assembled in a visual designer can still affect revenue, customer commitments, regulatory obligations, and a support team’s weekend. An integration configured through a menu can still fail at 2:00 AM. A field renamed without documentation can still turn next year’s migration into archaeology.
Use the standard product where it genuinely fits. Configure it with discipline, and price that discipline honestly: time, effort, and cost scale with how far the requirement sits from the common case, because the common case is what SaaS was built to solve cheaply. The more unique the business need, the more of that cost the organization carries itself, whether it ends up in configuration, declarative automation, or custom code. Treat declarative automation as software, because it is. Extend stable, documented foundations when the requirement earns it, code included. And the next time someone says a capability is available out of the box, ask the only question that actually matters: out of the box for whom?
In enterprise SaaS, nothing is truly out of the box. The capability exists. What it costs to make that capability yours, in time, effort, and risk, is an architecture decision shaped by how far your need sits from the common case, not a vendor claim and not a line item copied from someone else’s case study.