Vendor Lock In: How to Avoid Getting Trapped by Your Tech Choices

Veld Systems||6 min read

Vendor lock in is one of the most expensive problems in software, and it usually does not feel like a problem until it is too late. You choose a platform because it is convenient today. You build on top of its proprietary APIs. Your data lives in its proprietary format. Three years later, your costs have tripled, the platform does not support what you need, and migrating away would take six months of engineering time.

We have helped multiple clients migrate off platforms they were locked into. The cost of migration is always painful. The cost of staying is sometimes worse. This post covers how lock in happens, how to evaluate the risk in your own stack, and what you can do to keep your options open without overengineering everything.

How Lock In Actually Happens

Lock in rarely comes from a single decision. It accumulates through dozens of small, reasonable choices that each seem fine in isolation.

You pick a cloud provider and start using its proprietary database service because it is easier than managing your own. Reasonable. Then you use its proprietary message queue because it integrates natively. Also reasonable. Then you adopt its identity service, its serverless runtime, its CDN, its monitoring. Each choice is individually defensible. But collectively, you have built a system where every component depends on a single vendor, and switching any piece means rewriting the pieces connected to it.

The same pattern plays out with SaaS platforms. You build your product on top of a no code tool or a specific CMS. You customize it heavily. Your business processes are shaped around its limitations. When the vendor raises prices by 40% (it happens regularly), you face a choice: pay up or rebuild. That is not a real choice. That is leverage.

We wrote about the broader question of custom software versus SaaS and when each makes sense. Lock in risk is one of the biggest factors in that decision.

The Spectrum of Lock In

Not all lock in is equally dangerous. It helps to think about it on a spectrum.

Low risk lock in involves services that follow open standards and have clear export paths. Using PostgreSQL on any cloud provider is low risk because PostgreSQL is an open standard. Your data is portable. Your queries work anywhere. Using a managed Kubernetes service is moderate risk because Kubernetes itself is open, but the specific configuration and networking layer varies by provider.

Medium risk lock in involves services that have alternatives but require meaningful effort to switch. Cloud functions (AWS Lambda, Google Cloud Functions, Supabase Edge Functions) are medium risk. The runtime concepts are similar across providers, but the deployment, configuration, and integration layers differ enough that migration is a real project. We covered this tradeoff specifically in our serverless versus Kubernetes comparison.

High risk lock in involves proprietary services with no standard equivalent. Firebase Realtime Database, proprietary AI/ML services that use custom model formats, no code platforms where your application logic lives entirely within the vendor. These are the dangerous ones. If you need to leave, you are essentially starting over.

Practical Strategies to Reduce Lock In

The goal is not to avoid all vendor dependencies. That is impractical and counterproductive. Managed services exist because managing infrastructure yourself is expensive and distracting. The goal is to make deliberate choices about where you accept vendor dependency and ensure you have exit paths for the things that matter most.

Own your data layer. This is the single most important principle. Your data is your business. Use open database formats (PostgreSQL, MySQL) where your data is fully portable. If you are using a proprietary database, ensure you have regular exports in a standard format. We have seen companies realize they could not export their data from a vendor in any usable format. That is an existential risk.

We generally recommend Supabase over Firebase specifically because Supabase is built on PostgreSQL. Your data is always yours. If you ever need to leave, you take your Postgres database with you. We detailed this comparison in our Supabase versus Firebase analysis.

Abstract vendor specific integrations. When you use a vendor specific service (cloud storage, email delivery, payment processing), put an abstraction layer between it and your application code. This does not mean building elaborate adapter patterns for everything. It means writing your code so that the vendor specific logic lives in one place rather than being scattered across your entire codebase.

For example, instead of calling AWS S3 APIs directly throughout your application, create a storage service module that wraps S3. If you need to switch to Google Cloud Storage or Cloudflare R2 later, you rewrite one module instead of fifty files.

Evaluate exit cost before adoption. Before adopting any significant platform or service, ask: "What would it cost to leave this in 18 months?" If the answer is "trivial," great. If the answer is "we would have to rewrite our entire backend," that should factor heavily into the decision. This does not mean you avoid the platform. It means you go in with eyes open about the tradeoff.

Keep infrastructure as code. Define your infrastructure in version controlled configuration files (Terraform, Pulumi, or at minimum documented scripts). When your infrastructure is defined as code, migrating between providers becomes a translation exercise rather than a guessing game. Our cloud and DevOps practice emphasizes this approach on every project.

Avoid proprietary languages and frameworks. This should be obvious, but we still see it. Building critical business logic in a vendor specific scripting language (Salesforce Apex, proprietary workflow builders) means your logic is trapped. Use standard languages. Use standard frameworks. Keep your business logic in code you control.

When Lock In Is Acceptable

Not all lock in deserves the same level of concern. Here is when it is fine.

Commodity services with easy switching. DNS, CDN, email delivery, transactional SMS. These services are interchangeable with minimal effort. Locking in to Cloudflare for DNS costs you nothing because switching to Route 53 takes an afternoon.

Early stage products finding product market fit. If you are a startup trying to validate an idea, speed matters more than portability. Use whatever gets you to market fastest. You can refactor later. The risk of overengineering your architecture at this stage is higher than the risk of vendor lock in, because most startups pivot before lock in becomes a problem.

Services where the alternative is significantly worse. Sometimes a proprietary service is so much better than the alternatives that the lock in is worth it. Stripe for payments is a common example. Yes, you are dependent on Stripe. But their API is so well designed and their ecosystem so mature that the lock in cost is vastly outweighed by the development time you save.

The Real Question

The question is not "how do I avoid all vendor dependencies?" It is "which dependencies am I comfortable with, and which ones create unacceptable risk?" The answer is different for every product, every team, and every stage of growth.

If you are evaluating your current stack and want to understand where your lock in risks are, talk to us. We will audit your architecture and give you a clear picture of where you are exposed and what, if anything, you should do about it.

Ready to Build?

Let us talk about your project

We take on 3-4 projects at a time. Get an honest assessment within 24 hours.