diff --git a/website/resources/ts/Components/Marketing/ComparisonTable.vue b/website/resources/ts/Components/Marketing/ComparisonTable.vue new file mode 100644 index 0000000..062e888 --- /dev/null +++ b/website/resources/ts/Components/Marketing/ComparisonTable.vue @@ -0,0 +1,116 @@ + + + + + diff --git a/website/resources/ts/Components/Marketing/Faq.vue b/website/resources/ts/Components/Marketing/Faq.vue new file mode 100644 index 0000000..d7939fc --- /dev/null +++ b/website/resources/ts/Components/Marketing/Faq.vue @@ -0,0 +1,127 @@ + + + + + diff --git a/website/resources/ts/Components/Marketing/PlanCard.vue b/website/resources/ts/Components/Marketing/PlanCard.vue new file mode 100644 index 0000000..521731f --- /dev/null +++ b/website/resources/ts/Components/Marketing/PlanCard.vue @@ -0,0 +1,235 @@ + + + + + diff --git a/website/resources/ts/Pages/Marketing/VpsHosting.vue b/website/resources/ts/Pages/Marketing/VpsHosting.vue index 0645faf..a29b60b 100644 --- a/website/resources/ts/Pages/Marketing/VpsHosting.vue +++ b/website/resources/ts/Pages/Marketing/VpsHosting.vue @@ -6,6 +6,9 @@ import SectionHeader from '@/Components/Marketing/SectionHeader.vue' import HeroSection from '@/Components/Marketing/HeroSection.vue' import VpsHero from '@/Components/Marketing/VpsHero.vue' import EstimatorSection from '@/Components/Marketing/Estimator/EstimatorSection.vue' +import PlanCard from '@/Components/Marketing/PlanCard.vue' +import ComparisonTable from '@/Components/Marketing/ComparisonTable.vue' +import Faq from '@/Components/Marketing/Faq.vue' import { useEstimatorStore, type EstimatorPlan, type EstimatorAddOnGroup, type WorkloadEntry, type AppExample } from '@/stores/estimator' import { crossDomainUrl } from '@/utils/resolvers' @@ -19,7 +22,7 @@ interface PageProps { domains: { marketing: string; account: string; admin: string } } -interface Feature { +interface Differentiator { icon: string title: string description: string @@ -46,13 +49,51 @@ const startingPrice = computed(() => { return lowest % 1 === 0 ? lowest.toString() : lowest.toFixed(2) }) -const features: Feature[] = [ - { icon: 'tabler-database', title: 'RAID 10 SSD Storage', description: 'Redundant SSD arrays for fast read/write speeds and data protection.' }, - { icon: 'tabler-server', title: 'KVM Virtualization', description: 'Full hardware virtualization for predictable, dedicated performance.' }, - { icon: 'tabler-rocket', title: 'Near-Instant Provisioning', description: 'Your VPS is deployed seconds after ordering.' }, - { icon: 'tabler-refresh', title: 'Free ZFS Snapshots', description: 'Built-in snapshots for quick rollbacks. Off-site backup add-ons available.' }, - { icon: 'tabler-terminal', title: 'Full Root Access', description: 'Complete control over your server environment.' }, - { icon: 'tabler-server', title: 'VirtFusion Panel', description: 'Out-of-band console + VNC access included.' }, +// Slug of the plan we want to flag as "Most popular" in the plan grid. +const popularSlug = 'vps-4' + +// Plans split into standard VPS (1-32) and storage-focused tiers, so the grid +// reads as a clean ladder of one shape rather than a jumble. +const standardPlans = computed(() => + plans.value.filter(p => !p.slug.startsWith('stor-')), +) +const storagePlans = computed(() => + plans.value.filter(p => p.slug.startsWith('stor-')), +) + +// Differentiators answer "why pick EZSCALE over Linode/Hetzner/Vultr" — distinct +// from the Included With All Plans card below which lists *what's in the box*. +const differentiators: Differentiator[] = [ + { + icon: 'tabler-headset', + title: 'Real US-based humans', + description: 'Atlanta-based ops team. Tickets answered by engineers, not chatbots. Same hands fix the server and reply to your ticket.', + }, + { + icon: 'tabler-history', + title: 'ZFS-backed reliability', + description: 'Free snapshots and instant rollbacks built into the storage layer — no bolt-on services to wire up or pay extra for.', + }, + { + icon: 'tabler-receipt-2', + title: 'Predictable billing', + description: 'No surprise egress fees on fair-use traffic. Monthly, quarterly, or annual — your call. The price you see is the price you pay.', + }, + { + icon: 'tabler-plane-tilt', + title: 'Optional Pilot tier', + description: 'Hand off the ops work at $99/mo. We run patching, monitoring, and deploys; you keep root access on a co-admin model.', + }, + { + icon: 'tabler-shield-check', + title: '14-day money-back', + description: 'Try it for two weeks. If it isn’t the right fit, we refund the first cycle, no questions asked.', + }, + { + icon: 'tabler-users', + title: 'Owner-operated', + description: 'Small US team. No 3-tier outsourced support maze. Direct line to the people who built it and run it.', + }, ] const includedFeatures: IncludedItem[] = [ @@ -72,30 +113,74 @@ const includedFeatures: IncludedItem[] = [ { text: 'DDoS protection', comingSoon: true }, ] -// Keys from features JSON that should not be shown as table columns -const internalKeys = new Set([ - 'control_panel', - 'os', - 'ipv4', - 'ipv6', - 'tier', -]) +const comparisonRows = [ + { + feature: 'Free snapshots & rollbacks', + ours: 'ZFS-backed, included', + theirs: '$0.05/GB add-on', + }, + { + feature: 'Talk to engineers, not chatbots', + ours: 'Direct line to ops team', + theirs: 'Tier-1 outsourced', + }, + { + feature: 'Predictable monthly bill', + ours: 'No egress fees on fair-use', + theirs: 'Per-GB egress overages', + }, + { + feature: 'Optional managed (you keep root)', + ours: 'Pilot tier at $99/mo', + theirs: 'Often $200+/mo or unavailable', + }, + { + feature: 'Money-back guarantee', + ours: '14 days, no questions', + theirs: '7 days or none', + }, +] -function getFeature(plan: EstimatorPlan, key: string): string { - return String(plan.features?.[key] ?? '-') -} - -function formatPrice(plan: EstimatorPlan): string { - const price = parseFloat(plan.price) || 0 - return price % 1 === 0 ? `$${price}` : `$${price.toFixed(2)}` -} +const faqs = [ + { + question: 'How quickly is my VPS provisioned?', + answer: 'Within seconds of completing checkout. You’ll get the root password (or your SSH key gets installed) on the same screen, and the VPS is bootable immediately. No queue, no manual approval.', + }, + { + question: 'Which operating systems can I install?', + answer: 'Ubuntu (20.04, 22.04, 24.04), Debian (11, 12), Rocky Linux 9, AlmaLinux 9, CentOS Stream, and Windows Server 2019/2022 with your own license. Custom ISO uploads are supported via the VirtFusion panel.', + }, + { + question: 'Can I upgrade or downgrade my plan later?', + answer: 'Yes. Upgrades resize on the next reboot; downgrades happen at the next billing cycle. Resizes preserve your data and IP. Contact us if you need a custom build between tiers.', + }, + { + question: 'What’s your refund policy?', + answer: '14-day money-back guarantee on the first cycle, no questions asked. After that, refunds are pro-rated against unused time on annual plans.', + }, + { + question: 'Do you offer DDoS protection?', + answer: 'Volumetric DDoS protection is on the roadmap and will be free for all VPS plans when it ships. In the meantime, the network has standard upstream filtering and you can request null-routing of attack targets via support.', + }, + { + question: 'Can I get rDNS / PTR control on my IPv4?', + answer: 'Yes — every VPS plan includes self-service rDNS / PTR record control through the VirtFusion panel. Useful if you’re running a mail server or anything that needs forward-confirmed DNS.', + }, + { + question: 'Where are the servers physically located?', + answer: 'All VPS plans are hosted in our Atlanta, GA datacenter. EU and West Coast regions are on the roadmap.', + }, + { + question: 'Do you help with migrations from another provider?', + answer: 'Yes. Open a ticket before you order and we’ll help size the right plan and transfer your existing setup. Pilot-tier customers get migration assistance included; Self/Basic/Pro plans get free guidance, paid hands-on labor.', + }, +] function prefillEstimator(planId: number): void { estimator.setPlan(planId) if (typeof window !== 'undefined') { const url = estimator.shareUrl window.history.replaceState({}, '', url) - // Smooth-scroll up to the estimator const el = document.querySelector('.estimator-section') if (el) el.scrollIntoView({ behavior: 'smooth', block: 'start' }) } @@ -113,7 +198,7 @@ function prefillEstimator(planId: number): void { Virtual Private Servers

- High-performance VPS hosting with RAID 10 SSD storage, dedicated resources, and full root access from our Atlanta, GA datacenter. + Atlanta-based VPS hosting from a small team that picks up the phone. ZFS-backed reliability, predictable billing, and real root access.

Starting at just ${{ startingPrice }}/mo @@ -140,82 +225,82 @@ function prefillEstimator(planId: number): void { :account-url="accountUrl" /> - + - +

- +
-

{{ feature.title }}

-

{{ feature.description }}

+

{{ item.title }}

+

{{ item.description }}

- +
- -
- - - - Plan - CPU - RAM - Storage - Bandwidth - Price - - - - - - {{ plan.name }} - {{ getFeature(plan, 'cpu') }} - {{ getFeature(plan, 'ram') }} - {{ getFeature(plan, 'storage') }} - {{ getFeature(plan, 'bandwidth') }} - {{ formatPrice(plan) }}/mo - -
- - Order Now - - - Estimate → - -
- - - -
-
-
+

Standard VPS

+ + + + + + +

Storage-focused

+ + + + + @@ -252,12 +337,36 @@ function prefillEstimator(planId: number): void {
+ + + + + + + +
+ + + + +
+
-

Ready to Get Started?

+

Ready to spin one up?

- Deploy your VPS in seconds with full root access, DDoS protection, and expert support. + Deploy in seconds. Real humans on support. 14-day money-back if it's not the right fit.

@@ -276,3 +385,10 @@ function prefillEstimator(planId: number): void {
+ +