Phase 1 Delivery Plan
A focused presentation page containing only the selected Phase 1 deliverable sections, using the same visual structure as the main proposal.
Pearl is the enterprise-grade Telephone Answering Service (TAS) platform powering MessageDirect — a leading UK 24/7 virtual receptionist and contact centre business.
Enable call centre operators to answer phone calls on behalf of hundreds of subscribing client companies — capturing caller details, recording messages, triggering escalations via SMS/email/push, and providing clients with a self-service portal to view messages, manage rotas, and pay invoices.
Operators answer calls around the clock on behalf of client companies using dynamic answering scripts
Capture caller details, record messages, and escalate to the right contact via SMS, email, or push
108+ portal pages for clients to view messages, manage rotas, search callers, and handle billing
Automated billing lifecycle — usage tracking, invoice generation, card & DD payments, Xero accounting sync
AI chatbots, voice assistants (ElevenLabs/Twilio), speech analytics, and GPT-powered QC scoring
Operates MessageDirect, JAM, Answer.co.uk, Argyll, VirtuallyThere — all from one platform
A mature, organically-grown platform handling significant operational complexity.
The production layout powering 24/7 operations today.
The confirmed technology landscape powering every layer of Pearl.
This is not a Web Application project — the folder structure is the project. App_Code/ is auto-compiled at runtime via JIT. Source .vb and .aspx files are deployed directly to the server. Pre-compilation uses aspnet_compiler.exe for production.
8 distinct components, each with unique runtime characteristics.
| Component | Type | Framework | Role | Database Access |
|---|---|---|---|---|
| pearl-azure | ASP.NET Web Forms | .NET 4.8 | Main UI — operators, admins, client portal. 321+ exposed endpoints, 304+ admin tools, 108+ portal pages | All 17 databases |
| pearl-webservices-azure | ASP.NET Web App | .NET 4.8 | Background services — 278+ utility job pages, billing, stats, search indexing, AI QC endpoints, job scheduler | All 17 databases |
| utility-server | ASP.NET Web Forms (3 sub-apps) | .NET 4.8 | PCI-isolated payments portal (Stripe), Xero accounting sync, multi-brand reporting | PearlBilling, PearlData, PearlOperations |
| queue-processor-azure | WinForms (.exe) | .NET 4.8 | Job queue worker — claims rows from Process_JobQueue, executes HTTP calls with turn-based coordination | PearlQueues, PearlData, PearlBilling, PearlLog |
| system-checker | WinForms (.exe) | .NET 4.8 | Health monitoring — ICMP ping, TCP, HTTP probe, SQL query, disk space checks with transition-based alerts | Checking, PearlOperations, PearlData |
| ai-spooler | WinForms (.exe) | .NET 4.8.1 | AI QC spooler — 6-lane conveyor belt for speech analytics, round-robin distribution, 55s backoff on empty | Via HTTP to pearl-webservices |
| totem-2-cloud-nosql | Console App (Socket Server) | .NET 3.5 | Real-time browser notifications via long-poll. /register, /poll, /notify protocol. All state in-memory | None (in-memory only) |
| alpha-code-generator | WinForms (.exe) | .NET 4.8 | Batch generator for unique 9-char alphanumeric codes (base-31 encoding) | FreeAlphaCodes table |
The backbone of Pearl's logic — VB.NET classes auto-compiled at runtime.
~557 KB — Screen XML, message processing, DDI management, screen pop, real-time signalling
Core Engine~338 KB — Dynamic UI generation from XML config. Renders answering screens, data grids, forms
UI Renderer~220 KB — User CRUD, login, permissions, shift tracking, password management
Identity~153 KB — Client onboarding, company config, setup wizards
Clients~97 KB — Escalation rules, notification routing, on-call rota resolution
Dispatch~90 KB — Stripe, SagePay, GoCardless — gateway integrations & payment processing
BillingAzure SQL Managed Instance (Business Critical) — the data backbone.
Two SQL accounts: pearl (main apps — web & workers) and utility (utility-server & system-checker). Cross-database queries use 3-part naming. The ConfigStrings table in PearlOperations holds all connection strings, API keys, and feature flags — the central configuration hub.
Every external dependency Pearl relies on — from telephony to AI.
A complex, mission-critical platform with no isolated test environment. Every change is a risk to the 24/7 production service.
All development and testing happens against or very near production. Every deploy risks the live 24/7 service that operators and clients depend on around the clock.
A test against the wrong config could trigger real Stripe charges, send SMS to real customers, or disrupt live Genesys call routing. No safety net exists.
Cannot wipe and rebuild a clean test state. No way to validate that a change doesn't break any of the 489+ tables, 321+ endpoints, or 278+ background jobs.
Any test data access risks exposing real customer PII — names, phone numbers, billing details, message content. No masking or anonymisation layer exists.
.NET Framework 4.8 with WinForms workers, raw sockets (.NET 3.5 Totem), and hardcoded IPs — not cloud-native, cannot use modern PaaS services without refactoring.
Deployments are robocopy-based file syncs with no approval gates, no rollback mechanism, no audit trail. Manual and error-prone.
Every code change, database migration, or configuration update is deployed directly to production with no safety net. For a 24/7 contact centre handling calls for hundreds of client companies, this is an unacceptable operational risk that must be resolved.
The complete test environment design — fully isolated from production.
Portable diagram asset: target-architecture.png
The design uses a private hub-and-spoke Azure layout so administrator access, application workload, and outbound internet traffic are controlled separately. Azure Bastion is the only RDP entry point, Azure Firewall is the single outbound checkpoint, and the spoke VNet hosts the actual Pearl workload across VM1 for IIS and local cache/search, VM2 for background workers, and VM3 for build, restore, and masking automation.
The single test SQL Managed Instance stores all 17 masked databases used by the environment. Production never connects directly to the test estate; it only places weekly backup files into Blob Storage, and VM3 restores, masks, and validates those backups before VM1 and VM2 use them. Azure Key Vault keeps the environment secrets out of the servers, and every external dependency is redirected to sandboxes such as Genesys, Stripe, GoCardless, Mailgun, and the test S3 bucket so the platform behaves like production without touching live customer data, live payments, or live telephony.
The recommended build uses a simple principle: keep the test environment close enough to production to be trustworthy, but small enough to stay commercially sensible.
| Resource | Recommended Baseline | Why It Exists |
|---|---|---|
| Azure Blob Storage | Hot tier, LRS, 500 GB | Stores weekly backup files, restore artefacts, and supporting scripts for the refresh process. |
| Azure Bastion | Standard SKU | Provides secure administrator access without exposing public RDP on the servers. |
| Azure Firewall | Standard SKU | Restricts outbound traffic so the test environment cannot accidentally reach live production endpoints. |
| Azure Key Vault | Standard | Keeps secrets, credentials, and API keys out of files, scripts, and manual notes. |
| Azure Monitor + Log Analytics | Central diagnostics workspace | Collects logs, alerts, and diagnostics from the VMs, SQL, firewall, and supporting services. |
| Microsoft Defender for Cloud | Servers + SQL + Storage + Key Vault | Adds vulnerability and threat monitoring so the test estate is not the weak security point. |
| Azure Backup | 3 protected VMs | Gives the team a fast recovery path if a release, test, or configuration change breaks a server. |
| Azure Update Manager | 3 managed servers | Keeps the Windows estate patched and supportable without manual server-by-server effort. |
The architecture is dictated by Pearl's actual runtime constraints.
WinForms workers (queue-processor, system-checker, ai-spooler) are architecturally bound to the Windows desktop runtime. Totem uses raw .NET 3.5 sockets. Converting to Azure Functions would be a major rewrite — explicitly out of the RFP scope.
3-VM layout replicates the actual production separation: web tier (IIS), internal services tier (workers), and a dedicated build server. Test results reliably predict production behaviour.
Deploy existing compiled binaries via robocopy — the current deployment method. No new toolchain, no recompilation model, no replatforming. Ship in weeks, not months.
Windows Server 2022 + IIS + Windows Services. The team already knows how to operate, troubleshoot, and deploy this stack. Zero learning curve.
The recommended estate is budgeted at about £2.39k/month based on the current Azure calculator export. That figure is higher than a simple lab because it includes the controls that make the environment credible: SQL Managed Instance, the 3-VM role split, secure access, outbound control, monitoring, backup, and security services. It is still the right shape of spend because it funds safe delivery and testing rather than forcing risky shortcuts.
3 VMs + SQL MI + networking maps cleanly to Bicep/ARM templates. Entire environment can be torn down and rebuilt from code — meeting the RFP's repeatability requirement.
Only the recommended environment is priced here. This is the proposed client budget line for a secure, production-shaped test estate in Azure.
Calculator-backed estimate from the Azure pricing export for UK South, Pay-As-You-Go, dated 16 April 2026. This is the current planning figure for the recommended environment.
The current calculator export total for the recommended build.
RecommendedUse this for annual approval and client budgeting conversations.
Firewall, SQL Managed Instance, and the 3 VMs together make up most of the total.
This estimate was taken from the official Microsoft Azure Pricing Calculator. The screenshot below is included as the visual source reference used for this client-ready summary. Source: azure.microsoft.com/en-us/pricing/calculator/
| Azure Service | Recommended Baseline | Monthly Cost | Purpose in Plain English | Why It Is Recommended |
|---|---|---|---|---|
| VM1 — Web Tier | D4s v5, 4 vCPU, 16 GB RAM, 128 GB P10 OS disk, 256 GB P15 data disk | £240.95 | Runs the websites, internal web services, search, and cache. This is the customer-facing side of the estate. |
It needs the strongest VM size because it hosts the broadest mix of workloads and is the best place to preserve realistic front-end behaviour. |
| VM2 — Worker Tier | D2s v5, 2 vCPU, 8 GB RAM, 128 GB P10 OS disk | £129.44 | Runs background processing such as queue jobs, health checks, AI spooler activity, and Totem. |
Separating worker activity from the web tier makes test behaviour cleaner and much closer to the live platform. |
| VM3 — Build / Restore Tier | D2s v5, 2 vCPU, 8 GB RAM, 128 GB P10 OS disk, 128 GB P10 data disk | £147.39 | Handles CI/CD, deployment jobs, backup downloads, restores, and masking automation. |
It keeps engineering and restore work away from the servers used for active testing, which reduces interference and makes support easier. |
| Azure SQL Managed Instance | General Purpose, 4 vCores, 256 GB storage | £660.15 | Stores the full restored Pearl database set and supports the SQL behaviour the platform expects. |
Managed Instance is the compatibility-safe choice, while General Purpose avoids paying for production-grade high availability that test does not need. |
| Azure Blob Storage | General Purpose v2, Hot, LRS, 500 GB | £8.15 | Stores backup files, restore artefacts, and related automation content. |
It is the lowest-cost way to support the weekly refresh process and hold multiple backup copies ready for use. |
| Azure Bastion | Standard SKU | £159.29 | Provides secure admin access to the servers without public RDP exposure. |
Recommended because it reduces internet exposure and gives a much stronger security story to the client. |
| Azure Firewall | Standard SKU | £686.58 | Acts as the outbound gatekeeper for the environment so only approved destinations can be reached. |
This is the control that stops the test estate from accidentally touching live integrations or production-only services. |
| Azure Key Vault | Standard tier | £2.39 | Keeps secrets like passwords, connection strings, and API keys in a secure central vault. |
Recommended because it prevents secrets from spreading into server files, scripts, and manual notes. |
| Azure Monitor + Log Analytics | Workspace, diagnostics, alerting, application insights | £140.23 | Collects logs, metrics, and alerts in one place so issues can be diagnosed quickly. |
Recommended because a complex environment without central monitoring becomes expensive and slow to support. |
| Microsoft Defender for Cloud | 3 protected servers, SQL, storage, Key Vault | £29.91 | Checks the environment for vulnerabilities, missing controls, and suspicious security signals. |
Recommended so the test estate does not become the easiest point of compromise in the wider platform. |
| Azure Backup | 3 protected VMs, LRS backup storage | £96.61 | Provides restore points for the VMs if a release, experiment, or admin mistake breaks the servers. |
Recommended because fast rollback is far cheaper than rebuilding multiple Windows servers by hand. |
| Azure Update Manager | 3 managed servers | £11.29 | Automates patching and helps keep the test servers current and supportable. |
Recommended because test estates are often where patching discipline slips first, creating avoidable risk. |
| Microsoft Support Plan | Azure support coverage | £75.24 | Provides a formal escalation route to Microsoft for Azure platform issues. |
Recommended because issues involving SQL Managed Instance or Azure networking sometimes need vendor-level support. |
| Total Recommended Monthly Cost | Recommended test environment baseline | £2,387.62 | Annual view: £28,651.44. This is the current calculator-backed planning total for the recommended estate. |
|
The bulk of the spend is in the controls that make the environment usable and safe: secure networking, SQL compatibility, and the three-server role split.
The recommended Azure budget is justified because it buys safe change capability. It gives MessageDirect a realistic place to test releases, restore masked data, validate integrations, and troubleshoot issues without putting the live 24/7 Pearl service at risk.
In practical terms, this is the cost of moving from production-first testing to a controlled engineering platform. That is why the recommendation is to fund this build as proposed rather than strip out the controls that make it credible.
Complete guide to Azure payment options, subscription types, and resource-level cost controls — with direct answers on what can be paused and what cannot.
Sources: Azure Cost Management docs · VM billing states
Partly, yes. The 3 virtual machines can be stopped and deallocated, which removes their compute runtime charge. However, Azure does not provide a single pause button for the whole estate. Several platform services continue billing while they remain deployed — especially SQL Managed Instance, Azure Firewall, Bastion, storage, backup retention, monitoring, and support cover.
In Azure, the word "subscription" has two distinct meanings:
For this estate, the resource purchase model is the more important cost-control lever. Both categories are documented comprehensively below.
How each resource in the current £2,387.62/month estimate behaves when you try to stop, pause, or reduce it.
| Azure Resource | Current Cost | Applicable Purchase Models | Can It Be Stopped? |
|---|---|---|---|
| VM1, VM2, VM3 Compute runtime |
£517.78 | PAYG · Reserved Instance · Savings Plan · Azure Hybrid Benefit · Dev/Test pricing | ✅ Yes. Stop + deallocate removes compute charges. Auto-shutdown schedulable. Disks, backup retention, monitoring, and Defender still bill. |
| Managed Disks Attached to VMs |
Incl. in VM baseline | PAYG on provisioned disk size | ⚠️ No pause. Disk charges continue while the VM is deallocated. Must delete or downgrade to save. |
| Azure SQL Managed Instance General Purpose, 4 vCores |
£660.15 | PAYG · Reserved Instance · Azure Hybrid Benefit for SQL | ❌ No practical stop-start. Always-on in this design. Savings from reservation, rightsizing, or licence benefit. |
| Azure Firewall Standard tier |
£686.58 | PAYG (deployment hours + data processed) | ❌ No meaningful pause. Bills while deployed. Delete for long mothball periods only. |
| Azure Bastion Standard tier |
£159.29 | PAYG (deployment hours) | ❌ No meaningful pause. Bills while deployed. Same approach as Firewall. |
| Blob Storage LRS, Hot tier |
£8.15 | PAYG · Lifecycle tiering (Hot/Cool/Archive) | ⚠️ No pause concept. Use lifecycle policies and Cool/Archive tiers for cost reduction. |
| Monitor + Log Analytics | £140.23 | PAYG ingestion · Commitment tiers | ⚠️ Tuneable. Reduce diagnostics, shorten retention, disable verbose collection. |
| Backup + Update Manager | £107.90 | PAYG per protected instance | ⚠️ Partial. Stop new backups, but retained recovery points still incur storage cost. |
| Support Plan | £75.24 | Monthly subscription | ⚠️ Downgrade only. Can be cancelled or moved to Basic (free) tier. |
| Security: Key Vault + Defender | £32.30 | PAYG per operation / per protected resource | ⚠️ Disableable. Defender can be turned off, but not recommended for security posture. |
Enforce business-hours auto-shutdown for VM1 and VM2. Keep VM3 off by default — run it only when builds, restores, or masking jobs are needed. This targets the part of the estate that genuinely can be paused.
SQL MI (£660), Firewall (£687), and Bastion (£159) total £1,506/month and do not pause. They are the compatibility and isolation controls this environment requires.
Azure Hybrid Benefit + 1-year Reserved Instances for SQL MI and VMs are the strongest levers. Dev/Test subscription pricing is also a strong fit if Visual Studio licences exist.
This focuses on the resources already in the current estimate. It distinguishes where cost can realistically be cut, what risk that introduces, and how that risk could be controlled if the client chooses to reduce scope.
| Resource / Control | Potential Saving | Risk If Removed or Reduced | Mitigation |
|---|---|---|---|
| VM3 runtime hours Build / restore VM |
Medium | Low risk if managed properly. Build, restore, and masking jobs will not be instantly available outside planned windows. |
Keep VM3 powered off by default, publish a startup runbook, and schedule restore/build windows ahead of testing cycles. |
| Azure Monitor / Log Analytics volume Diagnostics + retention |
Low to Medium | Low operational risk. Reduced visibility into faults, slower troubleshooting, and less historical evidence. |
Keep core health, security, and deployment logs; reduce verbose diagnostics only; shorten retention for non-critical data first. |
| Backup retention depth Recovery point storage |
Low to Medium | Moderate resilience risk. Fewer restore points mean less ability to recover from older defects or operator mistakes. |
Agree a minimum recovery objective, retain enough points for weekly rollback needs, and document the reduced recovery window explicitly. |
| Support plan downgrade Standard to Basic |
~£75/month | Low technical risk, moderate support risk. Slower or no Microsoft escalation path if an Azure platform issue occurs. |
Only downgrade if the client is comfortable relying on internal support and partner support during test-only operations. |
| Defender coverage scope Security plan reduction |
Low | Moderate security risk. Reduced threat detection, weaker posture reporting, and less evidence for security review. |
Only reduce on clearly non-sensitive components, and keep compensating controls such as NSGs, Key Vault, audit logs, and patching in place. |
| Azure Bastion Admin access layer |
~£159/month | High access risk. Removing Bastion weakens the secure remote-access model and pushes the team toward less controlled admin access patterns. |
Only remove if the environment is shut down for an extended period. Recreate Bastion before resuming active engineering or testing. |
| Azure Firewall Outbound control + segmentation |
~£687/month | High security and compliance risk. Loss of central egress filtering and reduced confidence that test traffic cannot reach unintended external targets. |
Not recommended while the environment is active. If ever removed, replace with an agreed alternative control set and re-run the security design review. |
| Azure SQL Managed Instance Core database platform |
~£660/month | High platform risk. Removing it would remove the core database layer and effectively take the environment out of service. |
Do not remove if the test environment is expected to remain usable. Cost reduction here should come from rightsizing, reservation, or licence benefit instead. |
| Core VM estate (VM1 / VM2) Web + worker runtime |
High, but disruptive | High service risk. Removing or permanently stopping core VMs breaks the application runtime and prevents meaningful test execution. |
Do not remove during active project use. Restrict savings to scheduled shutdown outside business hours rather than removal. |
VM3 runtime scheduling, log-volume tuning, support-plan downgrade, and carefully reduced backup retention are the lowest-risk savings available inside the current design.
Defender scope reduction and Bastion removal are possible only if the client explicitly accepts weaker security or access posture for a period of time.
SQL MI, Azure Firewall, and the core VM runtime are foundational. Removing them is less a cost optimisation and more a decision to partially or fully suspend the environment.
All statements in this section are backed by official Microsoft documentation: