{"id":587,"date":"2026-10-22T13:30:12","date_gmt":"2026-10-22T13:30:12","guid":{"rendered":"https:\/\/mobilions.com\/blog\/?p=587"},"modified":"2026-10-26T10:44:46","modified_gmt":"2026-10-26T10:44:46","slug":"build-vs-buy-software-workflow-fit","status":"publish","type":"post","link":"https:\/\/mobilions.com\/blog\/build-vs-buy-software-workflow-fit\/","title":{"rendered":"Build vs Buy Software When Your SaaS Workflow Stops Fitting"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">When a SaaS workflow stops fitting, compare replacing it, extending it and building only the missing capability. First eliminate options that fail mandatory requirements. Then compare delivery time, operating responsibility and total cost under the same assumptions. A custom build needs evidence that its benefits justify the work it displaces.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The decision in brief:<\/p>\n\n\n\n<ul>\n    <li>A mandatory requirement is a gate, not a score that cheaper pricing can offset.<\/li>\n    <li>Buying still leaves customer-side configuration, access and data responsibilities.<\/li>\n    <li>Building requires funded ownership after launch, not just a delivery budget.<\/li>\n    <li>Hybrid adds integration work; it is an option to test, not the default winner.<\/li>\n  <\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">What exactly are we deciding to build or buy?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Decide on a bounded capability, not the whole company stack.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;Replace our software&#8221; is too broad. &#8220;Support approval exceptions without re-entering customer records&#8221; is a testable problem. Write down who uses that workflow, where it fails and what a successful outcome would look like.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Compare buying or configuring another product, extending the current one and building the missing capability. Include doing nothing if the current inconvenience may cost less than a change. A differentiated product can still depend on standard services; an ordinary workflow can have unusual constraints.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Which requirements should rule an option out?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Reject an option that cannot meet a genuine must-have before assigning preference scores.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Turn each must-have into an acceptance test and name the person who can approve the evidence. Examples include:<\/p>\n\n\n\n<ul>\n    <li>Completing the hardest workflow without an unacceptable manual workaround.<\/li>\n    <li>Meeting the required security, accessibility, residency and recovery conditions.<\/li>\n    <li>Exporting the records and relationships needed for a usable migration.<\/li>\n    <li>Operating within the team&#8217;s available support capacity.<\/li>\n  <\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">An untested requirement is unresolved, not a pass. For a build, an architecture promise is not equivalent to a demonstrated capability: use a focused prototype and identify what remains unproven.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The UK Government Digital Service recommends testing a small but difficult problem and integration with current products before buying. Its <a href=\"https:\/\/www.gov.uk\/guidance\/define-your-purchasing-strategy\" target=\"_blank\" rel=\"noopener\">purchasing-strategy guidance<\/a> concerns public procurement; those testing principles are useful here without treating government purchasing rules as universal requirements.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">When should we buy, build or use a hybrid?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Choose the option whose fit and operating demands match the business, rather than assuming ownership or speed settles the decision.<\/p>\n\n\n\n<div class=\"mobilions-table-scroll\" role=\"region\" aria-label=\"When should we buy, build or use a hybrid?\" tabindex=\"0\" style=\"overflow-x:auto;border:1px solid #cbd9e9;border-radius:12px;margin:22px 0 28px;box-shadow:0 3px 12px rgba(19,43,76,0.08)\">\n<table class=\"mobilions-decision-table\" style=\"border-collapse:separate;border-spacing:0;width:100%;min-width:720px;color:#14233c;font-size:15px;line-height:1.5\">\n    <thead><tr><th scope=\"col\" style=\"background:#132b4c;color:#ffffff;padding:13px 15px;text-align:left;border-bottom:3px solid #f4b320;font-weight:700\">Option<\/th><th scope=\"col\" style=\"background:#132b4c;color:#ffffff;padding:13px 15px;text-align:left;border-bottom:3px solid #f4b320;font-weight:700\">Strong reason to choose it<\/th><th scope=\"col\" style=\"background:#132b4c;color:#ffffff;padding:13px 15px;text-align:left;border-bottom:3px solid #f4b320;font-weight:700\">Evidence to demand<\/th><\/tr><\/thead>\n    <tbody>\n      <tr style=\"background:#ffffff\"><th scope=\"row\" style=\"padding:12px 15px;border-bottom:1px solid #dce6f1;vertical-align:top;font-weight:600;\">Buy or configure<\/th><td style=\"padding:12px 15px;border-bottom:1px solid #dce6f1;vertical-align:top;\">A product passes the essential workflow tests with acceptable adaptation.<\/td><td style=\"padding:12px 15px;border-bottom:1px solid #dce6f1;vertical-align:top;\">A realistic trial, total commercial terms and a named internal owner.<\/td><\/tr>\n      <tr style=\"background:#f1f7ff\"><th scope=\"row\" style=\"padding:12px 15px;border-bottom:1px solid #dce6f1;vertical-align:top;font-weight:600;\">Build<\/th><td style=\"padding:12px 15px;border-bottom:1px solid #dce6f1;vertical-align:top;\">Available products cannot satisfy an important requirement, and the benefit warrants sustained engineering ownership.<\/td><td style=\"padding:12px 15px;border-bottom:1px solid #dce6f1;vertical-align:top;\">A bounded scope, feasibility evidence and a funded operating plan.<\/td><\/tr>\n      <tr style=\"background:#ffffff\"><th scope=\"row\" style=\"padding:12px 15px;border-bottom:1px solid #dce6f1;vertical-align:top;font-weight:600;\">Hybrid<\/th><td style=\"padding:12px 15px;border-bottom:1px solid #dce6f1;vertical-align:top;\">A bought platform works well except for a separable capability you need to control.<\/td><td style=\"padding:12px 15px;border-bottom:1px solid #dce6f1;vertical-align:top;\">Proven API behavior, clear data ownership between systems and an integration support plan.<\/td><\/tr>\n    <\/tbody>\n  <\/table>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Buying does not eliminate responsibility. <a href=\"https:\/\/learn.microsoft.com\/en-us\/azure\/security\/fundamentals\/shared-responsibility\" target=\"_blank\" rel=\"noopener\">Microsoft&#8217;s shared-responsibility model<\/a> retains customer responsibilities for data, settings, identities and access even with SaaS. Check the actual service agreement and controls rather than assuming the supplier owns everything operationally.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Building moves more responsibility onto your team: deployment, patches, backups, recovery, support and change. Confirm source access, modification rights, third-party licences and transition arrangements in the engagement; custom software is not automatically portable just because you possess its source code.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">How can we score the options without manufacturing certainty?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Use weighted scores to expose judgments, then test whether the conclusion survives plausible changes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Agree weights before scoring. For each criterion, define what poor, acceptable and strong performance mean in your context. Use 1 for poor, 3 for acceptable and 5 for strong performance, with 2 and 4 between those anchors; higher is always better. Record the evidence and confidence beside every score.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Illustrative scoring example, not a benchmark or Mobilions project result.<\/strong> All options below are assumed to have passed the mandatory gates; that assumption must be verified in a real decision.<\/p>\n\n\n\n<div class=\"mobilions-table-scroll\" role=\"region\" aria-label=\"How can we score the options without manufacturing certainty?\" tabindex=\"0\" style=\"overflow-x:auto;border:1px solid #cbd9e9;border-radius:12px;margin:22px 0 28px;box-shadow:0 3px 12px rgba(19,43,76,0.08)\">\n<table class=\"mobilions-decision-table\" style=\"border-collapse:separate;border-spacing:0;width:100%;min-width:680px;color:#14233c;font-size:15px;line-height:1.5\">\n    <thead><tr><th scope=\"col\" style=\"background:#132b4c;color:#ffffff;padding:13px 15px;text-align:left;border-bottom:3px solid #f4b320;font-weight:700\">Criterion<\/th><th scope=\"col\" style=\"background:#132b4c;color:#ffffff;padding:13px 15px;text-align:left;border-bottom:3px solid #f4b320;font-weight:700\">Weight<\/th><th scope=\"col\" style=\"background:#132b4c;color:#ffffff;padding:13px 15px;text-align:left;border-bottom:3px solid #f4b320;font-weight:700\">Buy<\/th><th scope=\"col\" style=\"background:#132b4c;color:#ffffff;padding:13px 15px;text-align:left;border-bottom:3px solid #f4b320;font-weight:700\">Build<\/th><th scope=\"col\" style=\"background:#132b4c;color:#ffffff;padding:13px 15px;text-align:left;border-bottom:3px solid #f4b320;font-weight:700\">Hybrid<\/th><\/tr><\/thead>\n    <tbody>\n      <tr style=\"background:#ffffff\"><th scope=\"row\" style=\"padding:12px 15px;border-bottom:1px solid #dce6f1;vertical-align:top;font-weight:600;\">Workflow fit beyond the minimum<\/th><td style=\"padding:12px 15px;border-bottom:1px solid #dce6f1;vertical-align:top;text-align:right;white-space:nowrap;\">30%<\/td><td style=\"padding:12px 15px;border-bottom:1px solid #dce6f1;vertical-align:top;text-align:right;white-space:nowrap;\">3<\/td><td style=\"padding:12px 15px;border-bottom:1px solid #dce6f1;vertical-align:top;text-align:right;white-space:nowrap;\">5<\/td><td style=\"padding:12px 15px;border-bottom:1px solid #dce6f1;vertical-align:top;text-align:right;white-space:nowrap;\">4<\/td><\/tr>\n      <tr style=\"background:#f1f7ff\"><th scope=\"row\" style=\"padding:12px 15px;border-bottom:1px solid #dce6f1;vertical-align:top;font-weight:600;\">Time to useful operation<\/th><td style=\"padding:12px 15px;border-bottom:1px solid #dce6f1;vertical-align:top;text-align:right;white-space:nowrap;\">20%<\/td><td style=\"padding:12px 15px;border-bottom:1px solid #dce6f1;vertical-align:top;text-align:right;white-space:nowrap;\">5<\/td><td style=\"padding:12px 15px;border-bottom:1px solid #dce6f1;vertical-align:top;text-align:right;white-space:nowrap;\">2<\/td><td style=\"padding:12px 15px;border-bottom:1px solid #dce6f1;vertical-align:top;text-align:right;white-space:nowrap;\">4<\/td><\/tr>\n      <tr style=\"background:#ffffff\"><th scope=\"row\" style=\"padding:12px 15px;border-bottom:1px solid #dce6f1;vertical-align:top;font-weight:600;\">Operating headroom above the minimum<\/th><td style=\"padding:12px 15px;border-bottom:1px solid #dce6f1;vertical-align:top;text-align:right;white-space:nowrap;\">15%<\/td><td style=\"padding:12px 15px;border-bottom:1px solid #dce6f1;vertical-align:top;text-align:right;white-space:nowrap;\">4<\/td><td style=\"padding:12px 15px;border-bottom:1px solid #dce6f1;vertical-align:top;text-align:right;white-space:nowrap;\">2<\/td><td style=\"padding:12px 15px;border-bottom:1px solid #dce6f1;vertical-align:top;text-align:right;white-space:nowrap;\">3<\/td><\/tr>\n      <tr style=\"background:#f1f7ff\"><th scope=\"row\" style=\"padding:12px 15px;border-bottom:1px solid #dce6f1;vertical-align:top;font-weight:600;\">Cost and value over the chosen horizon<\/th><td style=\"padding:12px 15px;border-bottom:1px solid #dce6f1;vertical-align:top;text-align:right;white-space:nowrap;\">15%<\/td><td style=\"padding:12px 15px;border-bottom:1px solid #dce6f1;vertical-align:top;text-align:right;white-space:nowrap;\">4<\/td><td style=\"padding:12px 15px;border-bottom:1px solid #dce6f1;vertical-align:top;text-align:right;white-space:nowrap;\">3<\/td><td style=\"padding:12px 15px;border-bottom:1px solid #dce6f1;vertical-align:top;text-align:right;white-space:nowrap;\">4<\/td><\/tr>\n      <tr style=\"background:#ffffff\"><th scope=\"row\" style=\"padding:12px 15px;border-bottom:1px solid #dce6f1;vertical-align:top;font-weight:600;\">Adaptability for expected changes<\/th><td style=\"padding:12px 15px;border-bottom:1px solid #dce6f1;vertical-align:top;text-align:right;white-space:nowrap;\">10%<\/td><td style=\"padding:12px 15px;border-bottom:1px solid #dce6f1;vertical-align:top;text-align:right;white-space:nowrap;\">2<\/td><td style=\"padding:12px 15px;border-bottom:1px solid #dce6f1;vertical-align:top;text-align:right;white-space:nowrap;\">5<\/td><td style=\"padding:12px 15px;border-bottom:1px solid #dce6f1;vertical-align:top;text-align:right;white-space:nowrap;\">4<\/td><\/tr>\n      <tr style=\"background:#f1f7ff\"><th scope=\"row\" style=\"padding:12px 15px;border-bottom:1px solid #dce6f1;vertical-align:top;font-weight:600;\">Practical ability to exit<\/th><td style=\"padding:12px 15px;border-bottom:1px solid #dce6f1;vertical-align:top;text-align:right;white-space:nowrap;\">10%<\/td><td style=\"padding:12px 15px;border-bottom:1px solid #dce6f1;vertical-align:top;text-align:right;white-space:nowrap;\">2<\/td><td style=\"padding:12px 15px;border-bottom:1px solid #dce6f1;vertical-align:top;text-align:right;white-space:nowrap;\">4<\/td><td style=\"padding:12px 15px;border-bottom:1px solid #dce6f1;vertical-align:top;text-align:right;white-space:nowrap;\">3<\/td><\/tr>\n      <tr style=\"background:#fff4d6\"><th scope=\"row\" style=\"padding:12px 15px;border-bottom:1px solid #dce6f1;vertical-align:top;font-weight:600;\"><strong>Weighted result, out of 100<\/strong><\/th><td style=\"padding:12px 15px;border-bottom:1px solid #dce6f1;vertical-align:top;text-align:right;white-space:nowrap;\"><strong>100%<\/strong><\/td><td style=\"padding:12px 15px;border-bottom:1px solid #dce6f1;vertical-align:top;text-align:right;white-space:nowrap;\"><strong>70<\/strong><\/td><td style=\"padding:12px 15px;border-bottom:1px solid #dce6f1;vertical-align:top;text-align:right;white-space:nowrap;\"><strong>71<\/strong><\/td><td style=\"padding:12px 15px;border-bottom:1px solid #dce6f1;vertical-align:top;text-align:right;white-space:nowrap;\"><strong>75<\/strong><\/td><\/tr>\n    <\/tbody>\n  <\/table>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Multiply each score by its percentage weight, add the products and divide by 5. These are proposed decision weights, not research-derived thresholds. Avoid counting the same benefit twice under fit and adaptability.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Hybrid leads this invented example, but lowering its workflow-fit score from 4 to 3 reduces its total to 69. That is a reason to test the disputed workflow, not declare a winner from the original spreadsheet. A close result does not automatically justify hybrid.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">How should we compare the cost over time?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Compare equivalent requirements and operating periods, including the work each option leaves with your team. For the build side, see <a href=\"https:\/\/mobilions.com\/blog\/custom-software-development-cost\/\">what custom software costs<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Account for evaluation, implementation, migration, training, subscriptions or usage, internal administration, infrastructure, maintenance, changes and eventual exit. Use the supplier&#8217;s actual pricing units and terms rather than assuming every product charges per seat. Custom operating costs can also rise with demand.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Hypothetical arithmetic example, not a vendor quote, Mobilions estimate or industry benchmark. All amounts are USD.<\/strong> Assume equivalent scope and service levels, setup before 36 months of operation, and average paid seats of 100, 150 and 200 in successive years. The invented SaaS price is $50 per seat per month, and internal labour is fully loaded allocated cost, not necessarily extra hiring.<\/p>\n\n\n\n<div class=\"mobilions-table-scroll\" role=\"region\" aria-label=\"How should we compare the cost over time?\" tabindex=\"0\" style=\"overflow-x:auto;border:1px solid #cbd9e9;border-radius:12px;margin:22px 0 28px;box-shadow:0 3px 12px rgba(19,43,76,0.08)\">\n<table class=\"mobilions-decision-table\" style=\"border-collapse:separate;border-spacing:0;width:100%;min-width:640px;color:#14233c;font-size:15px;line-height:1.5\">\n    <thead><tr><th scope=\"col\" style=\"background:#132b4c;color:#ffffff;padding:13px 15px;text-align:left;border-bottom:3px solid #f4b320;font-weight:700\">Cost over the modeled period<\/th><th scope=\"col\" style=\"background:#132b4c;color:#ffffff;padding:13px 15px;text-align:left;border-bottom:3px solid #f4b320;font-weight:700\">Buy<\/th><th scope=\"col\" style=\"background:#132b4c;color:#ffffff;padding:13px 15px;text-align:left;border-bottom:3px solid #f4b320;font-weight:700\">Build<\/th><\/tr><\/thead>\n    <tbody>\n      <tr style=\"background:#ffffff\"><th scope=\"row\" style=\"padding:12px 15px;border-bottom:1px solid #dce6f1;vertical-align:top;font-weight:600;\">Initial implementation or delivery, migration and training<\/th><td style=\"padding:12px 15px;border-bottom:1px solid #dce6f1;vertical-align:top;text-align:right;white-space:nowrap;\">$30,000<\/td><td style=\"padding:12px 15px;border-bottom:1px solid #dce6f1;vertical-align:top;text-align:right;white-space:nowrap;\">$180,000<\/td><\/tr>\n      <tr style=\"background:#f1f7ff\"><th scope=\"row\" style=\"padding:12px 15px;border-bottom:1px solid #dce6f1;vertical-align:top;font-weight:600;\">Subscription charges<\/th><td style=\"padding:12px 15px;border-bottom:1px solid #dce6f1;vertical-align:top;text-align:right;white-space:nowrap;\">$270,000<\/td><td style=\"padding:12px 15px;border-bottom:1px solid #dce6f1;vertical-align:top;text-align:right;white-space:nowrap;\">$0<\/td><\/tr>\n      <tr style=\"background:#ffffff\"><th scope=\"row\" style=\"padding:12px 15px;border-bottom:1px solid #dce6f1;vertical-align:top;font-weight:600;\">Hosting and managed services<\/th><td style=\"padding:12px 15px;border-bottom:1px solid #dce6f1;vertical-align:top;text-align:right;white-space:nowrap;\">Included above<\/td><td style=\"padding:12px 15px;border-bottom:1px solid #dce6f1;vertical-align:top;text-align:right;white-space:nowrap;\">$72,000<\/td><\/tr>\n      <tr style=\"background:#f1f7ff\"><th scope=\"row\" style=\"padding:12px 15px;border-bottom:1px solid #dce6f1;vertical-align:top;font-weight:600;\">Customer operations or custom maintenance and planned changes<\/th><td style=\"padding:12px 15px;border-bottom:1px solid #dce6f1;vertical-align:top;text-align:right;white-space:nowrap;\">$45,000<\/td><td style=\"padding:12px 15px;border-bottom:1px solid #dce6f1;vertical-align:top;text-align:right;white-space:nowrap;\">$135,000<\/td><\/tr>\n      <tr style=\"background:#ffffff\"><th scope=\"row\" style=\"padding:12px 15px;border-bottom:1px solid #dce6f1;vertical-align:top;font-weight:600;\">Assumed transition after year 3<\/th><td style=\"padding:12px 15px;border-bottom:1px solid #dce6f1;vertical-align:top;text-align:right;white-space:nowrap;\">$15,000<\/td><td style=\"padding:12px 15px;border-bottom:1px solid #dce6f1;vertical-align:top;text-align:right;white-space:nowrap;\">$15,000<\/td><\/tr>\n      <tr style=\"background:#fff4d6\"><th scope=\"row\" style=\"padding:12px 15px;border-bottom:1px solid #dce6f1;vertical-align:top;font-weight:600;\"><strong>Total including assumed transition<\/strong><\/th><td style=\"padding:12px 15px;border-bottom:1px solid #dce6f1;vertical-align:top;text-align:right;white-space:nowrap;\"><strong>$360,000<\/strong><\/td><td style=\"padding:12px 15px;border-bottom:1px solid #dce6f1;vertical-align:top;text-align:right;white-space:nowrap;\"><strong>$402,000<\/strong><\/td><\/tr>\n    <\/tbody>\n  <\/table>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\">The build&#8217;s assumed hosting costs are $18,000, $24,000 and $30,000 by year; maintenance and planned changes are $40,000, $45,000 and $50,000. The bought option includes $15,000 a year for customer administration, support and integration upkeep. Build-side managed-service subscriptions are included under hosting; no additional application licences are assumed, rather than claiming custom software never has licence costs.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Buying is $42,000 lower here. Changing only the subscription assumption to $60 per seat per month makes buying $414,000, which is $12,000 above the unchanged build estimate. Neither result predicts what a real supplier or build will cost.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This example excludes tax, inflation and discounting. It assumes an exit after year 3; without that event the totals are $345,000 and $387,000. Assess delivery delay and business benefits separately, and do not count the same staff time again as an opportunity-cost charge.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A real hybrid needs its own estimate for both subscriptions and custom work. Do not price it as the average of the other two options.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What does Baba show about the component boundary?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Baba illustrates a component-level choice, not replacement of an ill-fitting SaaS product.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The <a href=\"https:\/\/mobilions.com\/case-studies\/baba-hebrew-translation-app\/\">Baba case study<\/a> describes native clients and a custom model router integrated with Supabase authentication and real-time sync. It explicitly describes using Supabase real-time subscriptions rather than building a custom sync server.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The clarified comparison was with self-managed PostgreSQL, not another managed service. These scopes must stay separate:<\/p>\n\n\n\n<div class=\"mobilions-table-scroll\" role=\"region\" aria-label=\"What does Baba show about the component boundary?\" tabindex=\"0\" style=\"overflow-x:auto;border:1px solid #cbd9e9;border-radius:12px;margin:22px 0 28px;box-shadow:0 3px 12px rgba(19,43,76,0.08)\">\n<table class=\"mobilions-decision-table\" style=\"border-collapse:separate;border-spacing:0;width:100%;min-width:560px;color:#14233c;font-size:15px;line-height:1.5\">\n    <thead><tr><th scope=\"col\" style=\"background:#132b4c;color:#ffffff;padding:13px 15px;text-align:left;border-bottom:3px solid #f4b320;font-weight:700\">Comparison<\/th><th scope=\"col\" style=\"background:#132b4c;color:#ffffff;padding:13px 15px;text-align:left;border-bottom:3px solid #f4b320;font-weight:700\">Work being compared<\/th><\/tr><\/thead>\n    <tbody>\n      <tr style=\"background:#ffffff\"><th scope=\"row\" style=\"padding:12px 15px;border-bottom:1px solid #dce6f1;vertical-align:top;font-weight:600;\">Database operations<\/th><td style=\"padding:12px 15px;border-bottom:1px solid #dce6f1;vertical-align:top;\">Using managed PostgreSQL versus operating PostgreSQL yourself.<\/td><\/tr>\n      <tr style=\"background:#f1f7ff\"><th scope=\"row\" style=\"padding:12px 15px;border-bottom:1px solid #dce6f1;vertical-align:top;font-weight:600;\">Complete backend<\/th><td style=\"padding:12px 15px;border-bottom:1px solid #dce6f1;vertical-align:top;\">Also accounting for authentication, APIs and the service patterns the application uses.<\/td><\/tr>\n    <\/tbody>\n  <\/table>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/supabase.com\/docs\/guides\/getting-started\/architecture\" target=\"_blank\" rel=\"noopener\">Supabase&#8217;s architecture documentation<\/a> identifies Postgres, authentication and API services as separate components. A database alone is not an equivalent replacement for the whole backend. No project savings are asserted here.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">From our projects<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">My comparison was with self-managed PostgreSQL, not another managed service. At that level, I was focusing on how much infrastructure control we keep and how much database-operation work we take on. The main limitation I would knowingly accept is less infrastructure control in exchange for faster development and less maintenance.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A complete custom backend is a broader comparison. It also includes the authentication, APIs and service patterns that Supabase provides. I would need to account for those capabilities rather than compare a database alone with the whole platform.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Accepting the built-in patterns is part of the trade-off to reduce development and maintenance work. That is the reasoning behind the comparison, not a measured claim about saved hours or lower project cost.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">When should we avoid committing to this approach?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Do not turn a useful comparison into a commitment while its deciding assumptions remain untested.<\/p>\n\n\n\n<ul>\n    <li>Avoid a build with no accountable post-launch owner or maintenance budget.<\/li>\n    <li>Avoid buying a product when its workarounds undermine the essential workflow.<\/li>\n    <li>Avoid hybrid when API restrictions or unclear failure ownership make the boundary unreliable.<\/li>\n    <li>Avoid treating a high score as permission to ignore a failed mandatory requirement.<\/li>\n  <\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">What should we record before committing?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Keep a short decision record with the selected option, rejected alternatives, evidence, owner and review triggers.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Record the operating assumptions and the event that would reopen the decision, such as a renewal, a failed integration test or a material change in demand. Test export and recovery rather than accepting &#8220;no lock-in&#8221; as a promise. The Government Digital Service&#8217;s <a href=\"https:\/\/www.gov.uk\/guidance\/managing-technical-lock-in-in-the-cloud\" target=\"_blank\" rel=\"noopener\">cloud lock-in guidance<\/a> explains why both contractual and technical dependencies matter, including when managed services justify some dependence.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If building wins, move the accepted requirements into discovery and delivery planning. Our <a href=\"https:\/\/mobilions.com\/blog\/custom-software-development-process\/\">custom software development process<\/a> explains what happens after that decision, from discovery through ongoing support. If you need an outside team for that work, use our <a href=\"https:\/\/mobilions.com\/blog\/questions-before-hiring-a-software-development-company\/\">questions to ask before hiring a software development company<\/a> before selecting one.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Frequently asked questions<\/h2>\n\n\n<div id=\"rank-math-faq\" class=\"rank-math-block\">\n<div class=\"rank-math-list \">\n<div id=\"faq-question-587-1\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \">Does a high SaaS bill justify building a replacement?<\/h3>\n<div class=\"rank-math-answer \">\n\n<p>No. A high subscription bill is a reason to investigate, not proof that replacement is cheaper. Compare equivalent scope, implementation, support, infrastructure and future changes over the same period. Test pricing and workload assumptions on both sides. A build can cost more throughout its useful life, even when the licence bill looks uncomfortable.<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-587-2\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \">Should security and data residency be weighted criteria?<\/h3>\n<div class=\"rank-math-answer \">\n\n<p>Mandatory security and residency requirements should be gates. An option that cannot satisfy them is ineligible, regardless of its total score. Among options that pass, you can score additional capabilities or operational convenience. Define the required evidence with the accountable security or compliance owner rather than treating a sales assurance as a completed check.<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-587-3\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \">Is hybrid automatically the lowest-risk choice?<\/h3>\n<div class=\"rank-math-answer \">\n\n<p>No. Hybrid can limit custom scope, but it adds interfaces and shared failure paths. Check API limits, authentication, data consistency, retry behavior, version changes and responsibility for incidents. Choose it when the boundary is understandable and supportable, not because buying and building receive similar scores or because integration sounds like a small task.<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-587-4\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \">Does owning custom code remove lock-in?<\/h3>\n<div class=\"rank-math-answer \">\n\n<p>No. Custom software can depend on a specialist team, proprietary services or undocumented deployment knowledge. Review contractual rights and dependencies, then test whether another team can operate and change it. A repository handover is useful, but it does not establish practical portability or eliminate the cost of moving data and infrastructure.<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-587-5\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \">When should we revisit the decision?<\/h3>\n<div class=\"rank-math-answer \">\n\n<p>Revisit it when a recorded assumption changes enough to affect the outcome. Useful triggers include contract renewal, a required workflow change, a supplier restriction, growth beyond the modeled range or loss of the team responsible for operations. Keep the original evidence so the next review compares changed facts rather than restarting the debate from memory.<\/p>\n\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">If your team has outgrown a SaaS workflow but cannot afford to sacrifice the product roadmap, bring the failing workflow, must-haves and shortlisted tools to a <a href=\"https:\/\/mobilions.com\/services\/custom-software-development\/\">custom software development discussion with Mobilions<\/a>. Start with the capability that needs to change, not a commitment to rebuild everything.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>When a SaaS workflow stops fitting, compare replacing it, extending it and building only the missing capability. First eliminate options that fail mandatory requirements. Then compare delivery time, operating responsibility and total cost under the same assumptions. A custom build needs evidence that its benefits justify the work it displaces. The decision in brief: A [&hellip;]<\/p>\n","protected":false},"author":4,"featured_media":589,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[27],"tags":[70,232],"class_list":["post-587","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-software-development","tag-build-vs-buy","tag-custom-software-development"],"_links":{"self":[{"href":"https:\/\/mobilions.com\/blog\/wp-json\/wp\/v2\/posts\/587","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mobilions.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/mobilions.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/mobilions.com\/blog\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/mobilions.com\/blog\/wp-json\/wp\/v2\/comments?post=587"}],"version-history":[{"count":7,"href":"https:\/\/mobilions.com\/blog\/wp-json\/wp\/v2\/posts\/587\/revisions"}],"predecessor-version":[{"id":615,"href":"https:\/\/mobilions.com\/blog\/wp-json\/wp\/v2\/posts\/587\/revisions\/615"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/mobilions.com\/blog\/wp-json\/wp\/v2\/media\/589"}],"wp:attachment":[{"href":"https:\/\/mobilions.com\/blog\/wp-json\/wp\/v2\/media?parent=587"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mobilions.com\/blog\/wp-json\/wp\/v2\/categories?post=587"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mobilions.com\/blog\/wp-json\/wp\/v2\/tags?post=587"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}