Solution guide · Custom Software

Custom Software With SSO and SCIM User Provisioning: The Real Cost

The short answer

Adding SSO and SCIM provisioning to an existing product typically runs $15,000 to $60,000 over 4 to 10 weeks when your app already has a clean organization and membership model. Shipped as part of a first release it is $50,000 to $130,000 in 10 to 16 weeks. A full identity platform with group driven roles, audit evidence and certification against multiple identity providers is $150,000 to $350,000 over 6 to 12 months. The number moves on your data model, not on the protocols.

What this looks like the first time a real identity provider plugs in

SSO and SCIM get quoted as two checkboxes on an enterprise readiness list. SSO is an authentication protocol you have to verify cryptographically or it is a login bypass. SCIM is a lifecycle API that a third party you do not control calls against your database, on its own schedule, forever.

Here is a failure we have cleaned up more than once. A customer terminates an employee on a Friday. Their Microsoft Entra ID provisioning job sends your SCIM endpoint a PATCH: {"op":"replace","path":"active","value":"False"}. Notice that "False" is a JSON string, not a boolean. Some Entra provisioning jobs send it exactly that way. The naive handler does if (op.value) { user.active = true }, the string is truthy, and you have just reactivated the person who was fired four hours ago. Entra gets an HTTP 200. The job shows green in the customer's admin console. Nobody is paged. The terminated user keeps a live session and a valid refresh token until somebody notices. Three months later a SOC 2 auditor samples five terminations and asks for evidence of access revocation within 24 hours. That is the conversation.

Nothing about that bug is exotic. It is what happens when SCIM is treated as CRUD instead of as an integration with four clients that each read the same RFC differently.

SAML is the short part of the build and the long part of your risk

You will support two protocols. OIDC is straightforward: authorization code flow, discovery document, JWKS endpoint, done in days. SAML 2.0 is the one enterprises actually demand, and it is where the security work lives.

  • Verify the XML signature over the correct element, and reject a response where the assertion is unsigned or where a second unsigned assertion has been smuggled in. Signature wrapping is not theoretical. Parser differential bugs that were full authentication bypasses were found in ruby-saml in 2024 and again in 2025.
  • Enforce Audience, Recipient, NotOnOrAfter and InResponseTo, keep a replay cache of assertion IDs, and allow about 60 seconds of clock skew because on premise ADFS servers drift.
  • Decide deliberately about IdP initiated SAML. It has no InResponseTo, so it is a login CSRF vector by construction. Every enterprise buyer wants the Okta dashboard tile anyway. Pick a stance and write it down.
  • Handle signing certificate rotation. If you paste one PEM into a config row, you have scheduled an outage for whenever the customer's IdP rotates. Accept multiple valid certs and poll the federation metadata URL.
  • Never trust the email claim across connections. If you look up users by email globally, anyone who can stand up their own Okta tenant can assert cfo@yourbigcustomer.com and walk in. Bind every connection to verified domains and scope identities to an organization, not to an inbox.

Also pick your NameID format on day one. If you key accounts on emailAddress and the customer's IdP admin flips to persistent, every user in that org gets a brand new empty account on their next login.

SCIM 2.0 is three RFCs and four incompatible dialects

SCIM is RFC 7642, 7643 and 7644. Reading them takes a day. Discovering that Okta, Entra ID, Google Workspace and OneLogin each speak a different subset takes a quarter.

  • PATCH dialects. The spec defines add, replace and remove with an optional path. Okta commonly sends replace with a value object and no path. Entra sends a path. Both are legal. You need a real PATCH engine, not a switch statement, and it must treat "True", "False", true and false as the same two values.
  • Filters. The grammar has eq ne co sw ew pr gt ge lt le plus and or not and grouping. In practice you will see userName eq, externalId eq and displayName eq for groups. Do not hand roll a parser that splits on eq and interpolates into SQL. Use a filter parser and map it onto a whitelist of columns.
  • Pagination. startIndex is 1 based, not 0 based. This is the most common bug in first SCIM builds and it silently skips or duplicates one user per page.
  • Empty results. A filter matching nothing returns 200 with totalResults: 0, not 404. Return 404 and Entra counts it as an error.
  • Errors. Error bodies must be SCIM shaped, with schemas, status and scimType. A duplicate create is 409 with scimType: "uniqueness". Identity providers parse this. Your app's generic JSON error makes them retry forever.
  • Idempotency. They retry. If POST /Users is not deduplicated on externalId, one network blip gives you two accounts for one human, and group sync will fight over the duplicate for weeks.

Deprovisioning is the only part your customer's auditor reads

What does removal mean? Okta can be configured to send either DELETE /Users/{id} or a PATCH setting active to false, depending on whether the admin picked deactivate or delete. Entra normally sends the PATCH and, in most configurations, never sends a DELETE at all. Handle both, and do not honor DELETE literally. Hard deleting destroys the user's history, breaks foreign keys on every record they created, and removes the audit trail the auditor came for. Tombstone instead: mark inactive, keep the row, keep the external ID mapping so a rehire re-links rather than duplicates, and return 404 on the SCIM read afterwards so the IdP believes you.

Deactivation has to actually revoke. Setting a boolean is not revocation. The moment a user goes inactive you kill sessions, revoke refresh tokens, revoke personal access tokens and API keys they minted, and drop long lived sockets. Teams miss the API keys constantly.

Understand the latency you are promising. Okta pushes lifecycle events close to real time. Entra runs its provisioning job on an incremental cycle of roughly 40 minutes, and the first full sync of a large tenant can take hours. If your contract promises revocation within 15 minutes, SCIM alone cannot keep it for an Entra customer. Say that during the sales cycle, not after.

Then there is quarantine. If your SCIM endpoint fails a large share of requests for a sustained period, Microsoft quarantines the provisioning job, backs retries off to roughly once a day, and disables the job after about four weeks. One bad Friday deploy can silently stop provisioning for an entire customer, and they find out when a new hire cannot log in. Alert on SCIM error rate per connection, not aggregate 5xx.

Groups are a separate feature in both Okta and Entra, and both send only direct members. Neither expands nested groups. A customer who put everyone in a parent group will file a bug against you. And be blunt about the common shortcut: SAML JIT provisioning creates users on first login and never removes them. If you shipped JIT and called it provisioning, you have onboarding and no offboarding.

The expensive part is your user table, not the protocols

Most products key users on a globally unique email and attach them to a workspace. This breaks in three places at once.

You need a first class organization, a connection belonging to that organization, and an identity row per user per connection carrying external_id, the raw NameID or sub, and the source. Then the awkward case: a contractor in two customer organizations that both run SCIM. Org A deactivates them. If active lives on the user, you just locked them out of Org B, whose admin touched nothing. Membership state belongs on the membership, not the user.

Then linking. Forty people signed up with passwords over two years, the customer buys the enterprise plan, SSO goes on. Do you merge on verified email inside that connection's verified domains, or force a re-invite? Merging silently is how one person's account gets attached to another person's identity when an alias or shared mailbox is in play. If your app has no organization concept today, this is not an SSO project. It is a tenancy refactor with an SSO feature at the end.

Certification and test tenants, the calendar nobody budgets

You cannot test this with mocks. You need live tenants: an Okta developer org, an Entra tenant, Google Workspace if you sell there, and one on premise style IdP such as ADFS or Ping if you sell into finance or government. Each one you skip is a support ticket later. Listing is separate again: appearing in the Okta Integration Network means Okta reviews your app and requires you to pass their SCIM spec test suite, and the Entra gallery is its own review. Neither is hard engineering. Both are weeks sitting in someone else's queue, after the code is done.

What this costs and how long it takes

These bands are Digital Heroes delivery experience across more than 2,000 projects, not industry survey numbers.

A focused build inside an existing product runs $15,000 to $60,000. The bottom is a product that already has organizations, memberships and a clean role model and needs SAML plus OIDC plus SCIM Users for two identity providers. The top is that scope plus group to role mapping, migrating existing password users, and certification with Okta and Entra.

As part of a first release, where identity is designed in rather than retrofitted, budget $50,000 to $130,000 over 10 to 16 weeks. Building it into the schema on day one is genuinely cheaper than adding it later.

A full platform, meaning multi org identity, SCIM Users and Groups, group driven roles, session policy, per connection audit logging with exportable evidence and listings in both directories, is $150,000 to $350,000 over 6 to 12 months.

What drives this specific capability's number up, in order:

  • No organization concept in the schema. The biggest multiplier by far. It turns a 4 week feature into a 12 week refactor of nearly every query.
  • Group mapping against a custom permission model. Three IdP groups to three flat roles is a day. Nested groups to a resource scoped permission matrix is a project.
  • Number of identity providers. The second costs about 60 percent of the first, the fourth another 30 percent, and it never reaches zero because vendors ship behavior changes.
  • Existing users to migrate and link.
  • Compliance evidence: immutable provisioning logs, retention, and an export an auditor accepts.
  • Maintenance. Provisioning breakage is always urgent because it blocks a new hire.

When you should not build this

Most teams should not build SCIM. SSO is a three week problem with a known shape. SCIM is a multi year tail of other people's quirks.

Under roughly 20 enterprise connections, buy directory sync and usually buy SSO with it. WorkOS lists SSO and Directory Sync at $125 per connection per month each at the time of writing, so 20 connections with both is around $60,000 a year, roughly one build, with someone else absorbing every Entra behavior change. Auth0, Frontegg, Stytch and Descope sit in the same space on quote based enterprise pricing. If you must self host, BoxyHQ SAML Jackson is open source and does SAML and directory sync, and SSOReady is open source for SAML.

Check two traps first. AWS Cognito federates SAML and OIDC but is not a SCIM server, so it does not solve provisioning at all. Keycloak has no SCIM server built in either, only community extensions. Teams pick both thinking identity is handled and find out during their first enterprise deal.

Build it yourself when per connection cost crosses build plus maintenance, which in our experience is somewhere north of 100 connections, or when you have data residency or air gap requirements a vendor cannot meet, or when your permission model is unusual enough that you would write the hard half anyway.

One more thing worth asking. If exactly one customer is demanding SCIM, find out what their auditor actually needs. Sometimes the requirement is evidence of access revocation within 24 hours, and a nightly sync from their HR (Human Resources) system plus a termination webhook satisfies it. We have watched a $40,000 SCIM scope disappear in a 20 minute call with a customer's compliance lead.

How to brief and vet a developer for this

Brief with facts, not with the word SSO. Name the identity providers you must support and who asked for each. State whether you need Groups or only Users. State your revocation SLA in minutes. Say whether your database has an organizations table today and hand over the schema. Say how many password users exist. Say whether you need an Okta Integration Network listing and by when.

Then ask these and listen for specifics:

  • "How do you handle a SCIM PATCH where active arrives as the string False?" Anyone who has shipped this has the scar.
  • "Is startIndex 0 or 1 based?" One right answer, immediately, no hedging.
  • "What do you return for a filter that matches nothing?" Should be 200 with totalResults 0, instantly.
  • "What happens on DELETE /Users/{id}?" If they say they delete the user, they have never survived an audit.
  • "How do you handle IdP signing certificate rotation?" Wrong: the customer emails us the new cert. Right: metadata URL polling and multiple valid certs.
  • "What is your position on IdP initiated SAML?" A shipped engineer has an opinion about InResponseTo. A beginner does not know the flow exists.
  • "A contractor is in two customer orgs. Org A deactivates them. What happens in Org B?" This tests the data model, which is where the money is.
  • "What is Entra provisioning quarantine and how would we find out we are in it?" Tests whether they have operated this, not just built it.
  • "Show me the error body you return for a duplicate create." They should say scimType uniqueness without looking it up.

If someone quotes SSO and SCIM as a two week fixed price without asking to see your users table, they are quoting the login button. The login button is not the project.

Research & sources

The evidence behind this guide

Independent findings on why this investment pays off. Every link goes to the primary source.

  1. The federal government spends about 80% of its IT budget on operations and maintenance of existing systems rather than on development or modernization, with many critical systems being decades old. Source: U.S. Government Accountability Office (GAO) (2025) →
  2. OECD research finds that digitalisation offers SMEs opportunities to improve performance, spur innovation, enhance productivity and compete more evenly with larger firms; it reports that increased use of online platforms produced significant multi-factor productivity gains in SME-heavy sectors such as hospitality and retail, while smaller firms lag in adoption due to skills, resource and financing gaps. Source: OECD (2021) →
  3. SMS reminders that stated the specific cost of the appointment to the health system reduced missed appointments in Trial One, with the DNA (did-not-attend) rate falling from 11.1% (control) to 8.4% (specific-costs message) - an odds ratio of 0.74 (95% CI 0.61-0.89), i.e. roughly a 24-26% relative reduction - at no additional cost. (Trial Two replicated this at an 8.2% DNA rate.). Source: PLOS ONE (Hallsworth et al.) (2015) →
  4. PMI's Pulse of the Profession research found organizations waste an average of roughly 9.9% of every dollar invested in projects due to poor performance - equivalent to about $1 million wasted every 20 seconds collectively worldwide. Source: Project Management Institute (PMI) (2018) →
Rohan Malhotra · Enterprise Software Consultant

Rohan advises mid-market and enterprise teams on ERP, CRM and custom software, and has led delivery on dozens of business-software builds.

Writes for Digital Heroes, shipping business software for 2,000+ brands across 55+ countries since 2017.

FAQ

Frequently asked questions

How much does it cost to add SSO and SCIM to an existing app?
Typically $15,000 to $60,000 for a focused build inside a product that already has organizations, memberships and roles. The bottom of that band is SAML, OIDC and a SCIM Users endpoint for two identity providers. The top adds group to role mapping, migrating existing password users, and certification with Okta and Entra. If your schema has no organization concept, the real number is higher because you are paying for a tenancy refactor first.
How long does it take to build SSO and SCIM?
SSO alone is about 3 weeks for SAML and OIDC done properly, including signature verification, replay protection and certificate rotation. SCIM adds another 4 to 8 weeks because each identity provider speaks a different dialect and you have to test against live tenants. As part of a first release, budget 10 to 16 weeks end to end.
Can you add SCIM to our existing app without rewriting it?
Usually yes, if you already have organizations and memberships as separate concepts from users. The blocker is a schema where users are keyed on a globally unique email with no organization layer, because SCIM active status has to live on the membership, not the user. Send the schema before anyone quotes, since that single fact moves the estimate more than the protocols do.
We have $30,000 for SSO and SCIM. What does that actually buy?
At $30,000 you get SAML plus OIDC login, a SCIM Users endpoint with proper PATCH handling and tombstoned deprovisioning, and certification against two identity providers, assuming your organization and role model already exists. It does not buy SCIM Groups with role mapping, a password user migration, or Okta Integration Network listing. If your app has no organizations table, $30,000 covers the tenancy work and not much else.
Is $150,000 or more for SSO and SCIM ever justified?
Yes, when identity is the product surface rather than a login button. That band covers multi organization identity, SCIM Users and Groups feeding a custom permission model, per connection audit logging with evidence an auditor accepts, session policy, and listings in both the Okta and Entra directories. Below roughly 20 enterprise connections, buying directory sync at around $125 per connection per month is the cheaper answer.
Should we use WorkOS or another third-party service instead of building?
For most teams, yes, at least for SCIM. WorkOS lists SSO and Directory Sync at $125 per connection per month each at the time of writing, so 20 connections cost around $60,000 a year and someone else absorbs every identity provider behavior change. Build it in house once per connection cost crosses build plus maintenance, which we see somewhere north of 100 connections, or when data residency or an unusual permission model rules the vendor out.
What breaks at scale with SCIM?
Retries and quarantine. Identity providers retry aggressively, so a POST to /Users that is not deduplicated on externalId gives you two accounts for one person after a single network blip. If your endpoint returns errors at a high rate for a sustained period, Microsoft quarantines the provisioning job, backs retries off to roughly once a day, and disables it after about four weeks, which silently stops provisioning for an entire customer. Alert on SCIM error rate per connection, not aggregate 5xx.
Do we need SCIM if we already have SAML JIT provisioning?
Yes. JIT provisioning creates a user on first login and never removes one, so you have onboarding and no offboarding. The thing a security reviewer tests is whether access disappears after termination, and JIT cannot do that. Some customers will accept a termination webhook or a nightly sync instead, so ask their compliance lead before scoping SCIM.
Which identity providers do we have to support?
Okta and Microsoft Entra ID cover most enterprise deals, and Google Workspace is common in tech companies. Add ADFS or Ping only if you sell into finance, healthcare or government, since on premise providers bring clock drift and older SAML behavior. Each additional provider costs real money, roughly 60 percent of the first for the second, so make the list based on signed deals rather than on hopes.
Is it cheaper to customize Salesforce than to build a custom CRM from scratch?
If you use less than a third of what Salesforce does, a custom CRM is often cheaper by year three. Salesforce Enterprise lists at $165 per user per month, so 25 seats cost about $49,500 a year before admin and consultant fees, while a focused custom CRM runs $60,000 to $100,000 once plus 15 to 20% a year in maintenance. If you genuinely need Salesforce's ecosystem, reporting, and app marketplace, customizing it beats rebuilding it; the mistake is paying enterprise prices to use it as a glorified contact list.
How do I work out whether custom software will pay for itself?
Do the arithmetic on hours before anything else: if the system saves three staff eight hours a week at a $35 loaded hourly cost, that is about $43,700 a year against, say, a $70,000 build plus 15 to 20% annual maintenance, a payback around two years. Add revenue effects only if you can name them specifically, like faster quotes or fewer abandoned orders, not as vague growth. In our delivery experience the businesses that see payback inside 24 months are the ones automating a process they already measure.
Is a solo freelancer enough for my project, or do I really need an agency?
A solo freelancer is a fine choice for a well-defined build under roughly $15,000 to $20,000 with a limited lifespan: an internal calculator, a scripted integration, a prototype. Above $50,000, or for any system your business will depend on for years, you are buying continuity as much as code: enforced code review, cover when someone is ill, and support that outlasts one person's career plans. Price the risk of a single point of failure, not just the hourly rate.
We run everything on Airtable and spreadsheets. When is it time to go custom?
The switch usually makes sense when you hit one of two walls: Airtable's record caps (125,000 records per base on the Business plan) or logic the tool cannot express, like multi-step approvals with conditional pricing. There is also a simple cost signal: 25 people on Business at roughly $45 per seat per month is about $13,500 a year, forever, for a tool you are already fighting. Custom is worth it when the workflow is core to how you make money; for peripheral processes, staying on Airtable is the right call.
Should I ask for a fixed price or pay the agency hourly?
Fixed price for the first version, hourly or retainer for what comes after launch. A fixed-scope, fixed-price V1 puts the estimation risk on the agency, which is exactly where you want it while trust is unproven; hourly billing on an unscoped greenfield build is a blank check. After launch, flip it, because maintenance and small features arrive unpredictably and fixed-pricing every ticket wastes everyone's time.
Couldn't I just build my app in Bubble or another no-code tool instead of hiring an agency?
For validating an idea with real users, yes, and we tell clients that honestly. The walls come later: Bubble apps cannot be exported as code to run anywhere else, performance drops on complex data operations, and usage-based pricing climbs as you grow. A meaningful share of Digital Heroes custom builds are rebuilds of no-code MVPs that proved the business worked, which is the system operating as intended: validate cheap, then build the version that scales.
What is the biggest mistake first-time software buyers make?
Choosing the lowest quote without asking why it is the lowest. A bid 40% under the field usually gets there by skipping tests, documentation, and code review, which are invisible in a demo and brutal to pay for later; every stalled project Digital Heroes has been asked to rescue tells some version of that story. The second mistake is signing without a written scope, which reliably turns the winning cheap quote into 1.5x to 2x the price by launch.
How many SaaS seats do we need before building custom becomes cheaper?
The crossover usually shows up between 20 and 50 seats on premium tiers. Salesforce Enterprise lists at $165 per user per month, so 40 users cost about $79,000 a year in subscriptions, which is real money against a custom system you would own outright. Run the comparison over three years: if subscription spend beats the build cost plus 15-20% annual maintenance, custom wins on price before you even count workflow fit.
How much should a small business expect to pay for custom software?
Across 2,000+ Digital Heroes projects, a small business system that replaces spreadsheets or one core workflow typically lands between $40,000 and $80,000, with more complex first versions running up to $150,000. The two levers that move the number most are integrations and user roles, not the team's hourly rate. Any quote under $15,000 for a full production system means the vendor has not understood your scope yet.
If an agency builds my software, who actually owns the code?
You should own everything, assigned in writing: the contract transfers full IP to you on final payment, the code lives in your GitHub organization, and hosting runs in cloud accounts you control. The red flag is a proposal that mentions the agency's proprietary platform or framework, which usually means you are renting, not buying. Digital Heroes structures every build this way precisely so a client can fire us and lose nothing but the relationship.
Who owns the code when an agency builds my software?
You should, completely, through a written intellectual property assignment that transfers everything on final payment; without that clause, copyright stays with whoever wrote the code by default. Insist that the repository lives in your own GitHub organization from day one and that hosting, domains, and third-party accounts are registered to you. Also check for licenses to the agency's proprietary frameworks buried in the contract, because those can make switching vendors practically impossible even when you own your own code.
Keep reading
let's build

Build something worth launching.

A plan, a team, a timeline, within 24 hours. No decks, no discovery calls. Tell us what you're building and we'll come back with a real scope and a real number.

message us directly · we reply within one business day

mission briefing

Monthly dispatch

Playbooks, real build costs, and what we're shipping. One email a month. No fluff.

visit us

New York HQ

1140 Broadway, Suite 704 · New York, NY 10001

Get directions
Online now

Hey there 👋 How can we help you today?