Custom .NET development

Eighteen years of building and rescuing .NET systems - line-of-business applications, integrations, and the software that runs a business from the inside.

Most of our work has no CMS in it at all

AHD is known for DXP work, but the larger part of what the team does is ordinary, serious .NET engineering: internal systems, integration layers, data processing, and applications that have to keep running while they are being changed.

It is less photogenic than a website launch and it is where most of the value sits. A CMS replatform happens once every five years. The system that schedules the work, reserves the stock and chases the unpaid balances runs every working day.

Custom CRM and sales systems

A general-purpose CRM models three things well: a company, a contact and a deal. That is enough for a business whose product is undifferentiated and whose sales process is a series of conversations.

It stops being enough the moment the thing you sell has structure of its own. If a sale depends on a specific unit that can be reserved and released, on a stage set by regulation rather than by a salesperson, or on an engineer with the right certification being free on Thursday, a general CRM has no field for it. So it gets rebuilt in custom fields - and the moment that happens, nobody trusts the pipeline figure, because the pipeline figure is now assembled from free text.

A custom CRM is worth building when the domain has that structure and the pipeline number has to be real. It is not worth building when a configured commercial CRM would do the job, which is more often than software suppliers tend to admit.

What changes by sector

The same architecture, a different domain model. These are the questions that decide the build.

Property and development

Units inside buildings, each individually sellable. Reservations that expire and return stock to the market. Construction and certification stages that decide what can legally be sold and when it can complete - in Bulgaria, Акт 14 and Акт 16.

Professional services

Engagements rather than deals, retainers that renew, and utilisation as the number that actually matters. Time recorded against work has to reconcile to what was invoiced, or the reporting is decorative.

Field service

Jobs with locations, engineers with skills, certifications and availability, parts that have to be in the van. Scheduling is the hard part and it is what a general CRM handles worst.

Distribution and wholesale

Accounts with negotiated price lists and credit limits, quotes that become orders, and stock that is promised to several customers at once until somebody decides who gets it.

Membership and education

Cohorts and enrolments rather than one-off sales, renewals that need chasing before they lapse, and eligibility rules that change what a given person can buy.

Regulated sales of any kind

Where a stage is set by a certificate, an inspection or an approval rather than by a salesperson's optimism. Modelling that properly is the difference between a forecast and a wish.

What a custom CRM usually includes

Not every system needs all of it. Most need more of it than they expect.

Domain inventory

Whatever it is you actually sell, modelled as a first-class thing with its own states and its own rules - not as a custom field hanging off an opportunity.

Pipeline and forecasting

Leads, opportunities and closed business, with the value computed from real records at real prices rather than typed into a box.

Reservations and holds

Where the domain needs it: a hold with its own lifecycle and expiry, which changes what is available to sell while it is live.

People and permissions

Role-based access that reflects genuinely different jobs. A consultant sees their own book, a manager sees the team, an administrator sees everything.

Scheduling and calendars

Shared calendars for appointments, viewings or site visits, with the availability rules that make the scheduling trustworthy.

Tasks and reminders

Follow-ups attached to the record rather than to a person, so nothing is lost when somebody is on holiday or leaves.

Reporting and exports

The handful of figures the business is actually run on, compared against the previous period, exportable to CSV, Excel and PDF without a developer.

Configurable vocabulary

Statuses, sources and categories held as data, not code, so the business changes its own terminology without raising a ticket.

Integrations

Accounting, marketing, telephony, the public website. Including what happens when one of them is unavailable, which is the part that normally gets skipped.

Design decisions worth making early

The choices that make it a system rather than a database with screens on top.

DecisionThe choiceWhy it matters
Domain modelModel what you sell as its own entity, with its own statesForcing it into custom fields is what makes the pipeline number untrustworthy. Everything downstream inherits that.
Regulatory stagesTrack the certificates, inspections or approvals that gate a saleIn regulated sales these, not a sales stage, decide what can be sold and when it can complete.
LocalisationFull multilingual support down to data labels and status valuesA floor that works in one language and reports in another needs both to be first-class, not one bolted on.
Access controlRole-based, reflecting real jobs rather than seniorityReception, sales and administration are three genuinely different views of the same data.
ArchitectureHeadless where the same data serves more than one surfaceLets one back end serve the internal system, a public listings or catalogue site, and later a mobile client.
Configuration over codeStatuses, sources and categories editable in the applicationEvery business changes its vocabulary. Charging them to deploy a dropdown value is a bad arrangement for both sides.
Build vs configureDecide honestly, in writing, before anything is builtThe cheapest custom CRM is the one you did not need. We would rather lose that project than deliver it.

What else we build

CRM is one shape this work takes. These are the others.

Line-of-business applications

Internal systems that encode how a business actually works - scheduling, tracking, approval, reporting. Usually replacing a spreadsheet that outgrew itself years ago.

Integration layers

Making a CRM, an ERP, a website and a payment provider agree with each other reliably, including the retry, failure and reconciliation behaviour that normally gets skipped.

APIs and services

REST and messaging services built to be consumed by people who are not in the room, and versioned so they can keep being consumed.

Data and reporting

SQL Server work from schema design through query optimisation to the backup and Agent configuration nobody thinks about until it matters.

Modernisation

Taking a .NET Framework application that still earns its keep and finding a route forward that does not require stopping the business to do it.

Rescue work

Inheriting a codebase from a team that has moved on, working out what it really does, and making it safe to change again.

How we work

Three things that describe an engagement more usefully than a methodology name.

We read before we quote

The two-week assessment applies to application work as much as to platform work. A quote written without reading the code is a guess with an invoice attached.

We work alongside your team

Most engagements are joint. Your developers know why the strange decisions were made, and that context is worth more than anything we would rediscover slowly.

We write things down

Handover documentation is part of delivery, not an optional extra at the end. You should be able to replace us without it being a crisis.

Questions about .NET and CRM work

01.
When is a custom CRM the right answer?

When what you sell is not a company, a contact and a deal. If your sales process turns on inventory that can be reserved and released, on stages set by regulation or construction, on engineers and their availability, or on anything else a general CRM has no field for, you end up rebuilding it in custom fields anyway - slowly, and without the reporting.

02.
When is it the wrong answer?

When a configured Salesforce, HubSpot or Dynamics would genuinely do the job. That is more often than vendors of custom software like to admit, and we will say so. Building software you could have licensed is an expensive way to own a maintenance burden.

03.
Can it integrate with the CRM we already have?

Often the better route. A custom layer that models your actual domain, sitting alongside a commercial CRM that keeps the contact and marketing side, gets you the parts each is good at. Whether that is worth the integration cost depends on your situation.

04.
Do you work on existing systems or only new builds?

Mostly existing. A large part of what we do is taking on a .NET application somebody else wrote, understanding it properly, and making it safe to change again. Greenfield work is the easier half of the job.

05.
Which .NET versions do you work with?

Current .NET for anything new. In practice we spend a lot of time on .NET Framework applications that need to keep running while a migration path is worked out, and that migration is often the engagement itself.

06.
Can you take over a system with no documentation?

Yes. That is a normal starting condition rather than a complication. The first deliverable in that case is usually a written description of what the system actually does, which frequently differs from what everyone believes it does.

07.
Can the system work in more than one language?

Yes, and properly rather than as a translation layer added afterwards - navigation, data labels, status values and reports all localised. A system used by a sales floor in one language and reported on in another has to be both at once.

08.
Where is the team based?

Sofia, Bulgaria. Central European time, which overlaps a full working day with the rest of Europe and most of the Middle East.

Let's talk

Tell us what you are running

Whether it is a system that needs building, one that needs rescuing, or one nobody understands any more - start by telling us what it does.