Skip to content
SKSuraj Kumar

Agency operations

NexviaTech Platform

Agency platform

The platform a technology services business runs on: enquiries, proposals, project tracking and the public site, in one codebase.

  • Business software
  • Agency platform
  • Proposals
  • Project tracking
  • Client project
Role
Sole engineer. Public site, internal platform, data model and deployment. Written against how the business actually sells and delivers work.
Work type
Client project
Timeline
Ongoing · 2024—2026
Status
Ongoing engagement
Industry
Technology services
Client
NexviaTech

Interface built in code for this case study — not a client screen capture.

01Business problem

What was actually going wrong

A services business loses more time to its own admin than to the work. Every enquiry becomes a document written from scratch, and no two documents agree with each other.

Who feels it

  • Whoever answers enquiries and has to guess what has already been said
  • Anyone writing a proposal from an inconsistent set of previous ones
  • Clients asking for a status update mid-project
  • The business, which cannot see which kinds of enquiry actually convert

The pattern in small technology services companies is consistent. Enquiries come from four or five places — a form, an email address, a WhatsApp number, a referral, sometimes a phone call — and they all end up in different inboxes. The first response is often the slowest part of the whole engagement, not because nobody cares but because nobody is sure whose turn it is.

The second cost is proposals. Each one is written by copying the last one and editing it, which means scope language, exclusions and payment terms drift apart over time. By the tenth proposal there are four different versions of the same paragraph in circulation, and the one a client signed is whichever copy happened to be open that week.

The third is delivery visibility. Once work starts, status lives in messages. A client asking "where are we" triggers a small internal investigation, and the answer given is usually optimistic because it is assembled from memory rather than from anything recorded.

None of this is a software gap in the abstract sense. It is a gap between a public website that generates interest and an internal process that has no system underneath it.

02Product overview

What got built

One codebase carrying the public site and the platform behind it, so an enquiry that arrives on the website becomes a tracked record without anybody retyping it.

Engineering notes

  • Public site and internal platform on one data layer, removing the copy step at the top of the funnel.
  • Enquiry normalisation across form, mail and referral routes with the source captured at write time.
  • Model summarisation placed after persistence and outside the acknowledgement path, so it cannot delay a client reply.
  • Summary output split into stated, missing and inferred, which stopped confident invention on vague enquiries.

The public site and the internal platform share a deployment and a data layer. That is unusual for an agency site — the normal arrangement is a marketing site somewhere and a CRM somewhere else, joined by copy-paste — and it is the single decision that removes the most manual work, because the enquiry form writes directly to the record that the rest of the process reads.

Proposals are assembled from a block library rather than written from a previous file. Scope sections, exclusion clauses, payment terms and timelines are stored once and composed per proposal, with the composed output frozen when it is sent. Editing a block afterwards updates the library for future proposals and leaves every sent document exactly as the client received it.

Project tracking is deliberately shallow. There are phases with dates, deliverables with states, and a note thread. There is no burndown, no time tracking, no resource allocation. A business of this size does not have a capacity planning problem; it has a "what did we tell the client, and is it still true" problem, and those are solved by different software.

Language handling is the part visitors notice least and I spent the most time on. The public site had to serve content that changes without a redeploy, which meant treating page content as data and building the editing path for it, rather than shipping a site that requires an engineer for a price change.

On AI: there is one place in this platform where a model is involved, and it is narrow — turning a long unstructured enquiry into a short structured summary so the first responder can see what is being asked before reading three paragraphs. It runs after the record is already saved, its output is stored as a suggestion beside the original text rather than replacing it, and if it fails the record is unaffected. Nothing else here is model-backed, and describing the platform as AI-powered would be inaccurate.

03Key features

What the software does, feature by feature

8 capabilities, of which 1 are model-backed. The rest are ordinary deterministic software, and the distinction is marked so the AI claim stays honest.

  • 01

    Every enquiry route lands in one place

    The website form, the published email address and the referral path all create the same record shape, with the source recorded. First response time stopped depending on which inbox someone happened to open.

  • 02

    Enquiry triage with an ownership state

    New, claimed, quoted, won, lost, dormant — with one owner at a time. The states are few on purpose: a pipeline with eleven stages gets maintained for two weeks.

  • 03

    Structured summary of a long enquirymodel-backed

    A model condenses a wall of text into what is being asked for, what is not specified, and the apparent budget signal. It sits beside the original message, never in place of it.

  • 04

    Proposals composed from a block library

    Scope, exclusions, terms and timelines are stored once and assembled per proposal. The inconsistency that comes from copying last month’s document is structurally impossible.

  • 05

    Sent proposals are frozen

    The composed document is snapshotted at send. Later edits to a block affect future proposals only, so what a client agreed to stays exactly what they agreed to.

  • 06

    Project phases with visible deliverable state

    Phases with dates and deliverables with states, so a status question is answered by opening a page rather than by asking three people.

  • 07

    Site content editable without a deploy

    Services, pricing structure and case content are data, not JSX. Copy changes do not require an engineer, which is the difference between a site that stays current and one that quietly goes stale.

  • 08

    Enquiry source reporting

    Which routes produce enquiries, and which of those reach a proposal. Counts of the business’s own records — no attribution modelling, and nothing inferred.

04User flow

How a person moves through it

The path from the trigger to the finished record, with each step attributed to whoever performs it — a person or the system.

  1. 01VisitorSubmits the enquiry form on the public site, or writes to the published address.
  2. 02SystemCreates the enquiry record with its source and an acknowledgement to the sender.
  3. 03SystemGenerates a structured summary beside the original text; failure here does not block anything.
  4. 04TeamClaims the enquiry, which sets ownership and removes it from the unassigned queue.
  5. 05TeamComposes a proposal from library blocks, adjusts scope, sends it.
  6. 06SystemFreezes the sent version and links it to the enquiry.
  7. 07TeamOn acceptance, opens a project with phases carried over from the proposal timeline.
  8. 08ClientSees phase and deliverable state instead of asking for an update.

05Architecture

How it is put together

The processing path first, then the layers it runs on, then the constraints that shaped both.

Path through the system

6 stages

  1. 01

    Capture

    Public form and inbound mail normalise to one enquiry shape. Source is recorded at capture because it cannot be reconstructed later.

  2. 02

    Acknowledge

    Immediate automated reply to the sender. Separate from the summary step so a model outage never delays the only message the client is waiting for.

  3. 03

    Summarise

    Structured condensation of the enquiry text, stored as a suggestion with the model and prompt version alongside it. Strictly non-blocking.

  4. 04

    Triage

    Ownership claim and state transition. Unassigned enquiries surface by age, not by size, so nothing sits because it looked small.

  5. 05

    Propose

    Blocks composed into a document, priced, then snapshotted on send with a version identifier.

  6. 06

    Deliver

    Phases and deliverables derived from the accepted proposal timeline, with the client-visible view generated from the same records the team edits.

Layers

Public
Marketing pages from content recordsEnquiry formClient status view
Internal
Enquiry queueProposal composerBlock libraryProject board
Domain
EnquiryProposal with frozen versionsBlockProjectPhaseDeliverable
Platform
Shared data layerTransactional mailRole-based accessOne deployment

Why it is shaped this way

  • The public site and the internal platform share a data layer rather than integrating across one. Integration between a marketing site and a CRM is the seam where enquiries get lost.
  • The model step is downstream of persistence and non-blocking. Anything that can be unavailable must not sit between a client and their acknowledgement.
  • Proposal snapshots are immutable and content-addressed by version. A quoted price that can change retroactively is a legal problem, not a UX one.
  • Content is data, so the site can be updated by the people who know what changed. The engineering cost of that path is repaid the first time a price moves.

06Technical decisions

The choices that mattered, and what each one cost

Every decision here was contested by a reasonable alternative. The trade-off column is the part usually left out.

01

Put the public site and the internal platform in one codebase

Why

The enquiry form is the top of the funnel and the enquiry record is the rest of it. Splitting them across two systems guarantees a manual copy step at the most important moment.

Trade-off

The marketing site now inherits the platform’s deployment discipline, so a copy change goes through the same pipeline as a schema change. Acceptable at this size; it would not scale to a large marketing team.

02

Compose proposals from blocks instead of duplicating documents

Why

Copy-and-edit is how contradictory scope language spreads. A library makes the terms singular and the composition explicit.

Trade-off

Blocks have to be written to stand alone, which is harder than writing prose in place, and a genuinely bespoke proposal needs an escape hatch — so there is one, and it is used sparingly.

03

Freeze the document at send rather than rendering it live

Why

A proposal is a commitment. Rendering it from current blocks would mean the version a client re-opens next month is not the version they read.

Trade-off

Storage of near-duplicate documents, and a fix to a typo in a sent proposal requires issuing a revision instead of editing quietly. That is the correct behaviour and it is occasionally inconvenient.

04

Keep the model to one narrow, non-blocking step

Why

The only place a model was clearly better than a form field was condensing long unstructured enquiry text. Everywhere else in this platform, deterministic code is more accurate and cheaper.

Trade-off

It would be easy to market this platform as AI-driven and it is not. Being specific about where the model is used costs a marketing line and buys the ability to answer a technical question honestly.

07Challenges

What was genuinely difficult

Not the setup work. These are the problems where the first implementation was wrong and had to be reconsidered.

01

The first proposal composer produced documents that read like assembled parts.

Approach

Rewrote the blocks to carry their own transitions and added per-proposal connective fields, then tested by reading finished documents aloud rather than by reviewing the block list.

Outcome

Composed proposals stopped sounding mechanical. The block library only works if nobody receiving the output can tell it exists.

02

Enquiry summaries were confidently wrong on vague messages.

Approach

Split the output into what was stated, what was missing, and what was inferred — with the inferred section explicitly marked. A vague enquiry now produces a long "not specified" list instead of an invented brief.

Outcome

The summary became useful precisely because it stopped filling gaps. It tells the responder which questions to ask.

03

The public site got slower every time content moved into the data layer.

Approach

Moved content resolution to build time with an on-demand revalidation path for edits, rather than fetching content per request.

Outcome

Editable content without a per-request cost. The marketing pages render as static output while remaining changeable by a non-engineer.

08Business value

What it changes for the business

Stated qualitatively on purpose. Invented percentages are the easiest thing to put on a portfolio and the easiest thing to see through.

Operational effect

  • Every enquiry has one record and one owner, regardless of which route it arrived by.
  • Proposal language is consistent because it is stored once rather than copied.
  • What a client agreed to is retrievable exactly as they received it.
  • A status question is answered from records rather than reconstructed from memory.
  • The business can see which enquiry routes actually lead to proposals, from its own data.

What would change at scale

  • The shared data layer between public and internal is right for one team and wrong for two. With a separate marketing function it would need a content API boundary.
  • Proposal snapshots grow without bound. They are small, but at volume they need archival rather than living in the primary store forever.
  • Enquiry triage is manual by design. Past a few dozen a week it would need routing rules, and the temptation would be to let the model do the routing — which would put an unreliable step in a path that currently cannot fail.

09Interface

The screens where the work happens

Dense operational views rather than dashboards. These are used for hours at a time, so the priorities are legibility, keyboard flow and state that is never ambiguous.

Enquiry queue

Unassigned first, ordered by age, with the arrival route on each row.

Enquiry detail

Original message beside the structured summary, with the inferred parts marked as inferred.

Proposal composer

Block library on one side, the composed document on the other, with the send-time freeze indicated.

Project phases

Phase dates and deliverable states — the same records the client-visible view reads from.

The screen above is built in HTML and CSS for this case study. It reproduces the layout, states and vocabulary of the real build without exposing client data, which is why it exists rather than a screenshot. It is evidence of design and of the decisions behind it. It is not a photograph of a deployed system, and no part of it is a capture of anyone else’s product.

10Technologies

What it is built with

Chosen for the shape of the problem, not for novelty. Anything unusual is justified in the decisions section above.

Frontend
  • Next.js
  • TypeScript
  • Static generation with on-demand revalidation
Platform
  • Shared data layer
  • Role-based access
  • Transactional email
  • Single deployment
Documents
  • Block composition
  • Immutable send-time snapshots
  • PDF generation
Model use
  • OpenAI API for enquiry summarisation only
  • Prompt version stored per record

Implementation detail

  • Public site and internal platform on one data layer, removing the copy step at the top of the funnel.
  • Enquiry normalisation across form, mail and referral routes with the source captured at write time.
  • Model summarisation placed after persistence and outside the acknowledgement path, so it cannot delay a client reply.
  • Summary output split into stated, missing and inferred, which stopped confident invention on vague enquiries.
  • Proposal block library with per-proposal connective text, so composed documents do not read as assembled.
  • Send-time immutable proposal snapshots with version identifiers.
  • Content as data with build-time resolution plus targeted revalidation, keeping editable pages static.
  • Prompt and model version recorded alongside every generated summary, so old output is interpretable later.

11Technical preview

Where the source for this one sits

This build was delivered to a client, so the source belongs to them and is not republished here in any form — not as excerpts and not as a repository link.

Delivered work

A walkthrough instead of a code dump

For private client work, contact me for a walkthrough. On a call I can screen-share the build, go through the component structure, the decisions behind the interaction work and the parts that needed rewriting — the same ground a technical preview covers, without republishing a client's property to do it.

Request a walkthrough

Or email directly: surajk86808@gmail.com

What is not published here

  • The live URL — the deployment belongs to the client, not to this portfolio.
  • The repository, in whole or in excerpt.
  • Client content, contact records, pricing or anything else from the running site.
  • Anything beyond what was agreed: NexviaTech.

Next step

Need something along these lines?

Send the process, the constraints and the deadline. You will get an honest scope, an architecture sketch and a timeline before any commitment.

Email
surajk86808@gmail.com
Based in
Bengaluru, India
Working hours
IST (UTC+5:30)
Availability
Taking new engagements