diff --git a/website/.vitepress/config.mts b/website/.vitepress/config.mts
index fa9d8f4441..74058d4cca 100644
--- a/website/.vitepress/config.mts
+++ b/website/.vitepress/config.mts
@@ -160,14 +160,13 @@ export default defineConfig({
},
logo: '/img/brand/logo.svg',
nav: [
- { text: 'Sync', link: '/sync', activeMatch: '/sync' },
- { text: 'Products', link: '/products', activeMatch: '/products' },
- { text: 'Cloud', link: '/cloud', activeMatch: '/cloud' },
- { text: 'Docs', link: '/docs/intro', activeMatch: '/docs/' },
- { text: 'Demos', link: '/demos', activeMatch: '/demos' },
- { text: 'Blog', link: '/blog', activeMatch: '/blog' },
- { text: 'About', link: '/about/community', activeMatch: '/about/' },
- { component: 'NavSignupButton' },
+ { text: 'Product', link: '/product/electric', activeMatch: '/product/' },
+ { text: 'Pricing', link: '/pricing', activeMatch: '/pricing' },
+ { text: 'Docs', link: '/docs/intro', activeMatch: '/docs/'},
+ { text: 'Demos', link: '/demos', activeMatch: '/demos'},
+ { text: 'Blog', link: '/blog', activeMatch: '/blog'},
+ { text: 'About', link: '/about/community', activeMatch: '/about/'},
+ { component: 'NavSignupButton' }
],
search: {
provider: 'local',
@@ -196,49 +195,6 @@ export default defineConfig({
],
},
],
- '/use-cases': [
- {
- text: 'Use cases',
- items: [
- {
- text: 'Replace data fetching with data sync',
- link: '/use-cases/data-sync',
- },
- {
- text: 'Build resilient software that works offline',
- link: '/use-cases/local-first-software',
- },
- // {
- // text: 'Provision data into dev and test environments',
- // link: '/use-cases/dev-and-test'
- // },
- //{
- // text: 'Add multi-user collaboration to your apps',
- // link: '/use-cases/multi-user'
- //},
- {
- text: 'Automate cache invalidation',
- link: '/use-cases/cache-invalidation',
- },
- //{
- // text: 'Hydrating edge workers',
- // link: '/use-cases/edge-workers'
- //},
- //{
- // text: 'Partial replicas for distributed cloud services',
- // link: '/use-cases/cloud-services'
- //},
- {
- text: 'Retrieve data for local AI',
- link: '/use-cases/local-ai',
- },
- {
- text: 'Reduce your cloud costs',
- link: '/use-cases/cloud-costs',
- },
- ],
- },
- ],
'/docs': [
{
text: 'Docs',
diff --git a/website/.vitepress/theme/Layout.vue b/website/.vitepress/theme/Layout.vue
index aeac4693e6..00a53c9ada 100644
--- a/website/.vitepress/theme/Layout.vue
+++ b/website/.vitepress/theme/Layout.vue
@@ -58,12 +58,13 @@ onMounted(() => {
getComputedStyle(document.documentElement).getPropertyValue('--vp-nav-height')
)
})
+const shouldShowReleasebanner = frontmatter.hideReleaseBanner || !hasSidebar
[Ingress/Egress illustration — to be designed]
+ We don't charge for egress, data delivery, fan-out, active users,
+ concurrent users, clients, connections, seats, apps, sources — or monthly
+ bills under $5/month.
+
+ We uniquely can do this because we deliver real-time data through
+ existing CDN infrastructure. Using caching and request-collapsing to handle
+ concurrency at the CDN layer.
+
+ Let's chat
+
+ through your requirements and
+
+
+ to
+
+
+ see
+
+ how we can help.
+ Lorem ipsum answer one. Placeholder content to be replaced. Lorem ipsum answer two. Placeholder content to be replaced. Lorem ipsum answer three. Placeholder content to be replaced. Lorem ipsum answer four. Placeholder content to be replaced. Lorem ipsum answer five. Placeholder content to be replaced.
+
+
-It shouldn't take long before the source `state` becomes `active` and you're ready to make your first API request.
+When the source `state` is `active`, you're ready to make your first API request.
### Making API Requests
@@ -170,6 +170,18 @@ export async function GET(req: Request) {
### Pricing
-Electric Cloud is currently free in public BETA. We'll be launching low-cost, usage-based pricing soon (by the end of Q3 2025).
+Electric Cloud has a generous free tier and paid plans with usage limits and other features. See the [Pricing page](/pricing) for more details.
-Electric Cloud will always provide a generous free tier, so many apps will roll over with zero cost. If your plan is to use Electric in a larger app (more than 1,000 monthly active users) please reach out to make sure we can fully support you and to get a sense of what the future pricing will be like.
\ No newline at end of file
+### Support
+
+Let us know if you have any questions. We'll be very happy to help. You can ask questions on [Discord](https://discord.electric-sql.com) or email us directly at [sales@electric-sql.com](mailto:sales@electric-sql.com).
+
+
diff --git a/website/data/plans/accelerate.yaml b/website/data/plans/accelerate.yaml
new file mode 100644
index 0000000000..8bd7ae366d
--- /dev/null
+++ b/website/data/plans/accelerate.yaml
@@ -0,0 +1,15 @@
+name: 'Accelerate'
+order: 40
+type: service
+
+who: 'Lorem ipsum dolor sit amet'
+featuresTitle: 'Direct access'
+features:
+ - 'Lorem ipsum'
+ - 'Lorem ipsum'
+ - 'Lorem ipsum'
+
+ctaText: 'Contact sales'
+ctaHref: '/about/contact#sales'
+ctaTheme: 'alt'
+priceColor: 'ddn'
diff --git a/website/data/plans/enterprise.yaml b/website/data/plans/enterprise.yaml
new file mode 100644
index 0000000000..d2fcbc3a49
--- /dev/null
+++ b/website/data/plans/enterprise.yaml
@@ -0,0 +1,29 @@
+name: 'Enterprise'
+order: 50
+type: enterprise
+
+who: 'Lorem ipsum dolor sit amet'
+featuresTitle: 'Bespoke solutions'
+features:
+ - 'Lorem ipsum'
+ - 'Lorem ipsum'
+ - 'Lorem ipsum'
+
+limits:
+ maxDatabases: 'Unlimited'
+ streamTTL: 'Unlimited'
+
+ maxShapes: 'Unlimited'
+ maxUsersPerWorkspace: 'Unlimited'
+
+featureGates:
+ postgresSubqueries: true
+
+commitment: 'Custom'
+support: 'Custom'
+
+ctaText: 'Contact sales'
+ctaTextSmall: 'Contact'
+ctaHref: '/about/contact#sales'
+ctaTheme: 'alt'
+priceColor: 'ddn'
diff --git a/website/data/plans/payg.yaml b/website/data/plans/payg.yaml
new file mode 100644
index 0000000000..4fcfe9acbb
--- /dev/null
+++ b/website/data/plans/payg.yaml
@@ -0,0 +1,38 @@
+name: 'Pay as you go'
+order: 10
+type: tier
+
+monthlyFee: 0
+discountPercent: 0
+priceQualifier: '/ month'
+
+limits:
+ maxDatabases: 10
+ streamTTL: 'Up to 7 days'
+ maxShapes: 10000
+ maxUsersPerWorkspace: 50
+
+featureGates:
+ postgresSubqueries: false
+
+commitment: 'None'
+support: 'Community (Discord)'
+
+who: 'Developers getting started or projects with low usage'
+pricingTitle: 'Usage-based pricing'
+pricing:
+ - '$1 per 1M writes (Durable Streams)'
+ - '$3 per 1M writes (Postgres Sync)'
+ - '$0.10 per GB-month storage'
+
+featuresTitle: 'Includes'
+features:
+ - 'Up to 10 databases'
+ - '**Unlimited** Durable Streams'
+ - 'Up to 10K shapes'
+ - 'Community support (Discord)'
+
+ctaText: 'Sign up now'
+ctaTextSmall: 'Sign up'
+ctaHref: 'https://dashboard.electric-sql.cloud'
+ctaTheme: 'brand'
diff --git a/website/data/plans/pro.yaml b/website/data/plans/pro.yaml
new file mode 100644
index 0000000000..3c2041dd9d
--- /dev/null
+++ b/website/data/plans/pro.yaml
@@ -0,0 +1,41 @@
+name: 'Pro'
+order: 20
+type: tier
+
+monthlyFee: 249
+discountPercent: 10
+priceQualifier: '/ month'
+
+limits:
+ maxDatabases: 50
+ streamTTL: 'User-defined'
+ maxShapes: 100000
+ maxUsersPerWorkspace: 50
+
+featureGates:
+ postgresSubqueries: true
+
+commitment: '6 months'
+support: 'Priority email'
+
+who: 'Growing teams that need higher limits and priority support'
+pricingTitle: 'Usage-based pricing'
+pricing:
+ - '$1 per 1M writes (Durable Streams)'
+ - '$3 per 1M writes (Postgres Sync)'
+ - '$0.10 per GB-month storage'
+ - '10% discount on metered usage'
+
+featuresTitle: 'Includes'
+features:
+ - 'Up to 50 databases'
+ - '**Unlimited** Durable Streams'
+ - 'Up to 100K shapes'
+ - '6-month commitment, auto-renew'
+ - 'Early access to features'
+ - 'Priority email support'
+
+ctaText: 'Sign up now'
+ctaTextSmall: 'Sign up'
+ctaHref: 'https://dashboard.electric-sql.cloud?plan=pro'
+ctaTheme: 'brand'
diff --git a/website/data/plans/scale.yaml b/website/data/plans/scale.yaml
new file mode 100644
index 0000000000..d55609263c
--- /dev/null
+++ b/website/data/plans/scale.yaml
@@ -0,0 +1,41 @@
+name: 'Scale'
+order: 30
+type: tier
+
+monthlyFee: 1999
+discountPercent: 20
+priceQualifier: '/ month'
+
+limits:
+ maxDatabases: 'Unlimited'
+ streamTTL: 'User-defined'
+ maxShapes: 'Unlimited'
+ maxUsersPerWorkspace: 50
+
+featureGates:
+ postgresSubqueries: true
+
+commitment: '12 months'
+support: 'Direct access to founders'
+
+who: 'High-traffic products that need maximum capacity and hands-on support'
+pricingTitle: 'Usage-based pricing'
+pricing:
+ - '$1 per 1M writes (Durable Streams)'
+ - '$3 per 1M writes (Postgres Sync)'
+ - '$0.10 per GB-month storage'
+ - '20% discount on metered usage'
+
+featuresTitle: 'Includes'
+features:
+ - '**Unlimited** databases'
+ - '**Unlimited** Durable Streams'
+ - '**Unlimited** shapes'
+ - '12-month commitment, auto-renew'
+ - 'Early access to features'
+ - 'Direct access to founders'
+
+ctaText: 'Sign up now'
+ctaTextSmall: 'Sign up'
+ctaHref: 'https://dashboard.electric-sql.cloud?plan=scale'
+ctaTheme: 'brand'
diff --git a/website/data/pricing.data.ts b/website/data/pricing.data.ts
new file mode 100644
index 0000000000..7d6df36e92
--- /dev/null
+++ b/website/data/pricing.data.ts
@@ -0,0 +1,52 @@
+import fs from 'node:fs'
+import path from 'node:path'
+import { parse } from 'yaml'
+
+export default {
+ watch: [`./plans/*.yaml`, `./pricing.yaml`],
+
+ load(files) {
+ // Separate global config from plan files
+ const configFile = files.find(
+ (f) => f.endsWith(`pricing.yaml`) && !f.includes(`plans/`)
+ )
+ const planFiles = files.filter((f) => f !== configFile)
+
+ const config = parse(fs.readFileSync(configFile, `utf-8`))
+
+ const plans = planFiles
+ .map((file) => {
+ const slug = path.basename(file, `.yaml`)
+ const data = parse(fs.readFileSync(file, `utf-8`))
+
+ // Derive effective rates for tier plans (per-service write rates)
+ if (data.type === `tier` && data.discountPercent !== undefined) {
+ const discount = data.discountPercent / 100
+ data.effectiveDurableStreamsWriteRate = +(
+ config.baseRates.durableStreamsWritesPerMillion *
+ (1 - discount)
+ ).toFixed(4)
+ data.effectivePostgresSyncWriteRate = +(
+ config.baseRates.postgresSyncWritesPerMillion *
+ (1 - discount)
+ ).toFixed(4)
+ data.effectiveRetentionRate = +(
+ config.baseRates.retentionPerGBMonth *
+ (1 - discount)
+ ).toFixed(4)
+ }
+
+ return { slug, ...data }
+ })
+ .sort((a, b) => (a.order || 999) - (b.order || 999))
+
+ const tiers = plans.filter((p) => p.type === `tier`)
+ const services = plans.filter((p) => p.type === `service`)
+ const enterprise = plans.filter((p) => p.type === `enterprise`)
+ const comparisonPlans = plans.filter(
+ (p) => p.type === `tier` || p.type === `enterprise`
+ )
+
+ return { config, plans, tiers, services, enterprise, comparisonPlans }
+ },
+}
diff --git a/website/data/pricing.yaml b/website/data/pricing.yaml
new file mode 100644
index 0000000000..ef645cf728
--- /dev/null
+++ b/website/data/pricing.yaml
@@ -0,0 +1,49 @@
+# Base rates (PAYG, before any discount)
+# Postgres Sync writes carry a premium because filtering shapes is
+# significantly more compute-intensive than appending to a durable stream.
+baseRates:
+ durableStreamsWritesPerMillion: 1 # $1 per 1M durable-stream writes (baseline)
+ postgresSyncWritesPerMillion: 3 # $3 per 1M Postgres-sync writes (premium)
+ retentionPerGBMonth: 0.10 # $0.10 per GB-month (same for both services)
+
+# Write unit definition
+writeUnitSizeKB: 10 # Each write is up to 10KB; larger messages auto-chunk
+
+# PAYG waiver
+paygWaiverThreshold: 5 # Bills under $5/mo waived (display-only; authoritative billing threshold is defined in the billing system)
+
+# Calculator feature checkboxes
+# Each defines: label, description, minimumTier
+# Valid minimumTier values: payg | pro | scale (must match plan file slugs)
+calculatorFeatures:
+ - id: premiumSupport
+ label: 'Premium support'
+ description: 'Priority email support'
+ minimumTier: pro
+ - id: networkSecurity
+ label: 'Network security controls'
+ description: 'VPC peering and IP allowlists'
+ minimumTier: pro
+ - id: earlyAccess
+ label: 'Early feature access'
+ description: 'Access to beta features'
+ minimumTier: pro
+ - id: founderAccess
+ label: 'Direct access to founders'
+ description: 'Proactive hands-on support'
+ minimumTier: scale
+
+# Workload scenarios for comparison table (placeholder — human fills in real numbers)
+workloadScenarios:
+ - id: appDev
+ label: 'Typical app development'
+ description: 'Lorem ipsum dolor sit amet'
+ durableStreamsWritesPerMonth: null # Human fills in
+ postgresSyncWritesPerMonth: null # Human fills in
+ retentionGB: null # Human fills in
+ - id: aiStreaming
+ label: 'AI token streaming'
+ description: 'Lorem ipsum dolor sit amet'
+ durableStreamsWritesPerMonth: null # Human fills in
+ postgresSyncWritesPerMonth: null # Human fills in
+ retentionGB: null # Human fills in
diff --git a/website/pricing.md b/website/pricing.md
new file mode 100644
index 0000000000..379cfb60bd
--- /dev/null
+++ b/website/pricing.md
@@ -0,0 +1,408 @@
+---
+layout: home
+title: Pricing
+description: >-
+ Electric Cloud has usage-based pricing with unlimited data delivery. Pay for writes and retention, not egress.
+hideReleaseBanner: true
+---
+
+
+
+
+
+
+
Unlimited data delivery
+ Using existing CDN infrastructure
+
+ Compare plans
+
+
+
+ Dive into the details to see
+
+ what's
+
+ right for you.
+
+ Get in touch
+ Lorem ipsum question one?
+ Lorem ipsum question two?
+ Lorem ipsum question three?
+ Lorem ipsum question four?
+ Lorem ipsum question five?
+