Adding a VPN Provider

2026-05-07 · Ben · runbook

Adding a VPN Provider

Time: 15-30 minutes Prerequisites: Provider website access for data, pricing, and SVG icons


Quick Steps

  1. Create src/data/providers/{slug}.json
  2. Create src/content/pages/vpn/{slug}.md
  3. Add 4 SVG icons to public/images/providers/
  4. Generate translation overlays: node scripts/translate-provider-json.mjs --execute --slug {slug}
  5. npm run build

SpeedLab, ProviderGrid, and LogoScroll update automatically.


Step 1: Provider JSON

File: src/data/providers/{slug}.json

The slug is the URL-safe name: nordvpn, expressvpn, ipvanish.

{
  "slug": "https://www.vpn.com/vpn/{slug}/",
  "tagline": "One-line description",
  "website": "https://provider.com",
  "offer_link_1": "/out?partner={slug}",
  "servers": "5,000+",
  "countries": "60+",
  "users": 0,
  "devices": 5,
  "guarantee": "30-day money-back guarantee",
  "plan_features": ["Kill switch included", "24/7 support"],
  "logo_svg_brand": "/images/providers/{slug}-logo-brand.svg",
  "logo_svg_dynamic": "/images/providers/{slug}-logo-neutral.svg",
  "icon_svg_brand": "/images/providers/{slug}-icon-brand.svg",
  "icon_svg_dynamic": "/images/providers/{slug}-icon-neutral.svg",
  "speedlab": {
    "rank": 11,
    "throughput": "Not tested",
    "latency": "N/A",
    "packet_loss": "N/A",
    "stability": "N/A",
    "regular_price": "$10.00/mo",
    "best_price": "$3.00/mo",
    "best_price_duration": "2-year plan"
  },
  "rating": {
    "overall": 75,
    "stars": 3.8,
    "categories": [
      {
        "id": "trust",
        "label": "Trust & Value",
        "score": 20,
        "max": 30,
        "criteria": [
          { "label": "User Sat.", "score": 7, "max": 10, "value": "3.8/5.0", "value_source": "" },
          { "label": "Value", "score": 6, "max": 10, "value": "$3.00/mo", "value_source": "" },
          { "label": "Money-Back", "score": 4, "max": 5, "value": "30 days", "value_source": "" },
          { "label": "Support", "score": 3, "max": 5, "value": "Email", "value_source": "" }
        ]
      },
      {
        "id": "performance",
        "label": "VPN Performance",
        "score": 55,
        "max": 70,
        "criteria": [
          { "label": "Speed", "score": 10, "max": 15, "value": "500 Mbps", "value_source": "speedlab" },
          { "label": "Servers", "score": 8, "max": 10, "value": "5,000+", "value_source": "" },
          { "label": "Devices", "score": 8, "max": 10, "value": "5", "value_source": "" },
          { "label": "Connections", "score": 8, "max": 10, "value": "5", "value_source": "" },
          { "label": "Protocol", "score": 8, "max": 10, "value": "WireGuard", "value_source": "" },
          { "label": "Streaming", "score": 7, "max": 10, "value": "6+ Services", "value_source": "" },
          { "label": "Security", "score": 4, "max": 5, "value": "Audited", "value_source": "" }
        ]
      }
    ]
  },
  "schema": {
    "name": "Provider Name",
    "applicationCategory": "VPN",
    "operatingSystem": "Windows, macOS, iOS, Android, Linux",
    "offers": {
      "price": "36.00",
      "priceCurrency": "USD",
      "priceValidUntil": "2026-12-31",
      "@type": "Offer"
    },
    "review": {
      "reviewRating": { "ratingValue": "3.8", "bestRating": "5", "worstRating": "1", "@type": "Rating" },
      "datePublished": "2026-04-29",
      "dateModified": "2026-04-29",
      "reviewBody": "Short review summary used in JSON-LD.",
      "author": { "@type": "Organization", "name": "VPN.com", "url": "https://www.vpn.com" },
      "publisher": { "@type": "Organization", "name": "VPN.com", "url": "https://www.vpn.com" },
      "@type": "Review"
    },
    "@context": "https://schema.org",
    "@type": "SoftwareApplication"
  },
  "plans": [
    {
      "name": "Standard",
      "duration": "VPN only",
      "good_for": "Users who need basic VPN protection",
      "link": "https://provider.com",
      "pricing": [
        { "period": "Monthly", "price": "$10.00" },
        { "period": "1-year", "price": "$48.00", "discount": "60%" },
        { "period": "2-year", "price": "$72.00", "discount": "70%" }
      ],
      "features": ["All servers included", "Kill switch", "24/7 support"]
    }
  ],
  "meta_description": "Provider Name review: tested for speed, security, and streaming.",
  "pricing_intro": "Provider Name offers monthly and annual plans.",
  "verdict_top_tier": "Provider Name delivers strong performance for everyday browsing, streaming, and privacy.",
  "verdict_solid": "Solid choice for users who prioritize value and simplicity.",
  "review_sections": [
    {
      "heading": "Security & Privacy",
      "content": "<h4><strong>Encryption & Protocols</strong></h4><ul><li><strong>Encryption:</strong> AES-256</li><li><strong>Protocols:</strong> WireGuard, OpenVPN</li></ul>"
    },
    {
      "heading": "Streaming Performance",
      "content": "<h4><strong>Platforms Unblocked</strong></h4><ul><li>Netflix</li><li>Amazon Prime Video</li></ul>"
    },
    {
      "heading": "Ease of Use",
      "content": "<h4><strong>Setup & Interface</strong></h4><p>Simple one-click connect. Available on all major platforms.</p>"
    }
  ]
}

Required fields

FieldDescription
schema.nameDisplay name (e.g. "NordVPN")
taglineOne-line description shown in hero
websiteProvider's official URL
offer_link_1Affiliate link via /out?partner={slug}
serversCount with suffix ("8,900+")
countriesCount with suffix ("129+")
devicesSimultaneous connection limit
guaranteeMoney-back guarantee text
plan_featuresFeatures shared across all plans
speedlabSpeed data. Use "Not tested" if untested
ratingOverall (0-100), stars (0-5), 2 categories
plansAt least 1 plan with pricing tiers
review_sections3 sections: Security, Streaming, Ease of Use
schemaJSON-LD structured data
verdict_top_tierEditorial verdict sentence
meta_descriptionSEO meta description

Scoring Guide

Overall = Trust & Value (max 30) + VPN Performance (max 70)

CriterionMaxScoring
User Satisfaction10Aggregate review scores
Value10Price-to-feature vs competitors
Money-Back530 days = 4-5, 7 days = 2-3, none = 0
Support524/7 live = 5, email = 3, none = 1
Speed15700+ Mbps = 15, 500+ = 10, 300+ = 7
Servers108000+ = 10, 3000+ = 8, 1000+ = 6
Devices10Unlimited = 10, 10 = 10, 5 = 8
Connections10Protocol flexibility and reliability
Protocol10WireGuard = 10, OpenVPN = 7, proprietary = 5
Streaming108+ platforms = 8-10, 4+ = 6, 1-3 = 4
Security5Audited = 5, no-logs claimed = 3, unknown = 1

Step 2: Content Page

File: src/content/pages/vpn/{slug}.md

---
title: "Provider Name Review: Speed, Pricing & Features"
description: "Read our Provider Name review with speed tests, security analysis, and pricing."
date: 2026-04-29
updated: 2026-04-29
template: provider
parent: vpn
focusKeyword: "provider name review"
draft: false
---

**"VPN.com's editors select and review products independently. If you buy through our affiliate links, we may earn commissions, which support our testing."**

## Provider Name History

## Provider Name Features And Benefits

## Provider Name Plans And Pricing

## Is Provider Name Worth It?

## Final Verdict

Step 3: SVG Icons

Place 4 files in public/images/providers/:

FileUsage
{slug}-icon-brand.svgSmall icon, brand colors
{slug}-icon-neutral.svgSmall icon, neutral/gray (dark mode)
{slug}-logo-brand.svgFull logo, brand colors (logo scroll)
{slug}-logo-neutral.svgFull logo, neutral/gray (dark mode)

Requirements: SVG only, viewBox set, no embedded rasters, clean markup (no editor metadata). Source from provider's press kit or website.


Step 4: Build and Verify

npm run build

Auto-updates: SpeedLab table, ProviderGrid, LogoScroll, provider page at /vpn/{slug}/, sitemap.

Verify: provider page renders, Speed Lab shows the provider, logo appears in scroll.


Step 5: Translation Overlays

node scripts/translate-provider-json.mjs --execute --slug {slug}

Creates 9 JSON files at src/data/providers/i18n/{lang}/{slug}.json. Missing fields fall back to English. Without overlays, translated provider pages display English provider text.


Step 6: Deploy

bash scripts/deploy.sh

Files That Don't Need Changes

Only edit src/components/pages/HomePage.astro if changing the hardcoded top-3 provider slugs.


Bulk Addition

node scripts/fetch-provider.mjs --slug ipvanish --url https://ipvanish.com

Crawls the provider's website and generates a draft JSON. Review before committing.