@aglyn/aglyn 1.0.0-beta.220 → 1.0.0-beta.222
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +15 -11
- package/src/lib/app-utils/agent-openapi.js +1 -1
- package/src/lib/app-utils/agent-openapi.js.map +1 -1
- package/src/lib/app-utils/analytics-events.d.ts +3 -2
- package/src/lib/app-utils/analytics-events.js +3 -2
- package/src/lib/app-utils/analytics-events.js.map +1 -1
- package/src/lib/app-utils/api-plugins.d.ts +30 -0
- package/src/lib/app-utils/api-plugins.js +24 -1
- package/src/lib/app-utils/api-plugins.js.map +1 -1
- package/src/lib/app-utils/author-html.d.ts +1 -1
- package/src/lib/app-utils/author-html.js.map +1 -1
- package/src/lib/app-utils/bandwidth-cap.d.ts +12 -1
- package/src/lib/app-utils/bandwidth-cap.js +17 -1
- package/src/lib/app-utils/bandwidth-cap.js.map +1 -1
- package/src/lib/app-utils/compose-reusable-components.d.ts +19 -0
- package/src/lib/app-utils/compose-reusable-components.js +116 -26
- package/src/lib/app-utils/compose-reusable-components.js.map +1 -1
- package/src/lib/app-utils/console-routes.d.ts +4 -0
- package/src/lib/app-utils/console-routes.js +3 -0
- package/src/lib/app-utils/console-routes.js.map +1 -1
- package/src/lib/app-utils/contacts.d.ts +71 -0
- package/src/lib/app-utils/contacts.js +55 -0
- package/src/lib/app-utils/contacts.js.map +1 -1
- package/src/lib/app-utils/contexts.d.ts +1 -0
- package/src/lib/app-utils/contexts.js +1 -0
- package/src/lib/app-utils/contexts.js.map +1 -1
- package/src/lib/app-utils/crm-email-templates.js +21 -4
- package/src/lib/app-utils/crm-email-templates.js.map +1 -1
- package/src/lib/app-utils/crm-kinds.d.ts +2 -0
- package/src/lib/app-utils/crm-kinds.js +1 -0
- package/src/lib/app-utils/crm-kinds.js.map +1 -1
- package/src/lib/app-utils/crm.d.ts +1199 -67
- package/src/lib/app-utils/crm.js +1951 -310
- package/src/lib/app-utils/crm.js.map +1 -1
- package/src/lib/app-utils/csv-import.d.ts +10 -38
- package/src/lib/app-utils/csv-import.js +17 -42
- package/src/lib/app-utils/csv-import.js.map +1 -1
- package/src/lib/app-utils/csv.d.ts +32 -11
- package/src/lib/app-utils/csv.js +43 -5
- package/src/lib/app-utils/csv.js.map +1 -1
- package/src/lib/app-utils/default-site.d.ts +116 -0
- package/src/lib/app-utils/default-site.js +1024 -0
- package/src/lib/app-utils/default-site.js.map +1 -0
- package/src/lib/app-utils/docs-help.generated.d.ts +23 -23
- package/src/lib/app-utils/docs-help.generated.js +47 -10
- package/src/lib/app-utils/docs-help.generated.js.map +1 -1
- package/src/lib/app-utils/docs-index.generated.js +746 -151
- package/src/lib/app-utils/docs-index.generated.js.map +1 -1
- package/src/lib/app-utils/draft-placeholders.d.ts +76 -0
- package/src/lib/app-utils/draft-placeholders.js +115 -0
- package/src/lib/app-utils/draft-placeholders.js.map +1 -0
- package/src/lib/app-utils/entity-picker-context.d.ts +19 -15
- package/src/lib/app-utils/entity-picker-context.js +4 -4
- package/src/lib/app-utils/entity-picker-context.js.map +1 -1
- package/src/lib/app-utils/expand-repeatables.d.ts +66 -10
- package/src/lib/app-utils/expand-repeatables.js +88 -14
- package/src/lib/app-utils/expand-repeatables.js.map +1 -1
- package/src/lib/app-utils/forms.d.ts +33 -22
- package/src/lib/app-utils/forms.js +47 -28
- package/src/lib/app-utils/forms.js.map +1 -1
- package/src/lib/app-utils/full-use-cost.d.ts +277 -0
- package/src/lib/app-utils/full-use-cost.js +421 -0
- package/src/lib/app-utils/full-use-cost.js.map +1 -0
- package/src/lib/app-utils/health-report.js +33 -0
- package/src/lib/app-utils/health-report.js.map +1 -1
- package/src/lib/app-utils/leaving-notice.d.ts +96 -0
- package/src/lib/app-utils/leaving-notice.js +157 -0
- package/src/lib/app-utils/leaving-notice.js.map +1 -0
- package/src/lib/app-utils/llms-txt.d.ts +20 -0
- package/src/lib/app-utils/llms-txt.js +7 -1
- package/src/lib/app-utils/llms-txt.js.map +1 -1
- package/src/lib/app-utils/media-asset-facts.d.ts +16 -1
- package/src/lib/app-utils/media-asset-facts.js +40 -13
- package/src/lib/app-utils/media-asset-facts.js.map +1 -1
- package/src/lib/app-utils/media-bandwidth.d.ts +52 -0
- package/src/lib/app-utils/media-bandwidth.js +94 -0
- package/src/lib/app-utils/media-bandwidth.js.map +1 -0
- package/src/lib/app-utils/media-ref.d.ts +241 -33
- package/src/lib/app-utils/media-ref.js +324 -43
- package/src/lib/app-utils/media-ref.js.map +1 -1
- package/src/lib/app-utils/media-src.d.ts +8 -8
- package/src/lib/app-utils/media-src.js +27 -11
- package/src/lib/app-utils/media-src.js.map +1 -1
- package/src/lib/app-utils/media-takedown-reach.d.ts +4 -1
- package/src/lib/app-utils/media-takedown-reach.js +6 -3
- package/src/lib/app-utils/media-takedown-reach.js.map +1 -1
- package/src/lib/app-utils/notifications.d.ts +1 -1
- package/src/lib/app-utils/notifications.js +2 -0
- package/src/lib/app-utils/notifications.js.map +1 -1
- package/src/lib/app-utils/operator-alerts.js +17 -0
- package/src/lib/app-utils/operator-alerts.js.map +1 -1
- package/src/lib/app-utils/organizations.d.ts +51 -2
- package/src/lib/app-utils/organizations.js +56 -3
- package/src/lib/app-utils/organizations.js.map +1 -1
- package/src/lib/app-utils/page-record-sources.d.ts +87 -0
- package/src/lib/app-utils/page-record-sources.js +53 -0
- package/src/lib/app-utils/page-record-sources.js.map +1 -0
- package/src/lib/app-utils/paid-media-source.d.ts +3 -7
- package/src/lib/app-utils/paid-media-source.js +5 -19
- package/src/lib/app-utils/paid-media-source.js.map +1 -1
- package/src/lib/app-utils/person-erasure.d.ts +5 -2
- package/src/lib/app-utils/person-erasure.js.map +1 -1
- package/src/lib/app-utils/picklists.d.ts +187 -0
- package/src/lib/app-utils/picklists.js +320 -0
- package/src/lib/app-utils/picklists.js.map +1 -0
- package/src/lib/app-utils/plan-entitlements.d.ts +220 -50
- package/src/lib/app-utils/plan-entitlements.js +309 -115
- package/src/lib/app-utils/plan-entitlements.js.map +1 -1
- package/src/lib/app-utils/realm-host-surface.generated.js +2 -0
- package/src/lib/app-utils/realm-host-surface.generated.js.map +1 -1
- package/src/lib/app-utils/release-flags.d.ts +1 -1
- package/src/lib/app-utils/release-flags.js +11 -0
- package/src/lib/app-utils/release-flags.js.map +1 -1
- package/src/lib/app-utils/rendered-widths.d.ts +121 -0
- package/src/lib/app-utils/rendered-widths.js +211 -0
- package/src/lib/app-utils/rendered-widths.js.map +1 -0
- package/src/lib/app-utils/repeat-sources.d.ts +2 -1
- package/src/lib/app-utils/repeat-sources.js.map +1 -1
- package/src/lib/app-utils/screen-link-context-value.d.ts +7 -0
- package/src/lib/app-utils/screen-link-context-value.js.map +1 -1
- package/src/lib/app-utils/screen-link-context.js +14 -2
- package/src/lib/app-utils/screen-link-context.js.map +1 -1
- package/src/lib/app-utils/screen-route.d.ts +157 -36
- package/src/lib/app-utils/screen-route.js +191 -41
- package/src/lib/app-utils/screen-route.js.map +1 -1
- package/src/lib/app-utils/seo-audit.d.ts +11 -1
- package/src/lib/app-utils/seo-audit.js +33 -13
- package/src/lib/app-utils/seo-audit.js.map +1 -1
- package/src/lib/app-utils/seo-keywords.d.ts +11 -0
- package/src/lib/app-utils/seo-keywords.js +19 -5
- package/src/lib/app-utils/seo-keywords.js.map +1 -1
- package/src/lib/app-utils/seo-page-facts.d.ts +47 -4
- package/src/lib/app-utils/seo-page-facts.js +136 -31
- package/src/lib/app-utils/seo-page-facts.js.map +1 -1
- package/src/lib/app-utils/seo-site-scan.d.ts +42 -4
- package/src/lib/app-utils/seo-site-scan.js +113 -12
- package/src/lib/app-utils/seo-site-scan.js.map +1 -1
- package/src/lib/app-utils/server.d.ts +5 -4
- package/src/lib/app-utils/server.js +14 -5
- package/src/lib/app-utils/server.js.map +1 -1
- package/src/lib/app-utils/site-icon-set.d.ts +195 -0
- package/src/lib/app-utils/site-icon-set.js +351 -0
- package/src/lib/app-utils/site-icon-set.js.map +1 -0
- package/src/lib/app-utils/site-interactions.d.ts +101 -4
- package/src/lib/app-utils/site-interactions.js +120 -4
- package/src/lib/app-utils/site-interactions.js.map +1 -1
- package/src/lib/app-utils/starter-template-nodes.d.ts +7 -0
- package/src/lib/app-utils/starter-template-nodes.js +3 -0
- package/src/lib/app-utils/starter-template-nodes.js.map +1 -1
- package/src/lib/app-utils/starter-templates.d.ts +5 -19
- package/src/lib/app-utils/starter-templates.js +5 -49
- package/src/lib/app-utils/starter-templates.js.map +1 -1
- package/src/lib/app-utils/transfer-launcher-context.d.ts +136 -0
- package/src/lib/app-utils/transfer-launcher-context.js +23 -0
- package/src/lib/app-utils/transfer-launcher-context.js.map +1 -0
- package/src/lib/app-utils/transfer-resume-import.d.ts +39 -0
- package/src/lib/app-utils/transfer-resume-import.js +128 -0
- package/src/lib/app-utils/transfer-resume-import.js.map +1 -0
- package/src/lib/app-utils/upgrade-proposal.d.ts +66 -0
- package/src/lib/app-utils/upgrade-proposal.js +95 -0
- package/src/lib/app-utils/upgrade-proposal.js.map +1 -0
- package/src/lib/app-utils/utc-month.d.ts +33 -0
- package/src/lib/app-utils/utc-month.js +35 -0
- package/src/lib/app-utils/utc-month.js.map +1 -0
- package/src/lib/app-utils/visitor-record-ceiling.d.ts +4 -4
- package/src/lib/app-utils/visitor-record-ceiling.js +4 -4
- package/src/lib/app-utils/visitor-record-ceiling.js.map +1 -1
- package/src/lib/app-utils/wire-nodes.d.ts +39 -19
- package/src/lib/app-utils/wire-nodes.js +120 -34
- package/src/lib/app-utils/wire-nodes.js.map +1 -1
- package/src/lib/data-transfer/access.d.ts +74 -0
- package/src/lib/data-transfer/access.js +93 -0
- package/src/lib/data-transfer/access.js.map +1 -0
- package/src/lib/data-transfer/derive.d.ts +246 -0
- package/src/lib/data-transfer/derive.js +1007 -0
- package/src/lib/data-transfer/derive.js.map +1 -0
- package/src/lib/data-transfer/export-file.d.ts +46 -0
- package/src/lib/data-transfer/export-file.js +146 -0
- package/src/lib/data-transfer/export-file.js.map +1 -0
- package/src/lib/data-transfer/field-catalog.d.ts +134 -0
- package/src/lib/data-transfer/field-catalog.js +278 -0
- package/src/lib/data-transfer/field-catalog.js.map +1 -0
- package/src/lib/data-transfer/header-match.d.ts +129 -0
- package/src/lib/data-transfer/header-match.js +367 -0
- package/src/lib/data-transfer/header-match.js.map +1 -0
- package/src/lib/data-transfer/index.d.ts +34 -0
- package/src/lib/data-transfer/index.js +40 -0
- package/src/lib/data-transfer/index.js.map +1 -0
- package/src/lib/data-transfer/job.d.ts +190 -0
- package/src/lib/data-transfer/job.js +229 -0
- package/src/lib/data-transfer/job.js.map +1 -0
- package/src/lib/data-transfer/lookup.d.ts +45 -0
- package/src/lib/data-transfer/lookup.js +71 -0
- package/src/lib/data-transfer/lookup.js.map +1 -0
- package/src/lib/data-transfer/match.d.ts +99 -0
- package/src/lib/data-transfer/match.js +244 -0
- package/src/lib/data-transfer/match.js.map +1 -0
- package/src/lib/data-transfer/package-plan.d.ts +205 -0
- package/src/lib/data-transfer/package-plan.js +475 -0
- package/src/lib/data-transfer/package-plan.js.map +1 -0
- package/src/lib/data-transfer/package.d.ts +181 -0
- package/src/lib/data-transfer/package.js +426 -0
- package/src/lib/data-transfer/package.js.map +1 -0
- package/src/lib/data-transfer/picklist-map.d.ts +139 -0
- package/src/lib/data-transfer/picklist-map.js +271 -0
- package/src/lib/data-transfer/picklist-map.js.map +1 -0
- package/src/lib/data-transfer/plan.d.ts +176 -0
- package/src/lib/data-transfer/plan.js +451 -0
- package/src/lib/data-transfer/plan.js.map +1 -0
- package/src/lib/data-transfer/policy.d.ts +170 -0
- package/src/lib/data-transfer/policy.js +378 -0
- package/src/lib/data-transfer/policy.js.map +1 -0
- package/src/lib/data-transfer/resource.d.ts +211 -0
- package/src/lib/data-transfer/resource.js +241 -0
- package/src/lib/data-transfer/resource.js.map +1 -0
- package/src/lib/data-transfer/review.d.ts +70 -0
- package/src/lib/data-transfer/review.js +233 -0
- package/src/lib/data-transfer/review.js.map +1 -0
- package/src/lib/data-transfer/similarity.d.ts +40 -0
- package/src/lib/data-transfer/similarity.js +106 -0
- package/src/lib/data-transfer/similarity.js.map +1 -0
- package/src/lib/data-transfer/site-package.d.ts +365 -0
- package/src/lib/data-transfer/site-package.js +1077 -0
- package/src/lib/data-transfer/site-package.js.map +1 -0
- package/src/lib/data-transfer/source.d.ts +74 -0
- package/src/lib/data-transfer/source.js +293 -0
- package/src/lib/data-transfer/source.js.map +1 -0
- package/src/lib/data-transfer/transfer-api.d.ts +898 -0
- package/src/lib/data-transfer/transfer-api.js +107 -0
- package/src/lib/data-transfer/transfer-api.js.map +1 -0
- package/src/lib/foundation/definitions/org-billing.types.d.ts +31 -0
- package/src/lib/foundation/definitions/org-billing.types.js.map +1 -1
- package/src/lib/foundation/definitions/organization.types.d.ts +42 -1
- package/src/lib/foundation/definitions/organization.types.js.map +1 -1
- package/src/lib/foundation/definitions/platform.types.d.ts +6 -4
- package/src/lib/foundation/definitions/platform.types.js.map +1 -1
- package/src/lib/foundation/index.d.ts +1 -1
- package/src/lib/foundation/index.js.map +1 -1
- package/src/lib/plugin-manager/feature-plugins.d.ts +91 -2
- package/src/lib/plugin-manager/feature-plugins.js +48 -3
- package/src/lib/plugin-manager/feature-plugins.js.map +1 -1
- package/src/lib/plugin-manager/first-party-plugins.generated.d.ts +56 -0
- package/src/lib/plugin-manager/first-party-plugins.generated.js +1132 -27
- package/src/lib/plugin-manager/first-party-plugins.generated.js.map +1 -1
- package/src/lib/plugin-manager/index.d.ts +0 -1
- package/src/lib/plugin-manager/index.js +0 -1
- package/src/lib/plugin-manager/index.js.map +1 -1
- package/src/lib/plugin-manager/interaction-recipes.d.ts +142 -0
- package/src/lib/plugin-manager/interaction-recipes.js +104 -0
- package/src/lib/plugin-manager/interaction-recipes.js.map +1 -0
- package/src/lib/plugin-manager/interaction-step-checks.d.ts +66 -0
- package/src/lib/plugin-manager/interaction-step-checks.js +86 -0
- package/src/lib/plugin-manager/interaction-step-checks.js.map +1 -0
- package/src/lib/plugin-manager/plugin-artifact-types.d.ts +235 -0
- package/src/lib/plugin-manager/plugin-artifact-types.js +99 -0
- package/src/lib/plugin-manager/plugin-artifact-types.js.map +1 -0
- package/src/lib/plugin-manager/plugin-contact-capture.d.ts +8 -0
- package/src/lib/plugin-manager/plugin-contact-capture.js.map +1 -1
- package/src/lib/plugin-manager/plugin-conversion-credit.d.ts +216 -0
- package/src/lib/plugin-manager/plugin-conversion-credit.js +91 -0
- package/src/lib/plugin-manager/plugin-conversion-credit.js.map +1 -0
- package/src/lib/plugin-manager/plugin-entity-pickers.d.ts +83 -0
- package/src/lib/plugin-manager/plugin-entity-pickers.js +87 -0
- package/src/lib/plugin-manager/plugin-entity-pickers.js.map +1 -0
- package/src/lib/plugin-manager/plugin-host-resources.d.ts +6 -0
- package/src/lib/plugin-manager/plugin-host-resources.js +6 -1
- package/src/lib/plugin-manager/plugin-host-resources.js.map +1 -1
- package/src/lib/plugin-manager/plugin-intake-gates.d.ts +75 -0
- package/src/lib/plugin-manager/plugin-intake-gates.js +49 -0
- package/src/lib/plugin-manager/plugin-intake-gates.js.map +1 -0
- package/src/lib/plugin-manager/plugin-jobs.d.ts +5 -5
- package/src/lib/plugin-manager/plugin-jobs.js +7 -7
- package/src/lib/plugin-manager/plugin-jobs.js.map +1 -1
- package/src/lib/plugin-manager/plugin-live-paths.d.ts +70 -0
- package/src/lib/plugin-manager/plugin-live-paths.js +66 -0
- package/src/lib/plugin-manager/plugin-live-paths.js.map +1 -0
- package/src/lib/plugin-manager/plugin-org-erasure.d.ts +3 -2
- package/src/lib/plugin-manager/plugin-org-erasure.js +30 -5
- package/src/lib/plugin-manager/plugin-org-erasure.js.map +1 -1
- package/src/lib/plugin-manager/plugin-person-erasure.d.ts +68 -9
- package/src/lib/plugin-manager/plugin-person-erasure.js +196 -51
- package/src/lib/plugin-manager/plugin-person-erasure.js.map +1 -1
- package/src/lib/plugin-manager/plugin-person-records.d.ts +275 -0
- package/src/lib/plugin-manager/plugin-person-records.js +107 -0
- package/src/lib/plugin-manager/plugin-person-records.js.map +1 -0
- package/src/lib/plugin-manager/plugin-record-counts.d.ts +76 -0
- package/src/lib/plugin-manager/plugin-record-counts.js +49 -0
- package/src/lib/plugin-manager/plugin-record-counts.js.map +1 -0
- package/src/lib/plugin-manager/plugin-record-email-state.d.ts +26 -0
- package/src/lib/plugin-manager/plugin-record-email-state.js +16 -0
- package/src/lib/plugin-manager/plugin-record-email-state.js.map +1 -1
- package/src/lib/plugin-manager/plugin-record-index.d.ts +10 -0
- package/src/lib/plugin-manager/plugin-record-index.js.map +1 -1
- package/src/lib/plugin-manager/plugin-record-lists.d.ts +86 -6
- package/src/lib/plugin-manager/plugin-record-lists.js +42 -5
- package/src/lib/plugin-manager/plugin-record-lists.js.map +1 -1
- package/src/lib/plugin-manager/plugin-record-origin.d.ts +79 -0
- package/src/lib/plugin-manager/plugin-record-origin.js +46 -0
- package/src/lib/plugin-manager/plugin-record-origin.js.map +1 -0
- package/src/lib/plugin-manager/plugin-record-pages.d.ts +37 -0
- package/src/lib/plugin-manager/plugin-record-pages.js +52 -0
- package/src/lib/plugin-manager/plugin-record-pages.js.map +1 -0
- package/src/lib/plugin-manager/plugin-record-timeline.d.ts +60 -0
- package/src/lib/plugin-manager/plugin-record-timeline.js +16 -0
- package/src/lib/plugin-manager/plugin-record-timeline.js.map +1 -1
- package/src/lib/plugin-manager/plugin-resource-drafts.d.ts +5 -5
- package/src/lib/plugin-manager/plugin-resource-drafts.js.map +1 -1
- package/src/lib/plugin-manager/plugin-revocations.d.ts +64 -0
- package/src/lib/plugin-manager/plugin-revocations.js +47 -0
- package/src/lib/plugin-manager/plugin-revocations.js.map +1 -0
- package/src/lib/plugin-manager/plugin-send-tallies.d.ts +69 -0
- package/src/lib/plugin-manager/plugin-send-tallies.js +45 -0
- package/src/lib/plugin-manager/plugin-send-tallies.js.map +1 -0
- package/src/lib/plugin-manager/plugin-server-steps.d.ts +170 -0
- package/src/lib/plugin-manager/plugin-server-steps.js +116 -0
- package/src/lib/plugin-manager/plugin-server-steps.js.map +1 -0
- package/src/lib/plugin-manager/plugin-site-bundle.d.ts +40 -0
- package/src/lib/plugin-manager/plugin-site-bundle.js +4 -0
- package/src/lib/plugin-manager/plugin-site-bundle.js.map +1 -1
- package/src/lib/plugin-manager/plugin-site-export.d.ts +57 -1
- package/src/lib/plugin-manager/plugin-site-export.js +23 -10
- package/src/lib/plugin-manager/plugin-site-export.js.map +1 -1
- package/src/lib/plugin-manager/plugin-sitemap-readers.d.ts +146 -0
- package/src/lib/plugin-manager/plugin-sitemap-readers.js +110 -0
- package/src/lib/plugin-manager/plugin-sitemap-readers.js.map +1 -0
- package/src/lib/plugin-manager/plugin-transfer-resources.d.ts +714 -0
- package/src/lib/plugin-manager/plugin-transfer-resources.js +443 -0
- package/src/lib/plugin-manager/plugin-transfer-resources.js.map +1 -0
- package/src/lib/plugin-manager/plugin-usage-axes.d.ts +54 -5
- package/src/lib/plugin-manager/plugin-usage-axes.js +11 -3
- package/src/lib/plugin-manager/plugin-usage-axes.js.map +1 -1
- package/src/lib/plugin-manager/plugin-user-erasure.js +9 -1
- package/src/lib/plugin-manager/plugin-user-erasure.js.map +1 -1
- package/src/lib/plugin-manager/plugin-visitor-doors.d.ts +104 -0
- package/src/lib/plugin-manager/plugin-visitor-doors.js +108 -0
- package/src/lib/plugin-manager/plugin-visitor-doors.js.map +1 -0
- package/src/lib/plugin-manager/realm-host-aglyn.generated.js +2 -0
- package/src/lib/plugin-manager/realm-host-aglyn.generated.js.map +1 -1
- package/src/lib/plugin-manager/repeat-rows.d.ts +5 -6
- package/src/lib/plugin-manager/repeat-rows.js.map +1 -1
- package/src/lib/app-utils/actions.d.ts +0 -310
- package/src/lib/app-utils/actions.js +0 -506
- package/src/lib/app-utils/actions.js.map +0 -1
- package/src/lib/app-utils/automation-placeholders.d.ts +0 -72
- package/src/lib/app-utils/automation-placeholders.js +0 -207
- package/src/lib/app-utils/automation-placeholders.js.map +0 -1
- package/src/lib/app-utils/dataset-models.d.ts +0 -339
- package/src/lib/app-utils/dataset-models.js +0 -722
- package/src/lib/app-utils/dataset-models.js.map +0 -1
- package/src/lib/app-utils/datasets.d.ts +0 -171
- package/src/lib/app-utils/datasets.js +0 -227
- package/src/lib/app-utils/datasets.js.map +0 -1
- package/src/lib/app-utils/form-abuse-ceiling.d.ts +0 -146
- package/src/lib/app-utils/form-abuse-ceiling.js +0 -158
- package/src/lib/app-utils/form-abuse-ceiling.js.map +0 -1
- package/src/lib/plugin-manager/order-fulfilment.d.ts +0 -142
- package/src/lib/plugin-manager/order-fulfilment.js +0 -104
- package/src/lib/plugin-manager/order-fulfilment.js.map +0 -1
|
@@ -290,12 +290,12 @@ export const PLAN_ENTITLEMENTS = {
|
|
|
290
290
|
sharedLayoutsPerHost: 3,
|
|
291
291
|
templatesPerHost: 50,
|
|
292
292
|
storagePerHostMb: 2048,
|
|
293
|
-
membersPerHost:
|
|
293
|
+
membersPerHost: 2,
|
|
294
294
|
managersPerOrg: 2,
|
|
295
295
|
maxManagersPerOrg: 5,
|
|
296
296
|
maxMembersPerHost: 10,
|
|
297
297
|
// Sized by the same annual-price invariant as Pro's — see that band.
|
|
298
|
-
bandwidthGb:
|
|
298
|
+
bandwidthGb: 15,
|
|
299
299
|
formsPerHost: FORMS_PER_HOST_CEILING,
|
|
300
300
|
variablesPerHost: 25,
|
|
301
301
|
functionsPerHost: 10,
|
|
@@ -325,10 +325,10 @@ export const PLAN_ENTITLEMENTS = {
|
|
|
325
325
|
emailSendsPerMonth: 0,
|
|
326
326
|
actionRunsPerMonth: 0,
|
|
327
327
|
apiRequestsPerMonth: 0,
|
|
328
|
-
datasetsPerOrg:
|
|
328
|
+
datasetsPerOrg: 2,
|
|
329
329
|
maxDatasetsPerOrg: 10,
|
|
330
330
|
recordsPerDataset: 1000,
|
|
331
|
-
dataStorageMbPerOrg:
|
|
331
|
+
dataStorageMbPerOrg: 512,
|
|
332
332
|
productsPerHost: 100,
|
|
333
333
|
inventoryLocations: 1,
|
|
334
334
|
posRegisters: 0,
|
|
@@ -394,31 +394,33 @@ export const PLAN_ENTITLEMENTS = {
|
|
|
394
394
|
screensPerHost: 100,
|
|
395
395
|
sharedLayoutsPerHost: UNLIMITED,
|
|
396
396
|
templatesPerHost: UNLIMITED,
|
|
397
|
-
storagePerHostMb:
|
|
398
|
-
membersPerHost:
|
|
399
|
-
managersPerOrg:
|
|
397
|
+
storagePerHostMb: 5120,
|
|
398
|
+
membersPerHost: 3,
|
|
399
|
+
managersPerOrg: 3,
|
|
400
400
|
maxManagersPerOrg: 20,
|
|
401
401
|
maxMembersPerHost: 25,
|
|
402
402
|
// Page views are the largest term of this tier's modeled COGS. One GB is
|
|
403
|
-
// 1,035 views at `ESTIMATED_PAGE_TRANSFER_BYTES`, priced where
|
|
404
|
-
// dearest because it bills in the region that serves a visitor: $0.
|
|
405
|
-
// weight (`perPageView
|
|
406
|
-
// requests once the hosting plan's monthly allowance is
|
|
407
|
-
// (`PAGE_VIEW_CDN_REQUEST_COST_USD
|
|
408
|
-
//
|
|
409
|
-
//
|
|
410
|
-
// was sold.
|
|
403
|
+
// 1,035 views at `ESTIMATED_PAGE_TRANSFER_BYTES`, priced where Vercel is
|
|
404
|
+
// dearest because it bills in the region that serves a visitor: $0.413 of
|
|
405
|
+
// weight (`perPageView` — transfer at $0.35 a decimal GB, reads at nam5)
|
|
406
|
+
// and $0.224 of requests once the hosting plan's monthly allowance is
|
|
407
|
+
// spent (`PAGE_VIEW_CDN_REQUEST_COST_USD` — 57 CDN requests at $3.20 per
|
|
408
|
+
// million and the analytics beacon's function). So a GB of included
|
|
409
|
+
// bandwidth costs $0.637, and the bandwidth band is what decides whether
|
|
410
|
+
// the tier survives a customer spending the whole allowance it was sold.
|
|
411
411
|
//
|
|
412
412
|
// The invariant the band is sized against is the ANNUAL price ($39 a
|
|
413
413
|
// month) net of Stripe's fee, with every band at 100% and the CRM seat
|
|
414
414
|
// and one-to-one email terms counted — the 2026-09-07 pricing decision —
|
|
415
|
-
// at that all-in gigabyte (AGL-3444)
|
|
416
|
-
//
|
|
415
|
+
// at that all-in gigabyte (AGL-3444), and it must cover that cost plus
|
|
416
|
+
// 30%, the same markup the metered overages carry (AGL-3469). 25 GB is
|
|
417
|
+
// what it carries beside the storage and campaign bands it now sits
|
|
418
|
+
// with; every paid band on the ladder is sized the same way.
|
|
417
419
|
// `tier-margin-floor.spec.ts` holds the model and pins the figure.
|
|
418
420
|
//
|
|
419
421
|
// `meteredInfraPassThrough` is true here, so traffic past the band BILLS
|
|
420
422
|
// at the page-view pass-through rather than being refused or absorbed.
|
|
421
|
-
bandwidthGb:
|
|
423
|
+
bandwidthGb: 25,
|
|
422
424
|
formsPerHost: FORMS_PER_HOST_CEILING,
|
|
423
425
|
variablesPerHost: 100,
|
|
424
426
|
functionsPerHost: 50,
|
|
@@ -426,13 +428,13 @@ export const PLAN_ENTITLEMENTS = {
|
|
|
426
428
|
servicesPerHost: UNLIMITED,
|
|
427
429
|
redirectsPerHost: 100,
|
|
428
430
|
contactsPerHost: 10000,
|
|
429
|
-
emailSendsPerMonth:
|
|
431
|
+
emailSendsPerMonth: 2500,
|
|
430
432
|
actionRunsPerMonth: 5000,
|
|
431
433
|
apiRequestsPerMonth: 0,
|
|
432
|
-
datasetsPerOrg:
|
|
434
|
+
datasetsPerOrg: 5,
|
|
433
435
|
maxDatasetsPerOrg: 50,
|
|
434
436
|
recordsPerDataset: 10000,
|
|
435
|
-
dataStorageMbPerOrg:
|
|
437
|
+
dataStorageMbPerOrg: 2048,
|
|
436
438
|
productsPerHost: 2500,
|
|
437
439
|
inventoryLocations: 2,
|
|
438
440
|
posRegisters: 1,
|
|
@@ -504,27 +506,27 @@ export const PLAN_ENTITLEMENTS = {
|
|
|
504
506
|
screensPerHost: UNLIMITED,
|
|
505
507
|
sharedLayoutsPerHost: UNLIMITED,
|
|
506
508
|
templatesPerHost: UNLIMITED,
|
|
507
|
-
storagePerHostMb:
|
|
508
|
-
membersPerHost:
|
|
509
|
-
managersPerOrg:
|
|
509
|
+
storagePerHostMb: 10240,
|
|
510
|
+
membersPerHost: 5,
|
|
511
|
+
managersPerOrg: 5,
|
|
510
512
|
maxManagersPerOrg: 100,
|
|
511
513
|
maxMembersPerHost: 100,
|
|
512
514
|
// Sized by the same annual-price invariant as Pro's — see that band.
|
|
513
|
-
bandwidthGb:
|
|
515
|
+
bandwidthGb: 45,
|
|
514
516
|
formsPerHost: FORMS_PER_HOST_CEILING,
|
|
515
517
|
variablesPerHost: 1000,
|
|
516
518
|
functionsPerHost: 250,
|
|
517
519
|
workflowsPerHost: 100,
|
|
518
520
|
servicesPerHost: UNLIMITED,
|
|
519
521
|
redirectsPerHost: UNLIMITED,
|
|
520
|
-
contactsPerHost:
|
|
521
|
-
emailSendsPerMonth:
|
|
522
|
+
contactsPerHost: 30000,
|
|
523
|
+
emailSendsPerMonth: 15000,
|
|
522
524
|
actionRunsPerMonth: 50000,
|
|
523
|
-
apiRequestsPerMonth:
|
|
524
|
-
datasetsPerOrg:
|
|
525
|
+
apiRequestsPerMonth: 1500,
|
|
526
|
+
datasetsPerOrg: 10,
|
|
525
527
|
maxDatasetsPerOrg: 250,
|
|
526
528
|
recordsPerDataset: 100000,
|
|
527
|
-
dataStorageMbPerOrg:
|
|
529
|
+
dataStorageMbPerOrg: 10240,
|
|
528
530
|
productsPerHost: 10000,
|
|
529
531
|
inventoryLocations: 4,
|
|
530
532
|
posRegisters: 2,
|
|
@@ -576,13 +578,13 @@ export const PLAN_ENTITLEMENTS = {
|
|
|
576
578
|
screensPerHost: UNLIMITED,
|
|
577
579
|
sharedLayoutsPerHost: UNLIMITED,
|
|
578
580
|
templatesPerHost: UNLIMITED,
|
|
579
|
-
storagePerHostMb:
|
|
580
|
-
membersPerHost:
|
|
581
|
-
managersPerOrg:
|
|
581
|
+
storagePerHostMb: 15360,
|
|
582
|
+
membersPerHost: 5,
|
|
583
|
+
managersPerOrg: 5,
|
|
582
584
|
maxManagersPerOrg: 150,
|
|
583
585
|
maxMembersPerHost: 150,
|
|
584
586
|
// Sized by the same annual-price invariant as Pro's — see that band.
|
|
585
|
-
bandwidthGb:
|
|
587
|
+
bandwidthGb: 70,
|
|
586
588
|
formsPerHost: FORMS_PER_HOST_CEILING,
|
|
587
589
|
variablesPerHost: 5000,
|
|
588
590
|
functionsPerHost: 500,
|
|
@@ -590,13 +592,13 @@ export const PLAN_ENTITLEMENTS = {
|
|
|
590
592
|
servicesPerHost: UNLIMITED,
|
|
591
593
|
redirectsPerHost: UNLIMITED,
|
|
592
594
|
contactsPerHost: 100000,
|
|
593
|
-
emailSendsPerMonth:
|
|
595
|
+
emailSendsPerMonth: 25000,
|
|
594
596
|
actionRunsPerMonth: 100000,
|
|
595
|
-
apiRequestsPerMonth:
|
|
596
|
-
datasetsPerOrg:
|
|
597
|
+
apiRequestsPerMonth: 5000,
|
|
598
|
+
datasetsPerOrg: 15,
|
|
597
599
|
maxDatasetsPerOrg: 500,
|
|
598
600
|
recordsPerDataset: 500000,
|
|
599
|
-
dataStorageMbPerOrg:
|
|
601
|
+
dataStorageMbPerOrg: 25600,
|
|
600
602
|
productsPerHost: 25000,
|
|
601
603
|
inventoryLocations: 6,
|
|
602
604
|
posRegisters: 3,
|
|
@@ -645,13 +647,13 @@ export const PLAN_ENTITLEMENTS = {
|
|
|
645
647
|
screensPerHost: UNLIMITED,
|
|
646
648
|
sharedLayoutsPerHost: UNLIMITED,
|
|
647
649
|
templatesPerHost: UNLIMITED,
|
|
648
|
-
storagePerHostMb:
|
|
649
|
-
membersPerHost:
|
|
650
|
-
managersPerOrg:
|
|
650
|
+
storagePerHostMb: 20480,
|
|
651
|
+
membersPerHost: 5,
|
|
652
|
+
managersPerOrg: 10,
|
|
651
653
|
maxManagersPerOrg: 250,
|
|
652
654
|
maxMembersPerHost: 250,
|
|
653
655
|
// Sized by the same annual-price invariant as Pro's — see that band.
|
|
654
|
-
bandwidthGb:
|
|
656
|
+
bandwidthGb: 80,
|
|
655
657
|
formsPerHost: FORMS_PER_HOST_CEILING,
|
|
656
658
|
variablesPerHost: UNLIMITED,
|
|
657
659
|
functionsPerHost: 1000,
|
|
@@ -661,11 +663,11 @@ export const PLAN_ENTITLEMENTS = {
|
|
|
661
663
|
contactsPerHost: 150000,
|
|
662
664
|
emailSendsPerMonth: 65000,
|
|
663
665
|
actionRunsPerMonth: 250000,
|
|
664
|
-
apiRequestsPerMonth:
|
|
665
|
-
datasetsPerOrg:
|
|
666
|
+
apiRequestsPerMonth: 17000,
|
|
667
|
+
datasetsPerOrg: 25,
|
|
666
668
|
maxDatasetsPerOrg: 1000,
|
|
667
669
|
recordsPerDataset: 1000000,
|
|
668
|
-
dataStorageMbPerOrg:
|
|
670
|
+
dataStorageMbPerOrg: 51200,
|
|
669
671
|
productsPerHost: UNLIMITED,
|
|
670
672
|
inventoryLocations: 10,
|
|
671
673
|
posRegisters: 5,
|
|
@@ -718,13 +720,13 @@ export const PLAN_ENTITLEMENTS = {
|
|
|
718
720
|
screensPerHost: UNLIMITED,
|
|
719
721
|
sharedLayoutsPerHost: UNLIMITED,
|
|
720
722
|
templatesPerHost: UNLIMITED,
|
|
721
|
-
storagePerHostMb:
|
|
722
|
-
membersPerHost:
|
|
723
|
-
managersPerOrg:
|
|
723
|
+
storagePerHostMb: 20480,
|
|
724
|
+
membersPerHost: 5,
|
|
725
|
+
managersPerOrg: 10,
|
|
724
726
|
maxManagersPerOrg: 500,
|
|
725
727
|
maxMembersPerHost: 1000,
|
|
726
728
|
// Sized by the same annual-price invariant as Pro's — see that band.
|
|
727
|
-
bandwidthGb:
|
|
729
|
+
bandwidthGb: 395,
|
|
728
730
|
formsPerHost: FORMS_PER_HOST_CEILING,
|
|
729
731
|
variablesPerHost: UNLIMITED,
|
|
730
732
|
functionsPerHost: UNLIMITED,
|
|
@@ -734,11 +736,11 @@ export const PLAN_ENTITLEMENTS = {
|
|
|
734
736
|
contactsPerHost: 500000,
|
|
735
737
|
emailSendsPerMonth: 130000,
|
|
736
738
|
actionRunsPerMonth: 1000000,
|
|
737
|
-
apiRequestsPerMonth:
|
|
738
|
-
datasetsPerOrg:
|
|
739
|
+
apiRequestsPerMonth: 85000,
|
|
740
|
+
datasetsPerOrg: 50,
|
|
739
741
|
maxDatasetsPerOrg: 5000,
|
|
740
742
|
recordsPerDataset: UNLIMITED,
|
|
741
|
-
dataStorageMbPerOrg:
|
|
743
|
+
dataStorageMbPerOrg: 204800,
|
|
742
744
|
productsPerHost: UNLIMITED,
|
|
743
745
|
inventoryLocations: 50,
|
|
744
746
|
posRegisters: 20,
|
|
@@ -828,12 +830,12 @@ export const PLAN_ENTITLEMENTS = {
|
|
|
828
830
|
screensPerHost: UNLIMITED,
|
|
829
831
|
sharedLayoutsPerHost: UNLIMITED,
|
|
830
832
|
templatesPerHost: UNLIMITED,
|
|
831
|
-
storagePerHostMb:
|
|
832
|
-
membersPerHost:
|
|
833
|
-
managersPerOrg:
|
|
833
|
+
storagePerHostMb: 40960,
|
|
834
|
+
membersPerHost: 10,
|
|
835
|
+
managersPerOrg: 20,
|
|
834
836
|
maxManagersPerOrg: 1000,
|
|
835
837
|
maxMembersPerHost: 2000,
|
|
836
|
-
bandwidthGb:
|
|
838
|
+
bandwidthGb: 790,
|
|
837
839
|
formsPerHost: FORMS_PER_HOST_CEILING,
|
|
838
840
|
variablesPerHost: UNLIMITED,
|
|
839
841
|
functionsPerHost: UNLIMITED,
|
|
@@ -843,11 +845,11 @@ export const PLAN_ENTITLEMENTS = {
|
|
|
843
845
|
contactsPerHost: 1000000,
|
|
844
846
|
emailSendsPerMonth: ENTERPRISE_EMAIL_SENDS_PER_MONTH,
|
|
845
847
|
actionRunsPerMonth: 2000000,
|
|
846
|
-
apiRequestsPerMonth:
|
|
847
|
-
datasetsPerOrg:
|
|
848
|
+
apiRequestsPerMonth: 170000,
|
|
849
|
+
datasetsPerOrg: 100,
|
|
848
850
|
maxDatasetsPerOrg: 10000,
|
|
849
851
|
recordsPerDataset: UNLIMITED,
|
|
850
|
-
dataStorageMbPerOrg:
|
|
852
|
+
dataStorageMbPerOrg: 409600,
|
|
851
853
|
productsPerHost: UNLIMITED,
|
|
852
854
|
inventoryLocations: 100,
|
|
853
855
|
posRegisters: 40,
|
|
@@ -1142,7 +1144,10 @@ fillPluginPlanEntitlements(PLAN_ENTITLEMENTS);
|
|
|
1142
1144
|
extraCollaboratorMonthlyUsd: 1,
|
|
1143
1145
|
extraDatasetMonthlyUsd: 1,
|
|
1144
1146
|
extraDataGbMonthlyUsd: 0.36,
|
|
1145
|
-
|
|
1147
|
+
// FLOORED at the 50% retail margin, with Agency's: a `/v1` request costs
|
|
1148
|
+
// $0.117 per 1,000 at the dearest region, so $0.25 is the round figure at
|
|
1149
|
+
// or above $0.234 (AGL-3444).
|
|
1150
|
+
extraApiRequestsUsdPer1k: 0.25,
|
|
1146
1151
|
extraAssistCreditsUsdPer1k: 2.25,
|
|
1147
1152
|
aiAddonMonthlyUsd: 99,
|
|
1148
1153
|
// FLOORED at the 50% retail margin, not stepped down again. The ladder
|
|
@@ -1175,7 +1180,8 @@ fillPluginPlanEntitlements(PLAN_ENTITLEMENTS);
|
|
|
1175
1180
|
extraCollaboratorMonthlyUsd: 1,
|
|
1176
1181
|
extraDatasetMonthlyUsd: 1,
|
|
1177
1182
|
extraDataGbMonthlyUsd: 0.36,
|
|
1178
|
-
|
|
1183
|
+
// FLOORED at the 50% retail margin — see Advanced's.
|
|
1184
|
+
extraApiRequestsUsdPer1k: 0.25,
|
|
1179
1185
|
extraAssistCreditsUsdPer1k: 2,
|
|
1180
1186
|
aiAddonMonthlyUsd: 299,
|
|
1181
1187
|
// $0.40, because the band it meters is now FINITE.
|
|
@@ -1767,25 +1773,51 @@ export const STRIPE_PROCESSOR_FEE_FIXED_USD = 0.3;
|
|
|
1767
1773
|
* where the page's generator can read it.
|
|
1768
1774
|
*
|
|
1769
1775
|
* The console keeps importing it from `usage-metering` unchanged.
|
|
1776
|
+
*
|
|
1777
|
+
* It is the margin KEPT: cost + 30% after Stripe's processor fee, not before
|
|
1778
|
+
* it (AGL-3476). A price of cost × 1.3 kept cost × 1.26 once 2.9% came off,
|
|
1779
|
+
* so the published rates are set by {@link METERED_PRICE_MULTIPLE}, and this
|
|
1780
|
+
* stays the figure every full-utilization rule is held to.
|
|
1770
1781
|
*/ export const METERED_MARKUP = 1.3;
|
|
1771
1782
|
/**
|
|
1772
|
-
* What
|
|
1773
|
-
*
|
|
1774
|
-
*
|
|
1775
|
-
*
|
|
1776
|
-
|
|
1783
|
+
* What a passed-through cost is multiplied by to reach its price, so that
|
|
1784
|
+
* cost + 30% survives Stripe's percentage fee: 1.3 ÷ 0.971 ≈ 1.3388
|
|
1785
|
+
* (AGL-3476). The fixed 30¢ is paid by the subscription charge the overage
|
|
1786
|
+
* rides on, so only the percentage is grossed up.
|
|
1787
|
+
*/ export const METERED_PRICE_MULTIPLE = METERED_MARKUP / (1 - STRIPE_PROCESSOR_FEE_PCT);
|
|
1788
|
+
/**
|
|
1789
|
+
* A published overage price: `costPerQuotedUnitUsd` × {@link
|
|
1790
|
+
* METERED_PRICE_MULTIPLE}, rounded UP at the `decimals` it is quoted in, so
|
|
1791
|
+
* the price the page prints and the invoice bills is the same round figure
|
|
1792
|
+
* and never less than the rule. The product is settled to six places before
|
|
1793
|
+
* the ceiling so a figure that is exact in decimal — or a pinned cost carried
|
|
1794
|
+
* to eleven places, like the page-view pair — is not lifted a step by its
|
|
1795
|
+
* tail.
|
|
1796
|
+
*/ export function publishedMeteredPrice(costPerQuotedUnitUsd, decimals) {
|
|
1797
|
+
const scale = 10 ** decimals;
|
|
1798
|
+
return Math.ceil(Number((costPerQuotedUnitUsd * METERED_PRICE_MULTIPLE * scale).toFixed(6))) / scale;
|
|
1799
|
+
}
|
|
1800
|
+
/**
|
|
1801
|
+
* What the REQUESTS behind ONE page view cost once the platform is past its
|
|
1802
|
+
* hosting plan's included request allowance, at the DEAREST region the CDN
|
|
1803
|
+
* and functions bill, in USD per view (AGL-1879, AGL-3444): the CDN requests
|
|
1804
|
+
* a cold load makes, and the one of them that reaches a function — the
|
|
1805
|
+
* analytics beacon. A page view billed past a plan's band is priced at
|
|
1806
|
+
* `(perPageView + this) × METERED_MARKUP` — $0.80 per 1,000 — and every
|
|
1807
|
+
* `bandwidthGb` band is sized with it counted.
|
|
1777
1808
|
*
|
|
1778
1809
|
* ## Why a page view needs a second cost term
|
|
1779
1810
|
*
|
|
1780
|
-
* `perPageView` prices what a view WEIGHS: the bytes it transfers
|
|
1781
|
-
*
|
|
1782
|
-
*
|
|
1783
|
-
*
|
|
1784
|
-
*
|
|
1785
|
-
* (`tools/tenant-page-budget.json`, `wireCalibration.measuredAgainst`)
|
|
1786
|
-
* allowance is about 175,000 views
|
|
1787
|
-
*
|
|
1788
|
-
*
|
|
1811
|
+
* `perPageView` prices what a view WEIGHS: the bytes it transfers, plus the
|
|
1812
|
+
* Firestore reads behind the render. A view also costs per REQUEST, which is
|
|
1813
|
+
* not proportional to weight: Vercel Pro includes 10,000,000 CDN requests a
|
|
1814
|
+
* month, then bills $2.00 to $3.20 per million by region, and a cold load of
|
|
1815
|
+
* `aglyn.com/` makes 57 first-party requests to settle
|
|
1816
|
+
* (`tools/tenant-page-budget.json`, `wireCalibration.measuredAgainst`) — so
|
|
1817
|
+
* the allowance is about 175,000 views a month, platform-wide, and runs out
|
|
1818
|
+
* long before the transfer allowance. One of those requests is the analytics
|
|
1819
|
+
* beacon (`apps/tenant/app/api/analytics/collect`), which runs a function on
|
|
1820
|
+
* every view and writes two counter documents.
|
|
1789
1821
|
*
|
|
1790
1822
|
* ## Why the dearest region
|
|
1791
1823
|
*
|
|
@@ -1794,27 +1826,29 @@ export const STRIPE_PROCESSOR_FEE_FIXED_USD = 0.3;
|
|
|
1794
1826
|
* São Paulo or Cape Town costs what those regions cost, and nothing about a
|
|
1795
1827
|
* plan can choose otherwise. The platform's rule is that no plan is under
|
|
1796
1828
|
* water at any utilization and that "at cost + 30%" is true of every billed
|
|
1797
|
-
* unit, so
|
|
1798
|
-
*
|
|
1799
|
-
* million (here). Past the allowance a view then costs:
|
|
1800
|
-
*
|
|
1801
|
-
* | | weight | requests | cost / 1k | margin at $0.70 |
|
|
1802
|
-
* |-----------------------------------|------------|-----------|-----------|-----------------|
|
|
1803
|
-
* | the page as measured (748.5 KB) | $0.262148 | $0.182400 | $0.4445 | +36.5% |
|
|
1804
|
-
* | the priced basis (1012.8 KB) | $0.354715 | $0.182400 | $0.5371 | +23.3% |
|
|
1805
|
-
*
|
|
1806
|
-
* — at least 30% over cost in every region, which is the claim `/pricing`
|
|
1807
|
-
* makes.
|
|
1829
|
+
* unit, so every Vercel-billed term of a page view is priced where Vercel is
|
|
1830
|
+
* dearest.
|
|
1808
1831
|
*
|
|
1809
1832
|
* ## The figure
|
|
1810
1833
|
*
|
|
1811
|
-
*
|
|
1812
|
-
*
|
|
1813
|
-
*
|
|
1814
|
-
*
|
|
1815
|
-
*
|
|
1816
|
-
*
|
|
1817
|
-
*
|
|
1834
|
+
* Per view, past the allowance, at the dearest region:
|
|
1835
|
+
*
|
|
1836
|
+
* | | |
|
|
1837
|
+
* |--------------------------------------------------------|--------------|
|
|
1838
|
+
* | 57 CDN requests at $3.20 per million | $0.00018240 |
|
|
1839
|
+
* | the beacon's function: 0.4 s billed as active CPU at | $0.00002922 |
|
|
1840
|
+
* | $0.221/hr, 2 GB at $0.0183/GB-hr, $0.60 per million | |
|
|
1841
|
+
* | the beacon's two counter writes at nam5's $0.18/100k | $0.00000360 |
|
|
1842
|
+
* | the beacon's ~1 KB through the function at $0.43/GB | $0.00000044 |
|
|
1843
|
+
* | **requests, measured** | $0.00021566 |
|
|
1844
|
+
*
|
|
1845
|
+
* ($0.399028 weight + $0.215662) × 1.3 is $0.7991 per 1,000, rounded up to
|
|
1846
|
+
* $0.80, and this term is pinned so ($0.399028 + $0.216357) × 1.3 is exactly
|
|
1847
|
+
* $0.80 — "Our cost $0.615385 / You pay $0.80" — with the basis set ABOVE the
|
|
1848
|
+
* measurement as the weight basis is. "At cost + 30%" holds of the cost a
|
|
1849
|
+
* billed view incurs in the dearest region, and so in every other. The 0.4 s
|
|
1850
|
+
* is the one function duration on record (the form-submission route), billed
|
|
1851
|
+
* whole as CPU because nothing measured splits it from I/O wait.
|
|
1818
1852
|
*
|
|
1819
1853
|
* ## ⛔ Not in {@link ORG_COGS_UNIT_RATES_USD}, deliberately
|
|
1820
1854
|
*
|
|
@@ -1827,15 +1861,15 @@ export const STRIPE_PROCESSOR_FEE_FIXED_USD = 0.3;
|
|
|
1827
1861
|
* ## The INCLUDED bands carry it too
|
|
1828
1862
|
*
|
|
1829
1863
|
* A view inside a plan's band makes the same requests as one past it, and
|
|
1830
|
-
* once the platform is past the allowance
|
|
1831
|
-
* the `bandwidthGb` bands are sized with this term counted: $0.
|
|
1832
|
-
* included GB on top of $0.
|
|
1864
|
+
* once the platform is past the allowance they cost the same either way, so
|
|
1865
|
+
* the `bandwidthGb` bands are sized with this term counted: $0.224 per
|
|
1866
|
+
* included GB on top of $0.413 of weight. `tier-margin-floor.spec.ts`
|
|
1833
1867
|
* multiplies it in and pins every tier at 100% of every band.
|
|
1834
1868
|
*
|
|
1835
1869
|
* Lives HERE, beside the markup, for the reason the markup does: the
|
|
1836
1870
|
* `/pricing` generator publishes the cost column from it and cannot import
|
|
1837
1871
|
* anything under `apps/console`.
|
|
1838
|
-
*/ export const PAGE_VIEW_CDN_REQUEST_COST_USD = 0.
|
|
1872
|
+
*/ export const PAGE_VIEW_CDN_REQUEST_COST_USD = 0.00021635711;
|
|
1839
1873
|
/**
|
|
1840
1874
|
* Monthly unit costs for the meters the rollup already records (AGL-1134).
|
|
1841
1875
|
*
|
|
@@ -1868,14 +1902,18 @@ export const STRIPE_PROCESSOR_FEE_FIXED_USD = 0.3;
|
|
|
1868
1902
|
* ## Every Vercel-billed input is priced at Vercel's dearest region
|
|
1869
1903
|
*
|
|
1870
1904
|
* The CDN and functions bill by region, from $0.15 to $0.35 per GB of
|
|
1871
|
-
* transfer, $2.00 to $3.20 per million requests, and $0.128 to
|
|
1872
|
-
* hour of active CPU (memory $0.0106 to $0.0183 per GB-hour), and
|
|
1873
|
-
* cannot choose where its visitors are. So the Vercel share of every
|
|
1874
|
-
* here is priced at the dearest region (AGL-3444): the transfer inside
|
|
1875
|
-
* `perPageView`, the function
|
|
1876
|
-
*
|
|
1877
|
-
*
|
|
1878
|
-
* are priced
|
|
1905
|
+
* transfer (a decimal GB), $2.00 to $3.20 per million requests, and $0.128 to
|
|
1906
|
+
* $0.221 per hour of active CPU (memory $0.0106 to $0.0183 per GB-hour), and
|
|
1907
|
+
* a plan cannot choose where its visitors are. So the Vercel share of every
|
|
1908
|
+
* rate here is priced at the dearest region (AGL-3444): the transfer inside
|
|
1909
|
+
* `perPageView`, the function, CDN request and transfer inside
|
|
1910
|
+
* `perFormSubmission` and `perApiRequest`, and the compute inside `perRun`.
|
|
1911
|
+
*
|
|
1912
|
+
* The GCP shares are priced at the database's own location. Production's
|
|
1913
|
+
* Firestore is `nam5` (read from the Admin API 2026-10-01), at $0.06 per
|
|
1914
|
+
* 100,000 reads, $0.18 per 100,000 writes and $0.18 per GiB-month — twice
|
|
1915
|
+
* the single-region figures — and every Firestore operation in this table is
|
|
1916
|
+
* priced there. Object storage is GCS US multi-region, `storagePerGbMonth`.
|
|
1879
1917
|
*
|
|
1880
1918
|
* Everything else here is a cost-model input ONLY. `dataStoragePerGbMonth`,
|
|
1881
1919
|
* `perApiRequest`, `perContactMonth` and `perEmailSend` price what an org
|
|
@@ -1887,8 +1925,9 @@ export const STRIPE_PROCESSOR_FEE_FIXED_USD = 0.3;
|
|
|
1887
1925
|
* The first three were corrected 2026-08-09 (AGL-1280) — storage $0.03 →
|
|
1888
1926
|
* $0.026 and form submissions $0.0005 → $0.00005 — `perPageView` was
|
|
1889
1927
|
* re-pegged 2026-09-09 (AGL-2711), from $0.0001 to $0.00016153846, and the
|
|
1890
|
-
* last two were re-priced at Vercel's dearest region
|
|
1891
|
-
* (AGL-3444): page views $0.
|
|
1928
|
+
* last two were re-priced at Vercel's dearest region and Firestore's `nam5`
|
|
1929
|
+
* on 2026-10-01 (AGL-3444): page views $0.00039902751, form submissions
|
|
1930
|
+
* $0.000061538462.
|
|
1892
1931
|
* All three MUST be changed here and in `METERED_UNIT_RATES_USD` together. See that
|
|
1893
1932
|
* table for each figure's basis; it is the one a customer is billed against,
|
|
1894
1933
|
* so it is the one that carries the working.
|
|
@@ -1911,11 +1950,44 @@ export const STRIPE_PROCESSOR_FEE_FIXED_USD = 0.3;
|
|
|
1911
1950
|
* against a 1012.8 KB page and neither may move alone: their quotient is
|
|
1912
1951
|
* the cost of a gigabyte's weight, and that — with the request term — is
|
|
1913
1952
|
* what every bandwidthGb band on the ladder is sized against.
|
|
1914
|
-
*/ perPageView: 0.
|
|
1915
|
-
perFormSubmission: 0.
|
|
1916
|
-
/**
|
|
1917
|
-
|
|
1918
|
-
|
|
1953
|
+
*/ perPageView: 0.00039902751,
|
|
1954
|
+
perFormSubmission: 0.000061538462,
|
|
1955
|
+
/**
|
|
1956
|
+
* Firestore-backed dataset bytes — nam5's $0.18 per GiB-month, an order
|
|
1957
|
+
* pricier than object storage.
|
|
1958
|
+
*/ dataStoragePerGbMonth: 0.18,
|
|
1959
|
+
/**
|
|
1960
|
+
* One `/v1` request — $117 per million (AGL-3444).
|
|
1961
|
+
*
|
|
1962
|
+
* Every request is a function invocation behind a CDN request, and it reads
|
|
1963
|
+
* before it answers (`apps/console/utils/api-v1.ts`). The ledger for a
|
|
1964
|
+
* default list page — 25 records, read as 26 — at Vercel's dearest region
|
|
1965
|
+
* and nam5's list prices:
|
|
1966
|
+
*
|
|
1967
|
+
* - reads: the key, the rate-limit window, the org, the month's quota
|
|
1968
|
+
* counter, the site the resource sits under, and the page — 31, at
|
|
1969
|
+
* $0.06 per 100,000 = $0.0000186
|
|
1970
|
+
* - writes: the rate-limit window and the usage counter — 2, at $0.18 per
|
|
1971
|
+
* 100,000 = $0.0000036
|
|
1972
|
+
* - the function, 0.4 s billed as active CPU at $0.221/hr, 2 GB at
|
|
1973
|
+
* $0.0183/GB-hr, $0.60 per million invocations = $0.0000292
|
|
1974
|
+
* - the CDN request: $3.20 per million = $0.0000032
|
|
1975
|
+
* - the response, 25 records at 3 KB — the largest mean document size
|
|
1976
|
+
* measured on production across the collections `/v1` lists (leads,
|
|
1977
|
+
* 3.0 KB; records, contacts, media and the rest 1.0–1.5 KB) — plus 2 KB
|
|
1978
|
+
* of request and envelope, through Fast Data Transfer ($0.35 a GB) and
|
|
1979
|
+
* Fast Origin Transfer ($0.43 a GB), decimal GB = $0.0000615
|
|
1980
|
+
*
|
|
1981
|
+
* $0.0001161, carried up to $0.000117. A page of 100 — the most a client
|
|
1982
|
+
* may ask for — costs about three times that, so the figure is the default
|
|
1983
|
+
* request rather than the ceiling; see the 2026-10-01 decision entry.
|
|
1984
|
+
*/ perApiRequest: 0.000117,
|
|
1985
|
+
/**
|
|
1986
|
+
* One CRM record held for a month. An operator-tuned estimate (AGL-1134),
|
|
1987
|
+
* not built from a per-operation price: at `nam5`'s $0.06 per 100,000 it
|
|
1988
|
+
* covers about 333 reads a record a month, plus the record's storage at
|
|
1989
|
+
* $0.18 per GiB-month — well beyond what a record is read.
|
|
1990
|
+
*/ perContactMonth: 0.0002,
|
|
1919
1991
|
/**
|
|
1920
1992
|
* One delivered email, whatever produced it — $0.90 per 1,000.
|
|
1921
1993
|
*
|
|
@@ -3795,6 +3867,128 @@ export function checkQuota(org, quota, currentUsage) {
|
|
|
3795
3867
|
/** @see pageViewsFromBandwidthGb — the same constant, the other way. */ export function bandwidthGbFromPageViews(pageViews) {
|
|
3796
3868
|
return Math.max(0, Number(pageViews) || 0) * ESTIMATED_PAGE_TRANSFER_BYTES / (1024 * 1024 * 1024);
|
|
3797
3869
|
}
|
|
3870
|
+
/** The decimal GB Vercel bills transfer in (AGL-3444). */ const DECIMAL_GB_BYTES = 1000000000;
|
|
3871
|
+
/** The binary GB `bandwidthGb` and GCS egress are counted in. */ const BINARY_GB_BYTES = 1024 * 1024 * 1024;
|
|
3872
|
+
/**
|
|
3873
|
+
* How long one decimal GB keeps a streaming function open: a viewer draws a
|
|
3874
|
+
* 720p film at about 5 Mbit/s, and the media route reads Storage only as fast
|
|
3875
|
+
* as the viewer takes the bytes (AGL-2810), so the function lives for the
|
|
3876
|
+
* film, not for the transfer — 1,600 seconds a GB.
|
|
3877
|
+
*/ const ORIGIN_MEDIA_STREAM_SECONDS_PER_GB = DECIMAL_GB_BYTES * 8 / 5000000;
|
|
3878
|
+
/**
|
|
3879
|
+
* The range requests one decimal GB arrives in: a player asks for a film a
|
|
3880
|
+
* slice at a time, and a slice of about a megabyte is the small end of what
|
|
3881
|
+
* players ask for, so per-request costs are counted a thousand times a GB.
|
|
3882
|
+
*/ const ORIGIN_MEDIA_REQUESTS_PER_GB = 1000;
|
|
3883
|
+
/**
|
|
3884
|
+
* What ONE DECIMAL GB of video, audio or a file costs to SERVE FROM ORIGIN, by
|
|
3885
|
+
* term, at the dearest region every Vercel term is billed in (AGL-3474).
|
|
3886
|
+
*
|
|
3887
|
+
* The media CDN serves every type the edge must never hold (AGL-1515) on
|
|
3888
|
+
* every request, from origin, so a GB of it pays both of Vercel's transfer
|
|
3889
|
+
* meters and Storage's egress — where a page's GB is mostly answered by the
|
|
3890
|
+
* edge. This is the basis {@link ORIGIN_MEDIA_BANDWIDTH_WEIGHT} is derived
|
|
3891
|
+
* from, and the figure the published "at cost + 30%" has to be true of.
|
|
3892
|
+
*
|
|
3893
|
+
* | term | basis | per decimal GB |
|
|
3894
|
+
* |---|---|---|
|
|
3895
|
+
* | `fastDataTransfer` | Vercel Fast Data Transfer, dearest region, decimal GB | $0.35 |
|
|
3896
|
+
* | `fastOriginTransfer` | Vercel Fast Origin Transfer, dearest region, decimal GB | $0.43 |
|
|
3897
|
+
* | `storageEgress` | GCS internet egress at list, $0.12 per GiB (0–1 TiB) | $0.111759 |
|
|
3898
|
+
* | `streamingMemory` | 2 GB (the function default) at $0.0183/GB-hour, held 1,600 s | $0.016267 |
|
|
3899
|
+
* | `streamingCpu` | 60 s of active CPU at $0.221/hour — an allowance, see below | $0.003683 |
|
|
3900
|
+
* | `requests` | 1,000 range requests × $0.0000070 | $0.007 |
|
|
3901
|
+
* | **total** | | **$0.918709** |
|
|
3902
|
+
*
|
|
3903
|
+
* Each request is a CDN request ($3.20 per million), a function invocation
|
|
3904
|
+
* ($0.60 per million), the media document's read ($0.0000006 at `nam5`), the
|
|
3905
|
+
* day document's counter write ($0.0000018) and two Storage Class B
|
|
3906
|
+
* operations, the metadata read and the object read ($0.0000004 each). The
|
|
3907
|
+
* lockdown, quarantine and rate-limit reads are cached across requests and
|
|
3908
|
+
* cost nothing a request.
|
|
3909
|
+
*
|
|
3910
|
+
* `streamingCpu` is the one unmeasured term. The bytes are copied, not
|
|
3911
|
+
* computed — piping a GB through Node is a few seconds of CPU — and the
|
|
3912
|
+
* minute allowed here is chosen to err high, as every other basis in this
|
|
3913
|
+
* file does.
|
|
3914
|
+
*
|
|
3915
|
+
* ## Storing the bytes is NOT here
|
|
3916
|
+
*
|
|
3917
|
+
* A file in the library is already metered as storage (`storagePerGbMonth`)
|
|
3918
|
+
* and billed past the plan's storage at cost + 30% after card fees; serving
|
|
3919
|
+
* it does not store it again. Adding storage here would charge for the same
|
|
3920
|
+
* bytes twice.
|
|
3921
|
+
*/ export const ORIGIN_MEDIA_SERVE_COST_USD_PER_GB = {
|
|
3922
|
+
fastDataTransfer: 0.35,
|
|
3923
|
+
fastOriginTransfer: 0.43,
|
|
3924
|
+
storageEgress: 0.12 * DECIMAL_GB_BYTES / BINARY_GB_BYTES,
|
|
3925
|
+
streamingMemory: 2 * 0.0183 * ORIGIN_MEDIA_STREAM_SECONDS_PER_GB / 3600,
|
|
3926
|
+
streamingCpu: 60 * 0.221 / 3600,
|
|
3927
|
+
requests: ORIGIN_MEDIA_REQUESTS_PER_GB * (3.2 / 1000000 + 0.6 / 1000000 + 0.0000006 + 0.0000018 + 2 * 0.0000004)
|
|
3928
|
+
};
|
|
3929
|
+
/** {@link ORIGIN_MEDIA_SERVE_COST_USD_PER_GB}, summed: about $0.9187 a decimal GB. */ export const ORIGIN_MEDIA_COST_USD_PER_GB = Object.values(ORIGIN_MEDIA_SERVE_COST_USD_PER_GB).reduce((sum, term)=>sum + term, 0);
|
|
3930
|
+
/**
|
|
3931
|
+
* The published page-view overage, per view: what a billed view costs us
|
|
3932
|
+
* (`perPageView` and the request term) at {@link METERED_PRICE_MULTIPLE},
|
|
3933
|
+
* rounded up to the cent per 1,000 it is quoted in — $0.83 per 1,000. The
|
|
3934
|
+
* same expression as the console's `METERED_BILLED_RATES_USD.perPageView`,
|
|
3935
|
+
* computed here because the weight below is, and a spec holds the two equal.
|
|
3936
|
+
*/ export const PAGE_VIEW_PUBLISHED_PRICE_USD = publishedMeteredPrice((ORG_COGS_UNIT_RATES_USD.perPageView + PAGE_VIEW_CDN_REQUEST_COST_USD) * 1000, 2) / 1000;
|
|
3937
|
+
/**
|
|
3938
|
+
* (a) THE OVERAGE: does counting origin media at `weight` bill a GB of it past
|
|
3939
|
+
* the band at cost + 30%, kept after Stripe's percentage fee?
|
|
3940
|
+
*
|
|
3941
|
+
* A counted GB is `weight` GB of page views at {@link PAGE_VIEW_PUBLISHED_PRICE_USD}.
|
|
3942
|
+
*/ export function originMediaOverageHolds(weight) {
|
|
3943
|
+
const billedPerGbUsd = weight * PAGE_VIEW_PUBLISHED_PRICE_USD * (DECIMAL_GB_BYTES / ESTIMATED_PAGE_TRANSFER_BYTES);
|
|
3944
|
+
return billedPerGbUsd * (1 - STRIPE_PROCESSOR_FEE_PCT) >= METERED_MARKUP * ORIGIN_MEDIA_COST_USD_PER_GB;
|
|
3945
|
+
}
|
|
3946
|
+
/**
|
|
3947
|
+
* (b) THE BAND: does counting origin media at `weight` keep a plan that spends
|
|
3948
|
+
* its whole bandwidth band on it inside what the band was sized on?
|
|
3949
|
+
*
|
|
3950
|
+
* Every `bandwidthGb` band is sized at the cost of the views one GiB buys —
|
|
3951
|
+
* their weight (`perPageView`) and their requests
|
|
3952
|
+
* (`PAGE_VIEW_CDN_REQUEST_COST_USD`), $0.63712 a GiB — and
|
|
3953
|
+
* `tier-margin-floor.spec.ts` holds every tier at 1.3× its full-use cost on
|
|
3954
|
+
* that figure. A GiB of origin media spends `weight` GiB of the band, so the
|
|
3955
|
+
* band holds while `weight` GiB of band costs at least one GiB of media.
|
|
3956
|
+
*/ export function originMediaBandHolds(weight) {
|
|
3957
|
+
const bandCostPerGibUsd = (ORG_COGS_UNIT_RATES_USD.perPageView + PAGE_VIEW_CDN_REQUEST_COST_USD) * pageViewsFromBandwidthGb(1);
|
|
3958
|
+
const originCostPerGibUsd = ORIGIN_MEDIA_COST_USD_PER_GB * BINARY_GB_BYTES / DECIMAL_GB_BYTES;
|
|
3959
|
+
return weight * bandCostPerGibUsd >= originCostPerGibUsd;
|
|
3960
|
+
}
|
|
3961
|
+
/**
|
|
3962
|
+
* How many GB of bandwidth one GB of video, audio or a file served from origin
|
|
3963
|
+
* counts as (AGL-3474, decided by the account owner 2026-10-02): the smallest
|
|
3964
|
+
* weight, in tenths and never below 1, that satisfies BOTH
|
|
3965
|
+
* {@link originMediaOverageHolds} and {@link originMediaBandHolds}.
|
|
3966
|
+
*
|
|
3967
|
+
* One weight rather than a second meter or a second rate, because it moves
|
|
3968
|
+
* the band and the overage together: the Free wall, the abuse ceiling, the
|
|
3969
|
+
* meters, the alerts and the invoice all read media through
|
|
3970
|
+
* `pageViewsFromMediaBytes`, which applies it. At today's bases the overage
|
|
3971
|
+
* needs 1.54 and the band 1.55, so it is 1.6 — the published sentence names
|
|
3972
|
+
* it, and the docs and `/pricing` have to change before it does.
|
|
3973
|
+
*
|
|
3974
|
+
* Derived, never written down: a rate or a band basis that moves re-derives
|
|
3975
|
+
* it, and `media-bandwidth.spec.ts` pins the figure so that a move is a
|
|
3976
|
+
* decision with a red test attached rather than a silent re-price.
|
|
3977
|
+
*/ export const ORIGIN_MEDIA_BANDWIDTH_WEIGHT = (()=>{
|
|
3978
|
+
for(let tenths = 10; tenths <= 1000; tenths += 1){
|
|
3979
|
+
const weight = tenths / 10;
|
|
3980
|
+
if (originMediaOverageHolds(weight) && originMediaBandHolds(weight)) return weight;
|
|
3981
|
+
}
|
|
3982
|
+
throw new Error('no origin-media weight up to 100 covers its cost');
|
|
3983
|
+
})();
|
|
3984
|
+
/**
|
|
3985
|
+
* The sentence every customer surface states the weight in — `/pricing`
|
|
3986
|
+
* beside the metered rates (`tools/marketing/build-pricing-tables.mts`), and
|
|
3987
|
+
* the bandwidth, billing and media docs, which
|
|
3988
|
+
* `media-bandwidth-weight-copy.spec.ts` holds to this exact text. Built from
|
|
3989
|
+
* the derived figure, so a weight that moves turns those red before it can
|
|
3990
|
+
* bill anyone.
|
|
3991
|
+
*/ export const ORIGIN_MEDIA_BANDWIDTH_SENTENCE = 'Video, audio, file downloads and other media served from our servers count ' + `${ORIGIN_MEDIA_BANDWIDTH_WEIGHT}× toward bandwidth, because serving them ` + 'costs more than serving pages.';
|
|
3798
3992
|
/**
|
|
3799
3993
|
* How far past a plan's own included bandwidth the abuse ceiling sits
|
|
3800
3994
|
* (AGL-2155). Three times the bandwidth the customer bought is not growth; it
|
|
@@ -3803,7 +3997,7 @@ export function checkQuota(org, quota, currentUsage) {
|
|
|
3803
3997
|
* It is a CAP, not a price, and it is lower than {@link
|
|
3804
3998
|
* FORM_ABUSE_CEILING_MULTIPLE} because bandwidth is the largest cost line the
|
|
3805
3999
|
* platform carries and the one a stranger can spend on the customer's behalf.
|
|
3806
|
-
* Past the band every 1,000 views bills $0.
|
|
4000
|
+
* Past the band every 1,000 views bills $0.80 against at most $0.62 of real
|
|
3807
4001
|
* cost — the dearest region's — once the CDN's request allowance is spent
|
|
3808
4002
|
* ({@link PAGE_VIEW_CDN_REQUEST_COST_USD}), so the tail is not a loss — but a
|
|
3809
4003
|
* scraper, a hotlinked asset or a botnet still bills the account holder for
|
|
@@ -3819,10 +4013,10 @@ export function checkQuota(org, quota, currentUsage) {
|
|
|
3819
4013
|
* Free includes 2 GB ≈ 2,071 views; 3× would be ~6,212, which a genuinely
|
|
3820
4014
|
* successful hobby site (a post that lands on Hacker News) reaches in an
|
|
3821
4015
|
* afternoon and would be a miserable first experience of the platform.
|
|
3822
|
-
* 100,000 views/month ≈ 96.6 GB ≈ **$
|
|
4016
|
+
* 100,000 views/month ≈ 96.6 GB ≈ **$62 of real COGS** at the dearest
|
|
3823
4017
|
* region (`METERED_UNIT_RATES_USD.perPageView` plus
|
|
3824
4018
|
* `PAGE_VIEW_CDN_REQUEST_COST_USD`) — well above the free band, and an order
|
|
3825
|
-
* of magnitude below the $
|
|
4019
|
+
* of magnitude below the $615 a million views costs. It is the number
|
|
3826
4020
|
* that makes "free stays free" true without making it stingy.
|
|
3827
4021
|
*/ export const BANDWIDTH_ABUSE_CEILING_FLOOR = 100000;
|
|
3828
4022
|
/**
|