Solution — Web Development
The customer's screen and your operator's screen should be looking at the same record
Most customer portals are built as a second system that talks to the first one. Then there are two identifiers for one order, two status vocabularies, a nightly job that quietly drops records, and a standing argument about which side is right.
KodDelta builds customer-facing web applications on the same data model as the internal system behind them, so an order a customer places is the same record your staff work on. Where field or customer use requires it, the app works offline and syncs later. A first module is $3,000–6,000 over 2–4 weeks.
Three different things get called "a website"
The word covers work with very different costs and risks, and the first useful step is separating them.
- A corporate site and campaign pages. Content that has to load fast, be found, explain what you do and capture an enquiry into a database rather than into an inbox. Largely a publishing and performance problem.
- A customer or partner application. Authenticated screens where someone outside your company does something real: places an order, tracks a job, uploads a document, approves a quotation. This is a software problem wearing a website's clothes, and it belongs on the same data as your internal system.
- A field or mobile application. The same idea aimed at people working away from a desk, where the phone, the camera and the absence of a signal set the design.
The mistake that costs the most is treating the second and third as if they were the first. A portal built as a website with a database bolted on will work for six months and then start disagreeing with the system it was supposed to reflect.
Why the customer app should share the internal data model
The principle is simple: the customer's screen and the operator's screen are two views of one record, with different permissions. Not two records kept in step.
What that means in practice:
- One identifier for an order, a job or a case, quoted the same way by the customer and by your staff
- One status vocabulary, with the customer view showing a subset rather than a translation
- A change made by an operator is visible to the customer immediately, with no integration involved
- Permissions decide what each side sees, on the same tables, so an internal cost field simply is not returned to a customer session
- One audit trail covering both sides, which is what settles a dispute about who changed what and when
- New fields are added once, not twice with a mapping between them
The alternative is a portal with its own database and a synchronisation job. That design has a predictable set of failures: duplicate identifiers, statuses that do not map cleanly in both directions, a record created on one side while the other is unavailable, and drift that nobody notices until a customer quotes a number your staff cannot find. If you already run that arrangement, the way out is described in the migration guide.
There is one legitimate reason to separate them: when exposing the internal database to the public internet is unacceptable on security grounds. The answer then is not a second system with a two-way sync, but a read model — a defined, minimal subset published outward, with writes coming back through a narrow, validated interface. The cost of separation is accepted deliberately, for a stated reason, rather than arrived at by accident.
Offline working, and what it really costs
Offline capability is asked for casually and is not casual to build. It roughly doubles the complexity of everything on the write path, so it is decided at the start of the design rather than added later. Here is what it actually involves.
What is cached, and what is not
The application stores the reference data it needs and the user's own working set: a technician's assigned jobs, the relevant part catalogue, the forms. Not the whole database. Deciding that working set is a business question, because it defines what the person can still do when the signal is gone.
Queued writes and replay
Entries and photographs made offline are stored on the device and replayed when the connection returns. The user sees a clear queue state — pending, sent, failed — rather than assuming the work is saved somewhere.
Idempotency on the server
A queued request may be replayed after a partial failure. The client therefore generates the record identifier, and the server treats a repeat of the same identifier as the same record. Without this, a poor connection produces duplicate jobs and duplicate stock movements.
Conflict handling
Two people editing the same record, one of them offline, is normal rather than exceptional. Last-write-wins silently destroys work, so records are versioned, independent fields are merged, and a genuine conflict is shown to a person with both versions and a choice.
Ordered actions
Some sequences only make sense in order: approve then dispatch, receive then consume. Queued actions are replayed in sequence, and one that no longer makes sense against the current state is rejected with a reason the user can act on, not applied anyway.
What cannot be offline
Anything needing a live check: stock reservation, credit limit, payment authorisation, a price that depends on current terms. Offline entry of those is provisional and labelled as provisional, confirmed when it syncs. Pretending otherwise is how a customer gets told something is reserved when it is not.
Which of these you need depends on the work. A customer checking an order status needs none of it. A technician in a lift shaft or an engineer in a basement needs all of it. The choice between a progressive web app and a native one is worked through in PWA or native app.
Separate application, or another screen of the system you have?
This is the decision that most affects the budget, and it is decided by the audience and the conditions rather than by preference.
| Criterion | Another screen of the existing system | Separate customer-facing application |
|---|---|---|
| Who uses it | Internal staff, already trained on the system | Customers, dealers, subcontractors — outside your organisation |
| What they may see | Internal fields are acceptable; permissions handle the rest | Internal cost, margin and notes must never be returned to the session |
| Identity | Your existing staff accounts | A separate identity space with its own registration, reset and lockout rules |
| Conditions of use | Laptop, office, connected | Phone, field, intermittent signal, one hand free |
| Frequency and depth | Occasional, by someone who knows the whole system | Frequent, narrow, by someone who will never be trained |
| Cost | Lowest — no second interface to maintain | Higher build and a second surface to keep secure |
Read plainly: if the users are internal, always online and on a laptop, add the screen. Building a separate application for an internal, occasional, connected task gives you a second thing to maintain and nothing else. The dealer-facing version of this decision is worked through on dealer portal, and the field version on field service.
The public site, treated as engineering
The corporate site and campaign pages are a smaller problem than the applications, but they have their own failure modes and they are worth stating without inflation.
- Speed against a published standard. We build against Google's published Core Web Vitals thresholds — largest contentful paint under 2.5 seconds, interaction to next paint under 200 milliseconds, cumulative layout shift under 0.1 — and measure the real pages rather than a development machine. We will not quote you a conversion percentage we have not measured on your traffic.
- Enquiries stored, not just emailed. Every submission is written to a database first and notified second. Email-only forms fail silently, and the failure is discovered by a customer asking why nobody replied.
- Structured data that matches the page. Schema markup describing what is actually on the page, including questions and answers that appear on screen rather than only in the markup.
- Content your team can edit. Articles and case pages editable without a developer, through a lightweight content layer rather than a plugin stack that needs weekly patching.
- No licence attached to the design. Templates, styles and code are yours. Hosting is included for the first year and is a modest annual figure after that; the bands are on pricing.
When we would tell you not to build this
- The internal system does not exist yet. A customer portal over a process still run on spreadsheets exposes the spreadsheets. Build the operational system first; the customer view is then a small addition.
- Nobody will use it because nothing changes for them. If customers can already get an answer by messaging your team in thirty seconds, a portal has to be better than that, not merely available. Design the reason to use it, or do not build it.
- A brochure site is all you need. If the site's only job is to exist and be found, say so and keep it small. We would rather build the right small thing than a portal nobody signs into.
- Offline is a wish, not a requirement. If your users are on a warehouse floor with reliable Wi-Fi, offline complexity buys nothing. Ask where the work actually happens before paying for it.
- The requirement is a marketplace or a consumer shop at scale. Established platforms handle that well, and the honest comparison is on package versus custom.
How a build starts
-
Decide the data model question first
Same database with permissions, or a published read model with a stated security reason. Everything else follows from this answer, and changing it later is the expensive kind of change.
-
Name the tasks, not the pages
What does the customer or the technician need to complete, in how many taps, in what conditions? A page list is a layout. A task list is a specification.
-
Prototype in the first 2 weeks
Clickable screens with real data, tested on the device the work actually happens on. If it is a phone in a stairwell, it is tested on a phone in a stairwell.
-
First module in production, 2–4 weeks
At $3,000–6,000, narrow enough to be real: usually order or job status, documents and requests. A wider application with several roles, offline capability and integrations is $8,000–15,000 over 4–8 weeks.
The source code is delivered to you, the licence is perpetual with unlimited users, and maintenance is optional at 12–25% of build cost. Applications we have built on this pattern include Elevatora SAHA, a multi-tenant lift maintenance and field service system with mobile use in the field, Elevatora İMALAT, a manufacturing and ERP system for lift components, SEMP Group, a group-wide operations platform, SmartHukuk, our own legal technology product, and a pharmaceutical import and export process tracking system; Elevatora PROJE is in development. See cases and custom software.
Frequently Asked Questions
What does it mean for a customer app to share the data model of the internal system?
It means the customer application is another set of screens and permissions over the same database, not a second system kept in step by a sync job. When a customer places an order it becomes the same record your staff open, with one identifier and one status. When an operator changes that status the customer sees the change without anything being copied. The alternative, two systems with a bridge between them, introduces duplicate identifiers, statuses that do not map cleanly, and a recurring question about which side is right.
How does offline working actually behave in a web app?
The application caches the reference data and the user's own working set, not the whole database, so a technician carries their assigned jobs and the relevant catalogue rather than every record. Entries made offline are queued locally with photographs and replayed when the device reconnects. The server has to be idempotent so a replayed request cannot create a duplicate, which is why the client generates the record identifier. Anything requiring a live check, such as stock reservation or a credit limit, is provisional until it syncs, and the user is told that on screen.
What happens if two people change the same record while one of them is offline?
That conflict has to be designed for, and last-write-wins is the wrong default for business data because it silently discards work. Records are versioned, changes are merged per field where the fields are independent, and where they are not the conflict is shown to a person with both versions and a choice. Actions whose order matters, such as approve then dispatch, are replayed in sequence or rejected with a clear reason rather than applied out of order.
When do we need a separate application rather than another screen of the existing system?
A separate application is justified when the audience is outside your organisation and must not see internal fields, when sign-in belongs to a different identity space, when the device and the working conditions are different, such as a phone in the field with no signal, or when one task needs to be radically simpler than the administrative interface around it. Another screen of the existing system is enough when the users are internal, always online, working on a laptop, and the task is occasional. Building a separate app for an internal, occasional, always-online task adds a second thing to maintain for no benefit.
Progressive web app or native mobile app?
A progressive web app suits most business applications: forms, lists, photographs, barcode scanning through the camera, offline caching and an icon on the home screen, from a single codebase you update without a store review. A native app becomes necessary for continuous background location, deep hardware or peripheral integration, heavy offline media, or when distribution through an app store is itself a requirement. We start from the web app unless one of those applies, because it is cheaper to build, cheaper to change, and reaches every device.
What does a web application cost and how long does it take?
A focused module, for example a customer portal covering order status, documents and requests on top of an existing system, is $3,000–6,000 and reaches production in 2–4 weeks, with a clickable prototype in the first 2 weeks. A wider application with several roles, offline capability and integrations is $8,000–15,000 over 4–8 weeks. The source code is delivered to you, the licence is perpetual with no per-user fee, hosting is included for the first year and annual maintenance is optional at 12–25% of build cost.
Tell us what your customer needs to do, and where they will be standing.
We come back with whether it is a screen of your existing system or a separate application, whether offline is genuinely needed, and what each option costs.