Files
website/docs/superpowers/specs/2026-04-26-dedicated-server-lineup-design.md
Andrew 2a9d36270a chore(dedicated): cut setup fees in half — competitive recalibration
Original tiers ($349/$549/$799) drifted into Hetzner Dell US
setup-fee territory ($840-$1,020) — too aggressive for a small
Atlanta provider competing against ColoCrossing ($0 setup) and
OVH SYS ($60-$343). The competitor research at
infrastructure/docs/competitors-atlanta-2026.md and
dedicated-server-pricing-2026q2.md both flagged "no setup fees"
as a documented competitive advantage.

New tiers ($149/$249/$399) preserve a meaningful safety net on
monthly customers (~1 month of rental recoups the fee) while
sitting inside the OVH SYS price band. Annual / Semi-Annual
customers still pay $0 setup.

Per-plan changes:
- R440 / R640 SFF (Tier 2): $349 → $149
- R540 / R740 / R740xd SFF / R740xd LFF (Tier 3): $549 → $249
- R640 NVMe / R740xd NVMe (Tier 4): $799 → $399

Spec doc updated. Test expectations adjusted; 12/12 pass.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-26 18:34:30 -04:00

13 KiB
Raw Permalink Blame History

Dedicated Server Lineup — Design Spec

Date: 2026-04-26 Status: Approved (skip user-review gate per owner override — implementation starting immediately) Owner: Andrew Repo: EZSCALE/website

Goals

  1. Ship the new Dell 14th-gen dedicated server lineup (8 chassis SKUs sourced from SaveMyServer per order) on /dedicated-servers.
  2. Re-surface the existing 12th/13th-gen rack inventory (currently status: hidden in the seeder) so it's visible alongside the new line as instant-deploy "in stock" SKUs.
  3. Build an interactive per-chassis configurator at /dedicated-servers/{slug} covering CPU, RAM, per-bay drives, OS, bandwidth, networking, IPv4.
  4. Add a 5-stage post-order build status tracker (Ordered → Hardware acquired → Assembly → Racked → Deployed) visible to the customer and editable by admins.
  5. Wire tiered setup fees that waive automatically on Semi-Annual / Annual cycles.

Non-goals (deferred)

  • C from Q6: Two-preset cards (Starter + Performance per chassis) — v1.1, after first-month signal on what people actually buy
  • Workload bundles page — v2 if pricing-positioning-vs-budget-bundlers keeps coming up in support
  • Automated SaveMyServer order placement — admin-driven for v1
  • Live capacity check at order time — buffer-stock model not in v1
  • Multi-region (currently Atlanta-only)Location selector renders but only has one option
  • Custom-quote builder for non-catalog requests — uses existing /contact form
  • Hetzner comparison rows — placeholder; fills in when separate research lands

Sources of truth

Asset Path Role
Catalog JSON docs/integrations/savemyserver/dedicated-server-catalog.json 27 raw SaveMyServer products, drive options, BOM costs
Build sheets ../infrastructure/docs/dedicated-server-configurations.md Curated 8-product BOMs, EZSCALE Standard Build (locked baseline)
Pricing ../infrastructure/docs/dedicated-server-pricing-2026q2.md Customer-facing monthly prices, margin math, drive add-on tables
Configurator design ../infrastructure/docs/superpowers/specs/2026-04-24-dedicated-server-gen14-configurator-design.md 15 configurable option groups, cross-server compliance matrix
Competitor research ../infrastructure/docs/competitors-atlanta-2026.md ColoCrossing/GTHost positioning baseline
Rack reality ../infrastructure/docs/reference/rack-atl.md Existing customer-rentable rack slots

EZSCALE Standard Build (locked baseline — applies to all 8 14th-gen chassis)

Non-negotiable per dedicated-server-configurations.md:

Component Selection
CPU 2× Intel Xeon Gold 6230 (40C / 2.10 GHz)
RAM 32 GB DDR4-2666 ECC RDIMM (2× 16 GB)
Boot Dell BOSS Card with 2× 240 GB M.2 SSDs (mirrored) — all main bays free for data
Storage controller PERC HBA330 (Non-RAID, IT mode) — N/A on R740xd NVMe (pure-PCIe)
iDRAC iDRAC9 Enterprise License
Power Dual redundant PSU
Network 1× 1 GbE onboard + 1× 10 Gbps SFP+
Drive trays Pre-installed in every bay
OS No OS (customer choice via post-provisioning panel)
Bandwidth 1 Gbps unmetered uplink
IPv4 1× included
IPv6 /64 included

The 8 14th-gen chassis

Slug Title Form Bays Std build cost Starting $/mo Setup tier
r440-4lff R440 4-Bay 3.5" LFF (1U) 1U 4× LFF $1,690.61 $119 2 ($149)
r540-8lff R540 8-Bay 3.5" LFF (2U) 2U 8× LFF $1,877.03 $159 3 ($249)
r640-8sff R640 8-Bay 2.5" SFF (1U) 1U 8× SFF $1,411.83 $179 2 ($149)
r740-16sff R740 16-Bay 2.5" SFF (2U) 2U 16× SFF $1,704.26 $229 3 ($249)
r740xd-24sff R740xd 24-Bay 2.5" SFF (2U) 2U 24× SFF $1,919.73 $279 3 ($249)
r740xd-12lff R740xd 12-Bay 3.5" LFF (2U) 2U 12× LFF $2,148.96 $249 3 ($249)
r640-10nvme R640 10-Bay U.2 NVMe (1U) 1U 10× NVMe $1,606.79 $239 4 ($399)
r740xd-24nvme R740xd 24-Bay U.2 NVMe (2U) 2U 24× NVMe $2,275.44 $279 4 ($399)

Setup tiers (per Q5 brainstorm):

Tier Chassis class Setup fee
1 Single-socket Budget (R240/R340) — not in v1 lineup $99
2 Dual-socket 1U $149
3 Dual-socket 2U $249
4 NVMe / Quad-socket Enterprise $399

Tier amounts revised down from $149/$349/$549/$799 after a check against the competitor research (infrastructure/docs/competitors-atlanta-2026.md + dedicated-server-pricing-2026q2.md). The original tiers approached Hetzner Dell US setup pricing ($840$1,020) which is too aggressive for a small Atlanta provider competing against ColoCrossing ($0 setup) and OVH SYS ($60$343). Halved tiers preserve a meaningful safety net on monthly customers (~1 month of rental) while staying inside the OVH SYS price band.

Setup fee waived on Semi-Annual (6 mo) and Annual (12 mo) cycles. Non-refundable once hardware is purchased (typically within 24h of order). Rental fees stay under the 14-day money-back guarantee.

Architecture

Routes

/dedicated-servers                          ← catalog landing (chassis grid)
/dedicated-servers/{slug}                   ← per-chassis detail + configurator

account.<domain>/services/{service}          ← existing route, gets BuildStatusPanel
admin.<domain>/orders/{order}/build         ← admin milestone updater

Database

1. Migration: add_setup_fee_to_plans_table

$table->decimal('setup_fee', 10, 2)->default(0)->after('price');

2. Migration: create_service_build_milestones_table

Schema::create('service_build_milestones', function (Blueprint $table): void {
    $table->id();
    $table->foreignId('subscription_id')->constrained()->cascadeOnDelete();
    $table->string('stage'); // 'ordered' | 'hardware_acquired' | 'assembly' | 'racked' | 'deployed'
    $table->timestamp('reached_at')->nullable();
    $table->text('note')->nullable();
    $table->foreignId('updated_by')->nullable()->constrained('users');
    $table->timestamps();
    $table->unique(['subscription_id', 'stage']);
});

3. PlanSeeder updates

  • Re-enable existing 12th/13th-gen rows: status: hiddenstatus: active. Stock counts preserved.
  • Insert 8 new 14th-gen rows with: features JSON containing cpu, ram, storage, bays, tier (chassis tier number), lead_time_days: '7-10', generation: '14th-gen'. Setup fee per the table above.

4. ConfigOptionSeeder updates

Add a Dedicated Gen14 Configurator group cluster per 2026-04-24-dedicated-server-gen14-configurator-design.md:

  • dedicated_server_gen14_cpu (standard CPU group — R440/R540/R640/R740)
  • dedicated_server_gen14_cpu_r740xd (R740xd-only CPU group)
  • dedicated_server_gen14_ram (RAM tiers)
  • dedicated_server_gen14_os (OS selector)
  • dedicated_server_gen14_bandwidth (bandwidth tiers)
  • dedicated_server_gen14_networking (private networking add-on)
  • dedicated_server_gen14_ipv4 (IPv4 block size)
  • dedicated_server_gen14_location (Atlanta only for v1)
  • dedicated_server_gen14_lff_bays_1_4 (drive selection bays 1-4 LFF)
  • dedicated_server_gen14_lff_bays_5_8 (drive selection bays 5-8 LFF)
  • dedicated_server_gen14_r740xd_lff_bays (R740xd 12-bay LFF)
  • dedicated_server_gen14_sff_slots_1_8 (SFF slots 1-8)
  • dedicated_server_gen14_sff_slots_9_16 (SFF slots 9-16, R740 only)
  • dedicated_server_gen14_sff_slots_17_24 (SFF slots 17-24, R740xd SFF only)
  • dedicated_server_gen14_nvme_slots (U.2 NVMe slots)

Attach each sub-group only to applicable chassis per the cross-server compliance matrix.

Frontend file map

resources/ts/Pages/Marketing/
├─ DedicatedServers.vue                    (REWRITE)
└─ DedicatedServerDetail.vue               (NEW)

resources/ts/Pages/Account/Services/
└─ Show.vue                                (extend with BuildStatusPanel)

resources/ts/Pages/Admin/Orders/
└─ BuildTracker.vue                        (NEW)

resources/ts/Components/Marketing/Dedicated/
├─ ChassisCard.vue                         (NEW)
├─ GenerationFilter.vue                    (NEW)
├─ DedicatedConfigurator/
│  ├─ index.vue
│  ├─ CpuSelector.vue
│  ├─ RamSelector.vue
│  ├─ DriveBayPicker.vue
│  ├─ OsSelector.vue
│  ├─ BandwidthSelector.vue
│  ├─ NetworkingSelector.vue
│  ├─ Ipv4Selector.vue
│  └─ ConfiguratorFooter.vue
└─ BuildStatusPanel.vue                    (used by both customer + admin)

resources/ts/stores/
└─ dedicatedConfigurator.ts                (NEW Pinia store)

Pinia state

state = {
  chassis: Plan | null,
  cpu: string,
  ramGb: number,           // 32, 64, 128, 256, 512, 1024, 1536
  bays: Array<string|'empty'>,
  os: string,
  bandwidth: string,
  privateNetworking: boolean,
  ipv4: 1 | 5 | 13 | 29,
  cycle: 'monthly' | 'quarterly' | 'semi_annual' | 'annual',
}

getters = {
  baselinePrice, cpuUpgradeCost, ramUpgradeCost, driveCost,
  bandwidthCost, ipv4Cost, cycleSubtotal, setupFee,
  cycleTotal, shareUrl, checkoutUrl,
}

URL state contract

/dedicated-servers/{slug}?<params> and /checkout/{plan_id}?<params> share:

Param Values Default
cpu option value slug baseline
ram 32 64 128 256 512 1024 1536 32
bays comma-list, length = bay count chassis-specific lean preset
os none alma9 ubuntu24 debian12 windows-byol none
bw 1g-unmetered 10g-1tb 10g-10tb 10g-100tb 10g-unmetered 1g-unmetered
pn 0 1 0
ipv4 1 5 13 29 1
cycle monthly quarterly semi_annual annual monthly

Setup fee flow

Setup fee is calculated at checkout based on plan.setup_fee and selected cycle:

$includesSetupFee = in_array($cycle, ['monthly', 'quarterly']);
$setupFee = $includesSetupFee ? $plan->setup_fee : 0;

Surfaced as a separate line item on the checkout page with explanatory text.

Build tracker stages

# Stage Triggered by Customer-visible message
1 ordered Subscription created event "Order received. We're placing the hardware order with our supplier."
2 hardware_acquired Admin click "Hardware acquired and en route to our datacenter (typically 2-3 days)."
3 assembly Admin click "Server received in Atlanta. Our DC tech is configuring iDRAC and assembly."
4 racked Admin click "Server racked, powered up, and online for final QA."
5 deployed Admin click "Server is live. Root credentials and iDRAC access have been emailed."

The deployed milestone flips subscription.status from pendingactive and triggers the deployment email.

Edge cases

Case Behavior
URL has more bay entries than chassis has bays Truncate; toast warning
URL has invalid CPU for the chassis Fall back to baseline; snackbar
Subscription cancelled before hardware_acquired Full refund (rental + setup fee)
Subscription cancelled after hardware_acquired, inside 14 days Pro-rated rental refund; setup fee non-refundable; chassis added to "ready-to-deploy" inventory
Customer wants off-catalog chassis "Need something custom?" CTA → /contact form
Mobile (< 768 px) DriveBayPicker collapses to single-column list; sticky footer docks to viewport bottom
Browser back/forward URL hydration restores everything

Testing

  • Pesttests/Feature/Marketing/DedicatedServersTest.php and tests/Feature/Account/BuildTrackerTest.php
  • Vitestdeferred (Vitest not currently installed in this project; covered by Playwright + Pest)
  • Playwrighttests/e2e/dedicated-configurator.spec.ts (one happy-path E2E)

Acceptance criteria

  • Migration adds plans.setup_fee and service_build_milestones table
  • PlanSeeder seeds 8 new 14th-gen rows; un-hides existing 12th/13th-gen rows
  • ConfigOptionSeeder adds 15 sub-groups under "Dedicated Gen14 Configurator" with chassis-specific attachments
  • /dedicated-servers lists all dedicated plans (both lines), generation filter works
  • /dedicated-servers/{slug} works for all 8 new chassis slugs
  • Configurator computes correct totals across all option groups
  • Setup fee shows on Monthly/Quarterly, hides on Semi-Annual/Annual
  • Setup fee non-refundable note on checkout + FAQ
  • Order this configuration deep-links with all params; checkout pre-selects them
  • Copy share link works
  • BuildStatusPanel renders during build; admin can mark milestones; customer sees timestamps
  • deployed milestone flips subscription pendingactive
  • Pest tests pass
  • npm run build and php artisan test --compact pass
  • Mobile layout works without horizontal scroll

Open implementation questions (deferred to phase work)

  • Exact RAM upgrade pricing tiers — pull from dedicated-server-pricing-2026q2.md at seeder-write time
  • Exact drive add-on prices per chassis — pull from catalog JSON drives.drives array per chassis
  • Bandwidth tier pricing — pull from dedicated-server-pricing-2026q2.md
  • Hetzner comparison row data — pending separate research