8 min read · March 27, 2026
Your customers are asking for custom fields. Your engineering team estimates 3-6 months. Product keeps deprioritizing it because there's always something more urgent.
This is the build-vs-buy decision. Here's the data.
| Phase | Estimated Time | Actual Time (3-4x rule) |
|---|---|---|
| Database design (EAV, JSONB, or extension tables) | 2-4 weeks | 6-12 weeks |
| Validation engine | 1-2 weeks | 3-6 weeks |
| Field editor UI | 2-4 weeks | 6-12 weeks |
| Multi-tenant isolation | 1-2 weeks | 3-6 weeks |
| API endpoints | 1-2 weeks | 3-6 weeks |
| Testing and edge cases | 2-4 weeks | 6-12 weeks |
| Total | 9-18 weeks | 27-54 weeks |
The total cost of building is typically 3-4x the original estimate once you account for development, maintenance, security, and training.
Source: Appinventiv - Build vs Buy
After the initial build, maintenance costs 15-20% of the build cost annually. That includes:
"Ongoing maintenance, security updates, and scaling efforts add to the total cost of ownership" - Joyfill
Every sprint your team spends on custom fields infrastructure is a sprint not spent on:
| Service | Monthly Cost | What You Get |
|---|---|---|
| Kopra Free | €0 | 3 field groups, 10 tenants, 5K API calls |
| Kopra Starter | €29 | 10 field groups, 100 tenants, 50K API calls |
| Kopra Pro | €99 | 25 field groups, 500 tenants, 200K API calls |
Integration time: hours, not months. Maintenance: zero (the service handles it).
Build if ALL of these are true:
Buy if ANY of these are true:
71% of tech teams choose off-the-shelf solutions to accelerate time-to-value. For teams under ~100 engineers, the math rarely favors building infrastructure.
Source: Chameleon - Build vs Buy
With Kopra, the integration is:
1. Your backend generates a token (one API call):
curl -X POST https://api.kopra.dev/api/auth/token \
-H "X-API-Key: kp_your_key" \
-H "Content-Type: application/json" \
-d '{"tenantId": "tenant-123", "fieldGroupKey": "customer"}'2. Your frontend loads the SDK (5 lines):
import { KopraSDK } from '@kopra-dev/sdk';
const sdk = new KopraSDK({
currentTenant: 'tenant-123',
getToken: async (req) => {
const res = await fetch('/api/kopra-token', {
method: 'POST',
body: JSON.stringify(req),
});
return res.json();
},
});
await sdk.loadCustomFields('container', {
fieldGroupKey: 'customer',
entityId: 'contact-42',
});3. Your customers configure their own fields. No engineering tickets.
That's it. Your team ships this in an afternoon and moves on to the work that actually differentiates your product.
Try Kopra free - no credit card required.