All posts
·5 min read

Avoiding backend vendor lock-in for SMBs

How to use SaaS tools without building your business on shifting sand — the small habits that keep you portable.

architecturevendor lock-instrategy

You will use SaaS

If you are an SMB, you are using Stripe, SendGrid, Cloudflare, a managed Postgres, probably an LLM API, probably a queue host. That is correct. Building all of that yourself would be insane.

The question is not "how do I avoid SaaS." It is "how do I use SaaS without my business depending on any one vendor's continued existence and pricing."

The small habits

Wrap third-party SDKs

Do not call stripe.PaymentIntent.create directly from a route handler. Call payments.charge(...). payments is your module; it calls Stripe internally.

When Stripe doubles their fees and you want to evaluate Adyen, you change one file.

Store IDs, not objects

Store the Stripe customer ID and a few denormalized fields you actually use (email, name). Do not store the full Stripe Customer object. The shape will change, and you will be tied to it.

Keep your data

Anything that runs your business — orders, customers, invoices, events — lives in your Postgres. SaaS tools that hold your data hostage (or that you cannot export easily) are a risk.

Specifically: avoid using a CRM as the source of truth for customers. Sync from the CRM into your DB. Treat the CRM as a UI for sales, not as a system of record.

Use open standards where they exist

  • Auth: OAuth + OIDC, not vendor-proprietary tokens
  • Storage: S3 API (works with AWS, Cloudflare R2, MinIO, etc.)
  • Email: SMTP or SendGrid-API-compatible providers
  • Queues: Redis, RabbitMQ, or Postgres — all portable

Buy your domains

Sounds obvious. Many SMBs let their agency or a marketing tool "register" their domain. Two years later they cannot move because the domain is in someone else's account.

What is fine to lock into

  • The cloud provider (switching clouds is a year-long project; do not pretend otherwise)
  • Stripe for payments (the cost of switching is low because of the wrapper above)
  • Your Postgres provider (data is portable, switching is annoying not catastrophic)

What we tell clients

Lock-in is on a spectrum. Some lock-in is fine. The goal is to keep the business-critical assets — customer data, domains, the codebase — portable. Everything else is a trade-off, and we recommend leaning toward convenience until convenience costs more than the wrapper.

Got a workflow problem?

Let's talk about whether n8n, a custom backend, or a hybrid fits your case.

A 30-minute discovery call. Free, honest, you leave with a written direction either way.

Start QuizBook a Call