@oxygen-agent/cli 1.987.20 → 1.1010.1
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/README.md +1 -1
- package/dist/admin-primary-providers-render.d.ts +0 -2
- package/dist/admin-primary-providers-render.js +1 -1
- package/dist/browser-login.js +1 -4
- package/dist/column-decision-options.d.ts +20 -0
- package/dist/column-decision-options.js +54 -0
- package/dist/command-manifest.d.ts +3 -2
- package/dist/command-manifest.js +25 -2
- package/dist/credentials.d.ts +1 -1
- package/dist/functions-commands.js +13 -9
- package/dist/help.d.ts +8 -0
- package/dist/help.js +46 -0
- package/dist/index.js +2751 -242
- package/dist/knowledge-mirror.d.ts +2 -2
- package/dist/runtime.d.ts +0 -15
- package/dist/runtime.js +1 -1
- package/dist/search-ai-filter-notice.d.ts +17 -0
- package/dist/search-ai-filter-notice.js +38 -0
- package/dist/session.d.ts +4 -3
- package/dist/skills.d.ts +8 -7
- package/dist/skills.js +58 -20
- package/dist/transcript.d.ts +2 -1
- package/dist/util.d.ts +10 -1
- package/dist/util.js +14 -2
- package/node_modules/@oxygen/cli-ugc/dist/commands.js +296 -140
- package/node_modules/@oxygen/cli-ugc/dist/field-parser.d.ts +9 -0
- package/node_modules/@oxygen/cli-ugc/dist/field-parser.js +34 -0
- package/node_modules/@oxygen/formula/dist/coerce.d.ts +10 -0
- package/node_modules/@oxygen/formula/dist/coerce.js +10 -0
- package/node_modules/@oxygen/formula/dist/formula-functions.js +65 -0
- package/node_modules/@oxygen/formula/dist/hash.d.ts +19 -0
- package/node_modules/@oxygen/formula/dist/hash.js +199 -0
- package/node_modules/@oxygen/formula/dist/value-cleaners.d.ts +6 -1
- package/node_modules/@oxygen/formula/dist/value-cleaners.js +10 -26
- package/node_modules/@oxygen/recipe-sdk/dist/index.d.ts +13 -0
- package/node_modules/@oxygen/shared/dist/array-utils.d.ts +5 -0
- package/node_modules/@oxygen/shared/dist/array-utils.js +11 -0
- package/node_modules/@oxygen/shared/dist/billing.d.ts +99 -22
- package/node_modules/@oxygen/shared/dist/billing.js +195 -40
- package/node_modules/@oxygen/shared/dist/byok-connect.js +5 -0
- package/node_modules/@oxygen/shared/dist/capability-discovery.d.ts +27 -0
- package/node_modules/@oxygen/shared/dist/capability-discovery.js +311 -28
- package/node_modules/@oxygen/shared/dist/cli-http-error.d.ts +8 -0
- package/node_modules/@oxygen/shared/dist/cli-http-error.js +8 -0
- package/node_modules/@oxygen/shared/dist/cli-result.js +1 -0
- package/node_modules/@oxygen/shared/dist/column-autofill.d.ts +52 -0
- package/node_modules/@oxygen/shared/dist/column-autofill.js +62 -0
- package/node_modules/@oxygen/shared/dist/column-decision.d.ts +50 -0
- package/node_modules/@oxygen/shared/dist/column-decision.js +228 -0
- package/node_modules/@oxygen/shared/dist/column-output-fields.js +2 -6
- package/node_modules/@oxygen/shared/dist/company-enrichment-fields.d.ts +113 -0
- package/node_modules/@oxygen/shared/dist/company-enrichment-fields.js +548 -0
- package/node_modules/@oxygen/shared/dist/copilot-skills.generated.d.ts +6 -6
- package/node_modules/@oxygen/shared/dist/copilot-skills.generated.js +6 -6
- package/node_modules/@oxygen/shared/dist/cutover-freeze.d.ts +26 -0
- package/node_modules/@oxygen/shared/dist/cutover-freeze.js +52 -0
- package/node_modules/@oxygen/shared/dist/data-suppliers.d.ts +57 -0
- package/node_modules/@oxygen/shared/dist/data-suppliers.js +59 -0
- package/node_modules/@oxygen/shared/dist/deploy-env.d.ts +74 -0
- package/node_modules/@oxygen/shared/dist/deploy-env.js +82 -0
- package/node_modules/@oxygen/shared/dist/dnc-rules.d.ts +130 -0
- package/node_modules/@oxygen/shared/dist/dnc-rules.js +221 -0
- package/node_modules/@oxygen/shared/dist/enrichment-intents.d.ts +107 -0
- package/node_modules/@oxygen/shared/dist/enrichment-intents.js +809 -0
- package/node_modules/@oxygen/shared/dist/error-message.d.ts +1 -0
- package/node_modules/@oxygen/shared/dist/error-message.js +3 -0
- package/node_modules/@oxygen/shared/dist/error-redaction.js +1 -3
- package/node_modules/@oxygen/shared/dist/external-write-policy.d.ts +33 -0
- package/node_modules/@oxygen/shared/dist/external-write-policy.js +68 -0
- package/node_modules/@oxygen/shared/dist/format-percent.d.ts +8 -0
- package/node_modules/@oxygen/shared/dist/format-percent.js +13 -0
- package/node_modules/@oxygen/shared/dist/freemail-domains.d.ts +81 -0
- package/node_modules/@oxygen/shared/dist/freemail-domains.js +157 -0
- package/node_modules/@oxygen/shared/dist/future-signup-lifecycle-projection.d.ts +1 -0
- package/node_modules/@oxygen/shared/dist/future-signup-lifecycle-projection.js +1 -1
- package/node_modules/@oxygen/shared/dist/hosted-ai.d.ts +60 -4
- package/node_modules/@oxygen/shared/dist/hosted-ai.js +125 -10
- package/node_modules/@oxygen/shared/dist/index.d.ts +15 -0
- package/node_modules/@oxygen/shared/dist/index.js +15 -0
- package/node_modules/@oxygen/shared/dist/json-path.js +1 -3
- package/node_modules/@oxygen/shared/dist/knowledge-bases.js +1 -3
- package/node_modules/@oxygen/shared/dist/knowledge-bootstrap.d.ts +2 -2
- package/node_modules/@oxygen/shared/dist/knowledge-bootstrap.js +2 -2
- package/node_modules/@oxygen/shared/dist/langfuse.d.ts +44 -1
- package/node_modules/@oxygen/shared/dist/langfuse.js +416 -14
- package/node_modules/@oxygen/shared/dist/linkedin-countries.d.ts +33 -0
- package/node_modules/@oxygen/shared/dist/linkedin-countries.js +361 -0
- package/node_modules/@oxygen/shared/dist/linkedin-country-timezones.d.ts +24 -0
- package/node_modules/@oxygen/shared/dist/linkedin-country-timezones.js +276 -0
- package/node_modules/@oxygen/shared/dist/linkedin-message-deletion.d.ts +2 -0
- package/node_modules/@oxygen/shared/dist/linkedin-message-deletion.js +5 -0
- package/node_modules/@oxygen/shared/dist/linkedin-post-keywords.d.ts +44 -0
- package/node_modules/@oxygen/shared/dist/linkedin-post-keywords.js +116 -0
- package/node_modules/@oxygen/shared/dist/linkedin-sequences.d.ts +96 -0
- package/node_modules/@oxygen/shared/dist/linkedin-sequences.js +123 -0
- package/node_modules/@oxygen/shared/dist/llm-durable-capture.d.ts +24 -0
- package/node_modules/@oxygen/shared/dist/llm-durable-capture.js +89 -0
- package/node_modules/@oxygen/shared/dist/llm-prompts.d.ts +75 -0
- package/node_modules/@oxygen/shared/dist/llm-prompts.js +161 -0
- package/node_modules/@oxygen/shared/dist/log-sink-selector.d.ts +39 -0
- package/node_modules/@oxygen/shared/dist/log-sink-selector.js +56 -0
- package/node_modules/@oxygen/shared/dist/log.d.ts +1 -0
- package/node_modules/@oxygen/shared/dist/log.js +6 -1
- package/node_modules/@oxygen/shared/dist/mailbox-egress-ownership.d.ts +90 -0
- package/node_modules/@oxygen/shared/dist/mailbox-egress-ownership.js +130 -0
- package/node_modules/@oxygen/shared/dist/object-storage.d.ts +17 -0
- package/node_modules/@oxygen/shared/dist/object-storage.js +21 -0
- package/node_modules/@oxygen/shared/dist/operational-telemetry.d.ts +24 -0
- package/node_modules/@oxygen/shared/dist/operational-telemetry.js +73 -0
- package/node_modules/@oxygen/shared/dist/otlp-log-sink.d.ts +79 -0
- package/node_modules/@oxygen/shared/dist/otlp-log-sink.js +366 -0
- package/node_modules/@oxygen/shared/dist/plan-capabilities.js +1 -0
- package/node_modules/@oxygen/shared/dist/plan-limits.d.ts +23 -22
- package/node_modules/@oxygen/shared/dist/plan-limits.js +45 -18
- package/node_modules/@oxygen/shared/dist/pricing-sheet.d.ts +48 -41
- package/node_modules/@oxygen/shared/dist/pricing-sheet.js +36 -25
- package/node_modules/@oxygen/shared/dist/pricing-snapshot.generated.d.ts +22 -22
- package/node_modules/@oxygen/shared/dist/pricing-snapshot.generated.js +40 -34
- package/node_modules/@oxygen/shared/dist/product-analytics-environment.js +9 -0
- package/node_modules/@oxygen/shared/dist/product-analytics-events.d.ts +36 -2
- package/node_modules/@oxygen/shared/dist/product-analytics-events.js +36 -1
- package/node_modules/@oxygen/shared/dist/rate-window.d.ts +5 -0
- package/node_modules/@oxygen/shared/dist/rate-window.js +8 -0
- package/node_modules/@oxygen/shared/dist/redaction.js +4 -1
- package/node_modules/@oxygen/shared/dist/research-output-contract.js +1 -3
- package/node_modules/@oxygen/shared/dist/scraper-lane-credential.d.ts +18 -0
- package/node_modules/@oxygen/shared/dist/scraper-lane-credential.js +23 -0
- package/node_modules/@oxygen/shared/dist/search-vocab.js +4 -5
- package/node_modules/@oxygen/shared/dist/select-options.js +6 -1
- package/node_modules/@oxygen/shared/dist/sequence-failures.js +1 -5
- package/node_modules/@oxygen/shared/dist/sequences.d.ts +23 -0
- package/node_modules/@oxygen/shared/dist/sequences.js +115 -5
- package/node_modules/@oxygen/shared/dist/signup-lead-payload.d.ts +80 -0
- package/node_modules/@oxygen/shared/dist/signup-lead-payload.js +198 -0
- package/node_modules/@oxygen/shared/dist/social-capabilities.d.ts +6 -0
- package/node_modules/@oxygen/shared/dist/social-capabilities.js +25 -16
- package/node_modules/@oxygen/shared/dist/social-post-metrics-core.d.ts +32 -0
- package/node_modules/@oxygen/shared/dist/social-post-metrics-core.js +32 -0
- package/node_modules/@oxygen/shared/dist/social-post-metrics-linkedin.d.ts +31 -0
- package/node_modules/@oxygen/shared/dist/social-post-metrics-linkedin.js +103 -0
- package/node_modules/@oxygen/shared/dist/social-post-metrics-series.d.ts +96 -0
- package/node_modules/@oxygen/shared/dist/social-post-metrics-series.js +213 -0
- package/node_modules/@oxygen/shared/dist/social-post-metrics-x.d.ts +13 -0
- package/node_modules/@oxygen/shared/dist/social-post-metrics-x.js +78 -0
- package/node_modules/@oxygen/shared/dist/social-post-metrics.d.ts +36 -0
- package/node_modules/@oxygen/shared/dist/social-post-metrics.js +51 -0
- package/node_modules/@oxygen/shared/dist/spend-safety.d.ts +22 -10
- package/node_modules/@oxygen/shared/dist/spend-safety.js +15 -21
- package/node_modules/@oxygen/shared/dist/sql-rows.d.ts +1 -0
- package/node_modules/@oxygen/shared/dist/sql-rows.js +3 -0
- package/node_modules/@oxygen/shared/dist/stripe-price-catalog.d.ts +36 -0
- package/node_modules/@oxygen/shared/dist/stripe-price-catalog.js +184 -0
- package/node_modules/@oxygen/shared/dist/stripe-subscription-kind.d.ts +41 -0
- package/node_modules/@oxygen/shared/dist/stripe-subscription-kind.js +44 -0
- package/node_modules/@oxygen/shared/dist/table-limits.d.ts +3 -0
- package/node_modules/@oxygen/shared/dist/table-limits.js +3 -0
- package/node_modules/@oxygen/shared/dist/telemetry-export-observer.d.ts +94 -0
- package/node_modules/@oxygen/shared/dist/telemetry-export-observer.js +298 -0
- package/node_modules/@oxygen/shared/dist/telemetry.d.ts +11 -0
- package/node_modules/@oxygen/shared/dist/telemetry.js +28 -2
- package/node_modules/@oxygen/shared/dist/type-guards.d.ts +22 -0
- package/node_modules/@oxygen/shared/dist/type-guards.js +35 -0
- package/node_modules/@oxygen/shared/dist/ugc.d.ts +22 -11
- package/node_modules/@oxygen/shared/dist/ugc.js +10 -0
- package/node_modules/@oxygen/shared/dist/value-readers.d.ts +21 -0
- package/node_modules/@oxygen/shared/dist/value-readers.js +59 -0
- package/node_modules/@oxygen/shared/dist/version.generated.d.ts +1 -0
- package/node_modules/@oxygen/shared/dist/version.generated.js +2 -0
- package/node_modules/@oxygen/shared/dist/version.js +8 -1
- package/node_modules/@oxygen/shared/dist/workspace-event-catalog.js +0 -23
- package/node_modules/@oxygen/shared/dist/workspace-file-storage.d.ts +29 -0
- package/node_modules/@oxygen/shared/dist/workspace-file-storage.js +31 -0
- package/node_modules/@oxygen/shared/package.json +59 -0
- package/node_modules/@oxygen/workflows/dist/graph/expression.js +2 -5
- package/node_modules/@oxygen/workflows/dist/graph/params.js +1 -1
- package/package.json +3 -2
|
@@ -70,8 +70,8 @@ export const PLAN_LIMITS = {
|
|
|
70
70
|
// is bounded by its balance, not by these. The intent is only that no single
|
|
71
71
|
// run can silently eat a first impression.
|
|
72
72
|
agents: {
|
|
73
|
-
maxTotalCredits:
|
|
74
|
-
maxInferenceCredits:
|
|
73
|
+
maxTotalCredits: 250,
|
|
74
|
+
maxInferenceCredits: 150,
|
|
75
75
|
maxUpstreamCostUsd: 10,
|
|
76
76
|
maxUpstreamCostUsdByok: 10,
|
|
77
77
|
},
|
|
@@ -80,7 +80,7 @@ export const PLAN_LIMITS = {
|
|
|
80
80
|
// path over the CLI must be able to complete one real session on the base
|
|
81
81
|
// grant alone. Lowering this would re-create the dead-on-arrival Copilot the
|
|
82
82
|
// split grant exists to prevent.
|
|
83
|
-
copilot: { maxSessionBudgetCredits:
|
|
83
|
+
copilot: { maxSessionBudgetCredits: 500, defaultPerTurnCreditCeiling: 150 },
|
|
84
84
|
signals: { maxEvents: 100, maxWindowDays: 30 },
|
|
85
85
|
tableActions: { maxActionsPerRun: 10 },
|
|
86
86
|
},
|
|
@@ -108,12 +108,12 @@ export const PLAN_LIMITS = {
|
|
|
108
108
|
maxDirectCsvBodyBytes: 10_000_000,
|
|
109
109
|
},
|
|
110
110
|
agents: {
|
|
111
|
-
maxTotalCredits:
|
|
112
|
-
maxInferenceCredits:
|
|
111
|
+
maxTotalCredits: 1_000,
|
|
112
|
+
maxInferenceCredits: 500,
|
|
113
113
|
maxUpstreamCostUsd: 10,
|
|
114
114
|
maxUpstreamCostUsdByok: 250,
|
|
115
115
|
},
|
|
116
|
-
copilot: { maxSessionBudgetCredits:
|
|
116
|
+
copilot: { maxSessionBudgetCredits: 500, defaultPerTurnCreditCeiling: 150 },
|
|
117
117
|
signals: { maxEvents: 200, maxWindowDays: 90 },
|
|
118
118
|
tableActions: { maxActionsPerRun: 25 },
|
|
119
119
|
},
|
|
@@ -141,12 +141,12 @@ export const PLAN_LIMITS = {
|
|
|
141
141
|
maxDirectCsvBodyBytes: 10_000_000,
|
|
142
142
|
},
|
|
143
143
|
agents: {
|
|
144
|
-
maxTotalCredits:
|
|
145
|
-
maxInferenceCredits:
|
|
144
|
+
maxTotalCredits: 2_500,
|
|
145
|
+
maxInferenceCredits: 1_250,
|
|
146
146
|
maxUpstreamCostUsd: 25,
|
|
147
147
|
maxUpstreamCostUsdByok: 250,
|
|
148
148
|
},
|
|
149
|
-
copilot: { maxSessionBudgetCredits:
|
|
149
|
+
copilot: { maxSessionBudgetCredits: 1_000, defaultPerTurnCreditCeiling: 250 },
|
|
150
150
|
signals: { maxEvents: 200, maxWindowDays: 180 },
|
|
151
151
|
tableActions: { maxActionsPerRun: 25 },
|
|
152
152
|
},
|
|
@@ -174,12 +174,12 @@ export const PLAN_LIMITS = {
|
|
|
174
174
|
maxDirectCsvBodyBytes: 10_000_000,
|
|
175
175
|
},
|
|
176
176
|
agents: {
|
|
177
|
-
maxTotalCredits:
|
|
178
|
-
maxInferenceCredits:
|
|
177
|
+
maxTotalCredits: 5_000,
|
|
178
|
+
maxInferenceCredits: 2_500,
|
|
179
179
|
maxUpstreamCostUsd: 50,
|
|
180
180
|
maxUpstreamCostUsdByok: 250,
|
|
181
181
|
},
|
|
182
|
-
copilot: { maxSessionBudgetCredits:
|
|
182
|
+
copilot: { maxSessionBudgetCredits: 2_000, defaultPerTurnCreditCeiling: 500 },
|
|
183
183
|
signals: { maxEvents: 200, maxWindowDays: 365 },
|
|
184
184
|
tableActions: { maxActionsPerRun: 25 },
|
|
185
185
|
},
|
|
@@ -207,27 +207,54 @@ export const PLAN_LIMITS = {
|
|
|
207
207
|
maxDirectCsvBodyBytes: 10_000_000,
|
|
208
208
|
},
|
|
209
209
|
agents: {
|
|
210
|
-
maxTotalCredits:
|
|
211
|
-
maxInferenceCredits:
|
|
210
|
+
maxTotalCredits: 10_000,
|
|
211
|
+
maxInferenceCredits: 5_000,
|
|
212
212
|
maxUpstreamCostUsd: 100,
|
|
213
213
|
maxUpstreamCostUsdByok: 250,
|
|
214
214
|
},
|
|
215
|
-
copilot: { maxSessionBudgetCredits:
|
|
215
|
+
copilot: { maxSessionBudgetCredits: 5_000, defaultPerTurnCreditCeiling: 1_000 },
|
|
216
216
|
signals: { maxEvents: 200, maxWindowDays: 365 },
|
|
217
217
|
tableActions: { maxActionsPerRun: 25 },
|
|
218
218
|
},
|
|
219
219
|
};
|
|
220
|
+
/**
|
|
221
|
+
* Which enforcement rung a rung of the six-rung Oxygen plan lands on.
|
|
222
|
+
*
|
|
223
|
+
* The rungs share one `oxygen` tier, so the ladder has to be re-derived from
|
|
224
|
+
* price. Deliberately scoped to `oxygen` rather than applied to every plan: a
|
|
225
|
+
* blanket price band would regress the grandfathered plans, demoting `pro_149`
|
|
226
|
+
* ($149) to "starter" and `team_399` ($399) to "pro".
|
|
227
|
+
*/
|
|
228
|
+
function oxygenRungLimitsTier(monthlyPriceCents) {
|
|
229
|
+
if (monthlyPriceCents === null)
|
|
230
|
+
return "starter";
|
|
231
|
+
// Thresholds track the ladder these rungs replaced, so nobody's enforcement
|
|
232
|
+
// rung moves for a price they were already paying: Starter was $99, Pro $249,
|
|
233
|
+
// Team $749. A rung sits on the rung of the old plan at or below its price —
|
|
234
|
+
// $499 is below the old Team, so it enforces as "pro".
|
|
235
|
+
if (monthlyPriceCents >= 199_900)
|
|
236
|
+
return "scale";
|
|
237
|
+
if (monthlyPriceCents >= 99_900)
|
|
238
|
+
return "team";
|
|
239
|
+
if (monthlyPriceCents >= 19_900)
|
|
240
|
+
return "pro";
|
|
241
|
+
return "starter";
|
|
242
|
+
}
|
|
220
243
|
/**
|
|
221
244
|
* Map a raw plan-tier string (subscription `tier`, metadata tier, legacy plan
|
|
222
|
-
* key like `growth_250
|
|
223
|
-
* on the unentitled "free" rung;
|
|
245
|
+
* key like `growth_250`, or an Oxygen rung key like `oxygen_499`) onto its
|
|
246
|
+
* enforcement rung. Unknown/absent tiers land on the unentitled "free" rung;
|
|
247
|
+
* enterprise shares "scale".
|
|
224
248
|
*/
|
|
225
249
|
export function limitsTierForPlanTier(tier) {
|
|
226
|
-
const
|
|
250
|
+
const plan = resolveBasePricingPlan(tier);
|
|
251
|
+
const base = plan?.tier;
|
|
227
252
|
if (!base || base === "free")
|
|
228
253
|
return "free";
|
|
229
254
|
if (base === "enterprise")
|
|
230
255
|
return "scale";
|
|
256
|
+
if (base === "oxygen")
|
|
257
|
+
return oxygenRungLimitsTier(plan?.monthlyPriceCents ?? null);
|
|
231
258
|
return base;
|
|
232
259
|
}
|
|
233
260
|
export function planLimitsForTier(tier) {
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* page's "what credits buy" table, the pricing calculator, and docs.
|
|
4
4
|
*
|
|
5
5
|
* Pricing Model 2.0 (founder-ratified 2026-07-14): ONE credit pool pays for
|
|
6
|
-
* everything; 1 USD =
|
|
6
|
+
* everything; 1 USD = 100 credits.
|
|
7
7
|
*
|
|
8
8
|
* THIS FILE NO LONGER DECLARES PRICES. It used to carry hand-copied literals
|
|
9
9
|
* under a comment asking the next person to remember to update them — which is
|
|
@@ -36,9 +36,9 @@
|
|
|
36
36
|
*/
|
|
37
37
|
export { creditsToUsd, usdToCredits } from "./pricing-snapshot.generated.js";
|
|
38
38
|
export declare const PRICING_SHEET_VERIFIED = "2026-07";
|
|
39
|
-
export declare const PRICING_CREDITS_PER_USD =
|
|
40
|
-
/** On-demand top-up price per
|
|
41
|
-
export declare const
|
|
39
|
+
export declare const PRICING_CREDITS_PER_USD = 100;
|
|
40
|
+
/** On-demand top-up price per 100 credits (USD); subscriptions pay $1.00. */
|
|
41
|
+
export declare const TOPUP_USD_PER_100 = 1.25;
|
|
42
42
|
export declare const SENDING_SEAT_USD_CENTS: {
|
|
43
43
|
readonly linkedin: 3000;
|
|
44
44
|
readonly whatsapp: 3000;
|
|
@@ -47,7 +47,7 @@ export declare const SENDING_SEAT_USD_CENTS: {
|
|
|
47
47
|
};
|
|
48
48
|
export declare const MANAGED_INBOX_USD_CENTS = 400;
|
|
49
49
|
export declare const SENDING_DOMAIN_USD_CENTS = 1250;
|
|
50
|
-
export declare const
|
|
50
|
+
export declare const SUBSCRIPTION_USD_PER_100 = 1;
|
|
51
51
|
/**
|
|
52
52
|
* AI column runs, honest 5× of modeled tier COGS.
|
|
53
53
|
*
|
|
@@ -58,28 +58,35 @@ export declare const SUBSCRIPTION_USD_PER_1K = 1;
|
|
|
58
58
|
* quietly mispricing the page.
|
|
59
59
|
*/
|
|
60
60
|
export declare const AI_COLUMN_CREDITS: {
|
|
61
|
-
readonly low:
|
|
62
|
-
readonly medium:
|
|
63
|
-
readonly high:
|
|
61
|
+
readonly low: 1.5;
|
|
62
|
+
readonly medium: 7.5;
|
|
63
|
+
readonly high: 25;
|
|
64
64
|
};
|
|
65
65
|
/**
|
|
66
|
-
* Web-search grounding, billed per
|
|
66
|
+
* Web-search grounding, billed per PROVIDER CALL on top of the model — not a flat
|
|
67
|
+
* adder.
|
|
67
68
|
*
|
|
68
|
-
* This
|
|
69
|
-
*
|
|
70
|
-
*
|
|
71
|
-
*
|
|
72
|
-
* the managed provider's own per-search charge (cogs-rates.ts): exa 35, parallel
|
|
73
|
-
* 5, firecrawl 80 at the default 5 results. The default column runs exa primary
|
|
74
|
-
* with parallel as its one fallback (WEB_SEARCH_ENGINES), so a row costs 35 when
|
|
75
|
-
* the primary answers and reserves 40 for the case where both lanes fire.
|
|
69
|
+
* This replaced `AI_COLUMN_WEB_SEARCH_SURCHARGE_CREDITS = 25`, a real under-quote on
|
|
70
|
+
* a public surface: a leftover from the bundled `*_with_web_search` model tiers that
|
|
71
|
+
* were removed when grounding moved onto native providers, which the billing path
|
|
72
|
+
* never read.
|
|
76
73
|
*
|
|
77
|
-
*
|
|
74
|
+
* The figures below describe the DEFAULT research column, which since D53 discovers
|
|
75
|
+
* then reads: `serper.search` (0.5) finds the URLs, then one additive
|
|
76
|
+
* `exa.contents` read (0.5) turns the top result's ~160-char SERP teaser into real
|
|
77
|
+
* page text. So a typical row spends 1 and a preview reserves 4.5, because the
|
|
78
|
+
* ceiling must also cover the `exa.search` fallback (3.5) firing when serper finds
|
|
79
|
+
* nothing. The read carries no fallback of its own — a read miss leaves the row
|
|
80
|
+
* grounded on the snippets it already has.
|
|
81
|
+
*
|
|
82
|
+
* Both numbers are RESOLVER-DERIVED and pinned by pricing-sheet-conformance.test.ts
|
|
83
|
+
* against the shipped default, so a re-price or a lane change fails a test rather
|
|
84
|
+
* than quietly mispricing this page. Do not hand-edit them.
|
|
78
85
|
*/
|
|
79
|
-
export declare const AI_COLUMN_WEB_SEARCH_TYPICAL_CREDITS =
|
|
80
|
-
export declare const AI_COLUMN_WEB_SEARCH_RESERVED_CREDITS =
|
|
86
|
+
export declare const AI_COLUMN_WEB_SEARCH_TYPICAL_CREDITS = 1;
|
|
87
|
+
export declare const AI_COLUMN_WEB_SEARCH_RESERVED_CREDITS = 4.5;
|
|
81
88
|
/** Workflow/automation actions (steps, tool calls, row writes) — capacity guard. */
|
|
82
|
-
export declare const AUTOMATION_ACTION_CREDITS = 0.
|
|
89
|
+
export declare const AUTOMATION_ACTION_CREDITS = 0.001;
|
|
83
90
|
/**
|
|
84
91
|
* Managed email inboxes: founder-ratified flat price (2026-07-25), superseding
|
|
85
92
|
* the earlier dynamic vendor-COGS × 1.25 range. Kept as an object (min/typical/max
|
|
@@ -88,9 +95,9 @@ export declare const AUTOMATION_ACTION_CREDITS = 0.01;
|
|
|
88
95
|
*/
|
|
89
96
|
export declare const MANAGED_INBOX_MARKUP = 1.25;
|
|
90
97
|
export declare const MANAGED_INBOX_CREDITS_PER_MONTH: {
|
|
91
|
-
readonly min:
|
|
92
|
-
readonly typical:
|
|
93
|
-
readonly max:
|
|
98
|
+
readonly min: 300;
|
|
99
|
+
readonly typical: 300;
|
|
100
|
+
readonly max: 300;
|
|
94
101
|
};
|
|
95
102
|
/**
|
|
96
103
|
* VOICE (the call channel). Marked up 5×, not the 1.25× infra rule the inbox and
|
|
@@ -106,12 +113,12 @@ export declare const MANAGED_INBOX_CREDITS_PER_MONTH: {
|
|
|
106
113
|
* Costing only the outbound leg undercharges every call by 29%.
|
|
107
114
|
*/
|
|
108
115
|
export declare const VOICE_MARKUP = 5;
|
|
109
|
-
export declare const VOICE_NUMBER_CREDITS_PER_MONTH =
|
|
110
|
-
export declare const VOICE_CREDITS_PER_MINUTE =
|
|
111
|
-
export declare const VOICE_CREDITS_PER_AMD_CALL =
|
|
116
|
+
export declare const VOICE_NUMBER_CREDITS_PER_MONTH = 500;
|
|
117
|
+
export declare const VOICE_CREDITS_PER_MINUTE = 9;
|
|
118
|
+
export declare const VOICE_CREDITS_PER_AMD_CALL = 3.8;
|
|
112
119
|
/** Managed domains: registrar at-cost × 1.25 (≈ a $10.44 .com → ~13,050 credits/yr). */
|
|
113
120
|
export declare const MANAGED_DOMAIN_MARKUP = 1.25;
|
|
114
|
-
export declare const MANAGED_DOMAIN_CREDITS_PER_YEAR_TYPICAL =
|
|
121
|
+
export declare const MANAGED_DOMAIN_CREDITS_PER_YEAR_TYPICAL = 1305;
|
|
115
122
|
/**
|
|
116
123
|
* Inbox deliverability (EmailGuard placement seat). A flat monthly price per
|
|
117
124
|
* SUBSCRIBED inbox covering continuous deliverability monitoring (blacklist,
|
|
@@ -126,9 +133,9 @@ export declare const MANAGED_DOMAIN_CREDITS_PER_YEAR_TYPICAL = 13050;
|
|
|
126
133
|
* revenue — a ~73% margin — and everything past them bills
|
|
127
134
|
* PLACEMENT_TEST_OVERAGE_CREDITS. Orgs on their own EmailGuard key (BYOK) pay 0.
|
|
128
135
|
*/
|
|
129
|
-
export declare const DELIVERABILITY_SEAT_CREDITS_PER_MONTH =
|
|
136
|
+
export declare const DELIVERABILITY_SEAT_CREDITS_PER_MONTH = 100;
|
|
130
137
|
export declare const DELIVERABILITY_INCLUDED_TESTS_PER_INBOX = 2;
|
|
131
|
-
export declare const PLACEMENT_TEST_OVERAGE_CREDITS =
|
|
138
|
+
export declare const PLACEMENT_TEST_OVERAGE_CREDITS = 16.6;
|
|
132
139
|
/**
|
|
133
140
|
* LinkedIn accounts: founder decision (2026-07-25) — a PURE seat model. The
|
|
134
141
|
* flat monthly connection fee per connected account is the WHOLE LinkedIn
|
|
@@ -136,7 +143,7 @@ export declare const PLACEMENT_TEST_OVERAGE_CREDITS = 166;
|
|
|
136
143
|
* stay 0 too — but a connected WhatsApp NUMBER carries its own monthly
|
|
137
144
|
* connection fee, see WHATSAPP_ACCOUNT_CREDITS_PER_MONTH.
|
|
138
145
|
*/
|
|
139
|
-
export declare const LINKEDIN_ACCOUNT_CREDITS_PER_MONTH =
|
|
146
|
+
export declare const LINKEDIN_ACCOUNT_CREDITS_PER_MONTH = 1000;
|
|
140
147
|
export declare const LINKEDIN_ACTION_CREDITS: {
|
|
141
148
|
readonly visit_profile: 0;
|
|
142
149
|
readonly invite: 0;
|
|
@@ -153,9 +160,9 @@ export declare const LINKEDIN_TYPICAL_ACTIONS_CREDITS_PER_MONTH = 0;
|
|
|
153
160
|
* part-way through a month still bills the full cycle. WhatsApp message sends
|
|
154
161
|
* themselves remain 0 credits.
|
|
155
162
|
*/
|
|
156
|
-
export declare const WHATSAPP_ACCOUNT_CREDITS_PER_MONTH =
|
|
163
|
+
export declare const WHATSAPP_ACCOUNT_CREDITS_PER_MONTH = 1000;
|
|
157
164
|
/** Dedicated egress IP add-on. */
|
|
158
|
-
export declare const EGRESS_IP_CREDITS_PER_MONTH =
|
|
165
|
+
export declare const EGRESS_IP_CREDITS_PER_MONTH = 2500;
|
|
159
166
|
/**
|
|
160
167
|
* Email + WhatsApp sends cost nothing per message — the pool pays for inboxes and
|
|
161
168
|
* connected accounts, not for sends.
|
|
@@ -170,13 +177,13 @@ export declare const SEND_CREDITS = 0;
|
|
|
170
177
|
* pricing seed.
|
|
171
178
|
*/
|
|
172
179
|
export declare const ENRICHMENT_CREDITS: {
|
|
173
|
-
readonly email_verify:
|
|
174
|
-
readonly email_find_typical:
|
|
175
|
-
readonly phone_find_typical:
|
|
176
|
-
readonly company_enrich_typical:
|
|
177
|
-
readonly web_search: 5;
|
|
178
|
-
readonly page_scrape:
|
|
179
|
-
readonly linkedin_profile_scrape:
|
|
180
|
+
readonly email_verify: 0.225;
|
|
181
|
+
readonly email_find_typical: 8.5;
|
|
182
|
+
readonly phone_find_typical: 99;
|
|
183
|
+
readonly company_enrich_typical: 9.9;
|
|
184
|
+
readonly web_search: 0.5;
|
|
185
|
+
readonly page_scrape: 4;
|
|
186
|
+
readonly linkedin_profile_scrape: 1;
|
|
180
187
|
};
|
|
181
188
|
/** Editable calculator default: blended credits per fully-enriched row. */
|
|
182
|
-
export declare const ENRICHMENT_CREDITS_PER_ROW_TYPICAL =
|
|
189
|
+
export declare const ENRICHMENT_CREDITS_PER_ROW_TYPICAL = 10;
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* page's "what credits buy" table, the pricing calculator, and docs.
|
|
4
4
|
*
|
|
5
5
|
* Pricing Model 2.0 (founder-ratified 2026-07-14): ONE credit pool pays for
|
|
6
|
-
* everything; 1 USD =
|
|
6
|
+
* everything; 1 USD = 100 credits.
|
|
7
7
|
*
|
|
8
8
|
* THIS FILE NO LONGER DECLARES PRICES. It used to carry hand-copied literals
|
|
9
9
|
* under a comment asking the next person to remember to update them — which is
|
|
@@ -34,19 +34,19 @@
|
|
|
34
34
|
* loadPricingBook() instead of importing this file, so a staff re-price at
|
|
35
35
|
* /admin/costs takes effect without a deploy.
|
|
36
36
|
*/
|
|
37
|
-
import { AUTOMATION_ACTION_CREDITS as SNAPSHOT_AUTOMATION_ACTION_CREDITS, CREDITS_PER_USD as SNAPSHOT_CREDITS_PER_USD, DELIVERABILITY_INCLUDED_TESTS_PER_INBOX as SNAPSHOT_DELIVERABILITY_INCLUDED_TESTS_PER_INBOX, DELIVERABILITY_SEAT_CREDITS_PER_MONTH as SNAPSHOT_DELIVERABILITY_SEAT_CREDITS_PER_MONTH, EGRESS_IP_CREDITS_PER_MONTH as SNAPSHOT_EGRESS_IP_CREDITS_PER_MONTH, MANAGED_INBOX_USD_CENTS as SNAPSHOT_MANAGED_INBOX_USD_CENTS, SENDING_DOMAIN_USD_CENTS as SNAPSHOT_SENDING_DOMAIN_USD_CENTS, SENDING_SEAT_USD_CENTS as SNAPSHOT_SENDING_SEAT_USD_CENTS, ENRICHMENT_CREDITS_PER_ROW_TYPICAL as SNAPSHOT_ENRICHMENT_CREDITS_PER_ROW_TYPICAL, LINKEDIN_ACCOUNT_CREDITS_PER_MONTH as SNAPSHOT_LINKEDIN_ACCOUNT_CREDITS_PER_MONTH, LINKEDIN_ACTION_CREDITS as SNAPSHOT_LINKEDIN_ACTION_CREDITS, LINKEDIN_TYPICAL_ACTIONS_CREDITS_PER_MONTH as SNAPSHOT_LINKEDIN_TYPICAL_ACTIONS_CREDITS_PER_MONTH, MANAGED_DOMAIN_CREDITS_PER_YEAR_TYPICAL as SNAPSHOT_MANAGED_DOMAIN_CREDITS_PER_YEAR_TYPICAL, MANAGED_DOMAIN_MARKUP as SNAPSHOT_MANAGED_DOMAIN_MARKUP, MANAGED_INBOX_CREDITS_PER_MONTH as SNAPSHOT_MANAGED_INBOX_CREDITS_PER_MONTH, MANAGED_INBOX_MARKUP as SNAPSHOT_MANAGED_INBOX_MARKUP, PLACEMENT_TEST_OVERAGE_CREDITS as SNAPSHOT_PLACEMENT_TEST_OVERAGE_CREDITS, PRICE_SHEET_VERIFIED as SNAPSHOT_PRICE_SHEET_VERIFIED, SEND_CREDITS as SNAPSHOT_SEND_CREDITS,
|
|
37
|
+
import { AUTOMATION_ACTION_CREDITS as SNAPSHOT_AUTOMATION_ACTION_CREDITS, CREDITS_PER_USD as SNAPSHOT_CREDITS_PER_USD, DELIVERABILITY_INCLUDED_TESTS_PER_INBOX as SNAPSHOT_DELIVERABILITY_INCLUDED_TESTS_PER_INBOX, DELIVERABILITY_SEAT_CREDITS_PER_MONTH as SNAPSHOT_DELIVERABILITY_SEAT_CREDITS_PER_MONTH, EGRESS_IP_CREDITS_PER_MONTH as SNAPSHOT_EGRESS_IP_CREDITS_PER_MONTH, MANAGED_INBOX_USD_CENTS as SNAPSHOT_MANAGED_INBOX_USD_CENTS, SENDING_DOMAIN_USD_CENTS as SNAPSHOT_SENDING_DOMAIN_USD_CENTS, SENDING_SEAT_USD_CENTS as SNAPSHOT_SENDING_SEAT_USD_CENTS, ENRICHMENT_CREDITS_PER_ROW_TYPICAL as SNAPSHOT_ENRICHMENT_CREDITS_PER_ROW_TYPICAL, LINKEDIN_ACCOUNT_CREDITS_PER_MONTH as SNAPSHOT_LINKEDIN_ACCOUNT_CREDITS_PER_MONTH, LINKEDIN_ACTION_CREDITS as SNAPSHOT_LINKEDIN_ACTION_CREDITS, LINKEDIN_TYPICAL_ACTIONS_CREDITS_PER_MONTH as SNAPSHOT_LINKEDIN_TYPICAL_ACTIONS_CREDITS_PER_MONTH, MANAGED_DOMAIN_CREDITS_PER_YEAR_TYPICAL as SNAPSHOT_MANAGED_DOMAIN_CREDITS_PER_YEAR_TYPICAL, MANAGED_DOMAIN_MARKUP as SNAPSHOT_MANAGED_DOMAIN_MARKUP, MANAGED_INBOX_CREDITS_PER_MONTH as SNAPSHOT_MANAGED_INBOX_CREDITS_PER_MONTH, MANAGED_INBOX_MARKUP as SNAPSHOT_MANAGED_INBOX_MARKUP, PLACEMENT_TEST_OVERAGE_CREDITS as SNAPSHOT_PLACEMENT_TEST_OVERAGE_CREDITS, PRICE_SHEET_VERIFIED as SNAPSHOT_PRICE_SHEET_VERIFIED, SEND_CREDITS as SNAPSHOT_SEND_CREDITS, SUBSCRIPTION_USD_PER_100 as SNAPSHOT_SUBSCRIPTION_USD_PER_100, TOPUP_USD_PER_100 as SNAPSHOT_TOPUP_USD_PER_100, VOICE_CREDITS_PER_AMD_CALL as SNAPSHOT_VOICE_CREDITS_PER_AMD_CALL, VOICE_CREDITS_PER_MINUTE as SNAPSHOT_VOICE_CREDITS_PER_MINUTE, VOICE_MARKUP as SNAPSHOT_VOICE_MARKUP, VOICE_NUMBER_CREDITS_PER_MONTH as SNAPSHOT_VOICE_NUMBER_CREDITS_PER_MONTH, WHATSAPP_ACCOUNT_CREDITS_PER_MONTH as SNAPSHOT_WHATSAPP_ACCOUNT_CREDITS_PER_MONTH, } from "./pricing-snapshot.generated.js";
|
|
38
38
|
export { creditsToUsd, usdToCredits } from "./pricing-snapshot.generated.js";
|
|
39
39
|
export const PRICING_SHEET_VERIFIED = SNAPSHOT_PRICE_SHEET_VERIFIED;
|
|
40
40
|
export const PRICING_CREDITS_PER_USD = SNAPSHOT_CREDITS_PER_USD;
|
|
41
|
-
/** On-demand top-up price per
|
|
42
|
-
export const
|
|
41
|
+
/** On-demand top-up price per 100 credits (USD); subscriptions pay $1.00. */
|
|
42
|
+
export const TOPUP_USD_PER_100 = SNAPSHOT_TOPUP_USD_PER_100;
|
|
43
43
|
// Dollar-priced CAPACITY, re-exported on the client-safe subpath so the pricing
|
|
44
44
|
// calculator and the marketing sections quote the same numbers the product
|
|
45
45
|
// charges. These are not credits and must never be converted as if they were.
|
|
46
46
|
export const SENDING_SEAT_USD_CENTS = SNAPSHOT_SENDING_SEAT_USD_CENTS;
|
|
47
47
|
export const MANAGED_INBOX_USD_CENTS = SNAPSHOT_MANAGED_INBOX_USD_CENTS;
|
|
48
48
|
export const SENDING_DOMAIN_USD_CENTS = SNAPSHOT_SENDING_DOMAIN_USD_CENTS;
|
|
49
|
-
export const
|
|
49
|
+
export const SUBSCRIPTION_USD_PER_100 = SNAPSHOT_SUBSCRIPTION_USD_PER_100;
|
|
50
50
|
/**
|
|
51
51
|
* AI column runs, honest 5× of modeled tier COGS.
|
|
52
52
|
*
|
|
@@ -56,23 +56,30 @@ export const SUBSCRIPTION_USD_PER_1K = SNAPSHOT_SUBSCRIPTION_USD_PER_1K;
|
|
|
56
56
|
* against the live estimator, so a tier re-price fails a test rather than
|
|
57
57
|
* quietly mispricing the page.
|
|
58
58
|
*/
|
|
59
|
-
export const AI_COLUMN_CREDITS = { low:
|
|
59
|
+
export const AI_COLUMN_CREDITS = { low: 1.5, medium: 7.5, high: 25 };
|
|
60
60
|
/**
|
|
61
|
-
* Web-search grounding, billed per
|
|
61
|
+
* Web-search grounding, billed per PROVIDER CALL on top of the model — not a flat
|
|
62
|
+
* adder.
|
|
62
63
|
*
|
|
63
|
-
* This
|
|
64
|
-
*
|
|
65
|
-
*
|
|
66
|
-
*
|
|
67
|
-
* the managed provider's own per-search charge (cogs-rates.ts): exa 35, parallel
|
|
68
|
-
* 5, firecrawl 80 at the default 5 results. The default column runs exa primary
|
|
69
|
-
* with parallel as its one fallback (WEB_SEARCH_ENGINES), so a row costs 35 when
|
|
70
|
-
* the primary answers and reserves 40 for the case where both lanes fire.
|
|
64
|
+
* This replaced `AI_COLUMN_WEB_SEARCH_SURCHARGE_CREDITS = 25`, a real under-quote on
|
|
65
|
+
* a public surface: a leftover from the bundled `*_with_web_search` model tiers that
|
|
66
|
+
* were removed when grounding moved onto native providers, which the billing path
|
|
67
|
+
* never read.
|
|
71
68
|
*
|
|
72
|
-
*
|
|
69
|
+
* The figures below describe the DEFAULT research column, which since D53 discovers
|
|
70
|
+
* then reads: `serper.search` (0.5) finds the URLs, then one additive
|
|
71
|
+
* `exa.contents` read (0.5) turns the top result's ~160-char SERP teaser into real
|
|
72
|
+
* page text. So a typical row spends 1 and a preview reserves 4.5, because the
|
|
73
|
+
* ceiling must also cover the `exa.search` fallback (3.5) firing when serper finds
|
|
74
|
+
* nothing. The read carries no fallback of its own — a read miss leaves the row
|
|
75
|
+
* grounded on the snippets it already has.
|
|
76
|
+
*
|
|
77
|
+
* Both numbers are RESOLVER-DERIVED and pinned by pricing-sheet-conformance.test.ts
|
|
78
|
+
* against the shipped default, so a re-price or a lane change fails a test rather
|
|
79
|
+
* than quietly mispricing this page. Do not hand-edit them.
|
|
73
80
|
*/
|
|
74
|
-
export const AI_COLUMN_WEB_SEARCH_TYPICAL_CREDITS =
|
|
75
|
-
export const AI_COLUMN_WEB_SEARCH_RESERVED_CREDITS =
|
|
81
|
+
export const AI_COLUMN_WEB_SEARCH_TYPICAL_CREDITS = 1;
|
|
82
|
+
export const AI_COLUMN_WEB_SEARCH_RESERVED_CREDITS = 4.5;
|
|
76
83
|
/** Workflow/automation actions (steps, tool calls, row writes) — capacity guard. */
|
|
77
84
|
export const AUTOMATION_ACTION_CREDITS = SNAPSHOT_AUTOMATION_ACTION_CREDITS;
|
|
78
85
|
/**
|
|
@@ -157,13 +164,17 @@ export const SEND_CREDITS = SNAPSHOT_SEND_CREDITS;
|
|
|
157
164
|
* pricing seed.
|
|
158
165
|
*/
|
|
159
166
|
export const ENRICHMENT_CREDITS = {
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
+
// The ONLY price in the 2026-09-19 re-denomination that is not an exact /10.
|
|
168
|
+
// 2.245 / 10 = 0.2245, and credits are numeric(18,3) — the fourth decimal does
|
|
169
|
+
// not exist in the ledger. Rounded UP to 0.225 (+0.22%) per this file's
|
|
170
|
+
// standing preference for overestimating a quote rather than under-charging.
|
|
171
|
+
email_verify: 0.225, // MillionVerifier first pass (~5x COGS; see note above)
|
|
172
|
+
email_find_typical: 8.5, // Hunter-class finder; cheap waterfall steps run 1.5–9.9
|
|
173
|
+
phone_find_typical: 99, // Prospeo/Findymail-class mobile
|
|
174
|
+
company_enrich_typical: 9.9,
|
|
175
|
+
web_search: 0.5, // Serper
|
|
176
|
+
page_scrape: 4, // Firecrawl (wedge price)
|
|
177
|
+
linkedin_profile_scrape: 1, // Managed profile credit at $0.002 COGS, exactly 5x
|
|
167
178
|
};
|
|
168
179
|
/** Editable calculator default: blended credits per fully-enriched row. */
|
|
169
180
|
export const ENRICHMENT_CREDITS_PER_ROW_TYPICAL = SNAPSHOT_ENRICHMENT_CREDITS_PER_ROW_TYPICAL;
|
|
@@ -1,33 +1,33 @@
|
|
|
1
1
|
/** Period the customer-facing price sheet was last reconciled end to end. */
|
|
2
2
|
export declare const PRICE_SHEET_VERIFIED = "2026-07";
|
|
3
|
-
/** $1 =
|
|
4
|
-
export declare const CREDITS_PER_USD =
|
|
3
|
+
/** $1 = 100 credits (Pricing Model 2.1). */
|
|
4
|
+
export declare const CREDITS_PER_USD = 100;
|
|
5
5
|
/** The divisor in the markup formula; exact inverse of CREDITS_PER_USD. */
|
|
6
|
-
export declare const CREDIT_USD_VALUE = 0.
|
|
7
|
-
/** On-demand top-up, in USD cents per
|
|
8
|
-
export declare const
|
|
9
|
-
/** On-demand top-up price per
|
|
10
|
-
export declare const
|
|
6
|
+
export declare const CREDIT_USD_VALUE = 0.01;
|
|
7
|
+
/** On-demand top-up, in USD cents per 100 credits. */
|
|
8
|
+
export declare const TOPUP_USD_CENTS_PER_100_CREDITS = 125;
|
|
9
|
+
/** On-demand top-up price per 100 credits, in USD. */
|
|
10
|
+
export declare const TOPUP_USD_PER_100 = 1.25;
|
|
11
11
|
/** Subscription credits convert at face value, making them exactly 20% cheaper. */
|
|
12
|
-
export declare const
|
|
12
|
+
export declare const SUBSCRIPTION_USD_PER_100 = 1;
|
|
13
13
|
export declare const MANAGED_INBOX_MARKUP = 1.25;
|
|
14
14
|
export declare const MANAGED_DOMAIN_MARKUP = 1.25;
|
|
15
15
|
export declare const VOICE_MARKUP = 5;
|
|
16
16
|
/** Applied to actual provider inference cost at settle time. */
|
|
17
17
|
export declare const COPILOT_CREDIT_MARKUP_MULTIPLIER = 5;
|
|
18
|
-
export declare const LINKEDIN_ACCOUNT_CREDITS_PER_MONTH =
|
|
19
|
-
export declare const WHATSAPP_ACCOUNT_CREDITS_PER_MONTH =
|
|
20
|
-
export declare const EGRESS_IP_CREDITS_PER_MONTH =
|
|
21
|
-
export declare const SENDING_MAILBOX_CREDITS_PER_MONTH =
|
|
22
|
-
export declare const MANAGED_INBOX_CREDITS_PER_MONTH =
|
|
23
|
-
export declare const MAILBOX_WARMUP_CREDITS_PER_MONTH =
|
|
24
|
-
export declare const DELIVERABILITY_SEAT_CREDITS_PER_MONTH =
|
|
18
|
+
export declare const LINKEDIN_ACCOUNT_CREDITS_PER_MONTH = 1000;
|
|
19
|
+
export declare const WHATSAPP_ACCOUNT_CREDITS_PER_MONTH = 1000;
|
|
20
|
+
export declare const EGRESS_IP_CREDITS_PER_MONTH = 2500;
|
|
21
|
+
export declare const SENDING_MAILBOX_CREDITS_PER_MONTH = 100;
|
|
22
|
+
export declare const MANAGED_INBOX_CREDITS_PER_MONTH = 300;
|
|
23
|
+
export declare const MAILBOX_WARMUP_CREDITS_PER_MONTH = 100;
|
|
24
|
+
export declare const DELIVERABILITY_SEAT_CREDITS_PER_MONTH = 100;
|
|
25
25
|
/** Included inbox-placement tests per subscribed inbox per cycle. */
|
|
26
26
|
export declare const DELIVERABILITY_INCLUDED_TESTS_PER_INBOX = 2;
|
|
27
27
|
/** A placement test beyond the included allowance. */
|
|
28
|
-
export declare const PLACEMENT_TEST_OVERAGE_CREDITS =
|
|
28
|
+
export declare const PLACEMENT_TEST_OVERAGE_CREDITS = 16.6;
|
|
29
29
|
/** Representative, not billed: a typical .com at MANAGED_DOMAIN_MARKUP. */
|
|
30
|
-
export declare const MANAGED_DOMAIN_CREDITS_PER_YEAR_TYPICAL =
|
|
30
|
+
export declare const MANAGED_DOMAIN_CREDITS_PER_YEAR_TYPICAL = 1305;
|
|
31
31
|
export declare const SENDING_SEAT_USD_CENTS: {
|
|
32
32
|
readonly linkedin: 3000;
|
|
33
33
|
readonly whatsapp: 3000;
|
|
@@ -37,11 +37,11 @@ export declare const SENDING_SEAT_USD_CENTS: {
|
|
|
37
37
|
export type SendingSeatKey = keyof typeof SENDING_SEAT_USD_CENTS;
|
|
38
38
|
export declare const MANAGED_INBOX_USD_CENTS = 400;
|
|
39
39
|
export declare const SENDING_DOMAIN_USD_CENTS = 1250;
|
|
40
|
-
export declare const VOICE_NUMBER_CREDITS_PER_MONTH =
|
|
41
|
-
export declare const VOICE_CREDITS_PER_MINUTE =
|
|
42
|
-
export declare const VOICE_CREDITS_PER_AMD_CALL =
|
|
40
|
+
export declare const VOICE_NUMBER_CREDITS_PER_MONTH = 500;
|
|
41
|
+
export declare const VOICE_CREDITS_PER_MINUTE = 9;
|
|
42
|
+
export declare const VOICE_CREDITS_PER_AMD_CALL = 3.8;
|
|
43
43
|
/** Workflow steps, tool calls and row writes — a capacity guard, not a margin line. */
|
|
44
|
-
export declare const AUTOMATION_ACTION_CREDITS = 0.
|
|
44
|
+
export declare const AUTOMATION_ACTION_CREDITS = 0.001;
|
|
45
45
|
/** Email, LinkedIn and WhatsApp sends are free; the pool pays for seats and inboxes. */
|
|
46
46
|
export declare const SEND_CREDITS = 0;
|
|
47
47
|
/** Every LinkedIn action is 0 under the pure seat model. */
|
|
@@ -54,7 +54,7 @@ export declare const LINKEDIN_ACTION_CREDITS: {
|
|
|
54
54
|
readonly like_post: 0;
|
|
55
55
|
readonly comment_post: 0;
|
|
56
56
|
};
|
|
57
|
-
export declare const ENRICHMENT_CREDITS_PER_ROW_TYPICAL =
|
|
57
|
+
export declare const ENRICHMENT_CREDITS_PER_ROW_TYPICAL = 10;
|
|
58
58
|
export declare const LINKEDIN_TYPICAL_ACTIONS_CREDITS_PER_MONTH = 0;
|
|
59
59
|
export type PricingPlanSnapshot = {
|
|
60
60
|
readonly planKey: string;
|
|
@@ -15,16 +15,16 @@
|
|
|
15
15
|
/** Period the customer-facing price sheet was last reconciled end to end. */
|
|
16
16
|
export const PRICE_SHEET_VERIFIED = "2026-07";
|
|
17
17
|
// --- conversion -------------------------------------------------------------
|
|
18
|
-
/** $1 =
|
|
19
|
-
export const CREDITS_PER_USD =
|
|
18
|
+
/** $1 = 100 credits (Pricing Model 2.1). */
|
|
19
|
+
export const CREDITS_PER_USD = 100;
|
|
20
20
|
/** The divisor in the markup formula; exact inverse of CREDITS_PER_USD. */
|
|
21
|
-
export const CREDIT_USD_VALUE = 0.
|
|
22
|
-
/** On-demand top-up, in USD cents per
|
|
23
|
-
export const
|
|
24
|
-
/** On-demand top-up price per
|
|
25
|
-
export const
|
|
21
|
+
export const CREDIT_USD_VALUE = 0.01;
|
|
22
|
+
/** On-demand top-up, in USD cents per 100 credits. */
|
|
23
|
+
export const TOPUP_USD_CENTS_PER_100_CREDITS = 125;
|
|
24
|
+
/** On-demand top-up price per 100 credits, in USD. */
|
|
25
|
+
export const TOPUP_USD_PER_100 = 1.25;
|
|
26
26
|
/** Subscription credits convert at face value, making them exactly 20% cheaper. */
|
|
27
|
-
export const
|
|
27
|
+
export const SUBSCRIPTION_USD_PER_100 = 1;
|
|
28
28
|
// --- markups ----------------------------------------------------------------
|
|
29
29
|
export const MANAGED_INBOX_MARKUP = 1.25;
|
|
30
30
|
export const MANAGED_DOMAIN_MARKUP = 1.25;
|
|
@@ -32,19 +32,19 @@ export const VOICE_MARKUP = 5;
|
|
|
32
32
|
/** Applied to actual provider inference cost at settle time. */
|
|
33
33
|
export const COPILOT_CREDIT_MARKUP_MULTIPLIER = 5;
|
|
34
34
|
// --- seats and recurring charges --------------------------------------------
|
|
35
|
-
export const LINKEDIN_ACCOUNT_CREDITS_PER_MONTH =
|
|
36
|
-
export const WHATSAPP_ACCOUNT_CREDITS_PER_MONTH =
|
|
37
|
-
export const EGRESS_IP_CREDITS_PER_MONTH =
|
|
38
|
-
export const SENDING_MAILBOX_CREDITS_PER_MONTH =
|
|
39
|
-
export const MANAGED_INBOX_CREDITS_PER_MONTH =
|
|
40
|
-
export const MAILBOX_WARMUP_CREDITS_PER_MONTH =
|
|
41
|
-
export const DELIVERABILITY_SEAT_CREDITS_PER_MONTH =
|
|
35
|
+
export const LINKEDIN_ACCOUNT_CREDITS_PER_MONTH = 1_000;
|
|
36
|
+
export const WHATSAPP_ACCOUNT_CREDITS_PER_MONTH = 1_000;
|
|
37
|
+
export const EGRESS_IP_CREDITS_PER_MONTH = 2_500;
|
|
38
|
+
export const SENDING_MAILBOX_CREDITS_PER_MONTH = 100;
|
|
39
|
+
export const MANAGED_INBOX_CREDITS_PER_MONTH = 300;
|
|
40
|
+
export const MAILBOX_WARMUP_CREDITS_PER_MONTH = 100;
|
|
41
|
+
export const DELIVERABILITY_SEAT_CREDITS_PER_MONTH = 100;
|
|
42
42
|
/** Included inbox-placement tests per subscribed inbox per cycle. */
|
|
43
43
|
export const DELIVERABILITY_INCLUDED_TESTS_PER_INBOX = 2;
|
|
44
44
|
/** A placement test beyond the included allowance. */
|
|
45
|
-
export const PLACEMENT_TEST_OVERAGE_CREDITS =
|
|
45
|
+
export const PLACEMENT_TEST_OVERAGE_CREDITS = 16.6;
|
|
46
46
|
/** Representative, not billed: a typical .com at MANAGED_DOMAIN_MARKUP. */
|
|
47
|
-
export const MANAGED_DOMAIN_CREDITS_PER_YEAR_TYPICAL =
|
|
47
|
+
export const MANAGED_DOMAIN_CREDITS_PER_YEAR_TYPICAL = 1_305;
|
|
48
48
|
// --- sending seats (USD, Stripe-billed) --------------------------------------
|
|
49
49
|
//
|
|
50
50
|
// The seat model (OXP-15). These are DOLLARS, not credits, and they do not
|
|
@@ -74,12 +74,12 @@ export const SENDING_SEAT_USD_CENTS = {
|
|
|
74
74
|
export const MANAGED_INBOX_USD_CENTS = 400;
|
|
75
75
|
export const SENDING_DOMAIN_USD_CENTS = 1_250;
|
|
76
76
|
// --- voice ------------------------------------------------------------------
|
|
77
|
-
export const VOICE_NUMBER_CREDITS_PER_MONTH =
|
|
78
|
-
export const VOICE_CREDITS_PER_MINUTE =
|
|
79
|
-
export const VOICE_CREDITS_PER_AMD_CALL =
|
|
77
|
+
export const VOICE_NUMBER_CREDITS_PER_MONTH = 500;
|
|
78
|
+
export const VOICE_CREDITS_PER_MINUTE = 9;
|
|
79
|
+
export const VOICE_CREDITS_PER_AMD_CALL = 3.8;
|
|
80
80
|
// --- per-action -------------------------------------------------------------
|
|
81
81
|
/** Workflow steps, tool calls and row writes — a capacity guard, not a margin line. */
|
|
82
|
-
export const AUTOMATION_ACTION_CREDITS = 0.
|
|
82
|
+
export const AUTOMATION_ACTION_CREDITS = 0.001;
|
|
83
83
|
/** Email, LinkedIn and WhatsApp sends are free; the pool pays for seats and inboxes. */
|
|
84
84
|
export const SEND_CREDITS = 0;
|
|
85
85
|
/** Every LinkedIn action is 0 under the pure seat model. */
|
|
@@ -93,23 +93,29 @@ export const LINKEDIN_ACTION_CREDITS = {
|
|
|
93
93
|
comment_post: 0,
|
|
94
94
|
};
|
|
95
95
|
// --- pricing-calculator defaults (not prices) -------------------------------
|
|
96
|
-
export const ENRICHMENT_CREDITS_PER_ROW_TYPICAL =
|
|
96
|
+
export const ENRICHMENT_CREDITS_PER_ROW_TYPICAL = 10;
|
|
97
97
|
export const LINKEDIN_TYPICAL_ACTIONS_CREDITS_PER_MONTH = 0;
|
|
98
98
|
export const PRICING_PLAN_SNAPSHOT = [
|
|
99
99
|
{ planKey: "free", tier: "free", isLegacy: false, monthlyPriceCents: 0, monthlyCredits: 0, weeklyCreditsLimit: null, rolloverCap: null, byokEnabled: false },
|
|
100
|
-
{ planKey: "
|
|
101
|
-
{ planKey: "
|
|
102
|
-
{ planKey: "
|
|
103
|
-
{ planKey: "
|
|
100
|
+
{ planKey: "oxygen_49", tier: "oxygen", isLegacy: false, monthlyPriceCents: 4_900, monthlyCredits: 4_900, weeklyCreditsLimit: null, rolloverCap: 4_900, byokEnabled: true },
|
|
101
|
+
{ planKey: "oxygen_99", tier: "oxygen", isLegacy: false, monthlyPriceCents: 9_900, monthlyCredits: 9_900, weeklyCreditsLimit: null, rolloverCap: 9_900, byokEnabled: true },
|
|
102
|
+
{ planKey: "oxygen_199", tier: "oxygen", isLegacy: false, monthlyPriceCents: 19_900, monthlyCredits: 19_900, weeklyCreditsLimit: null, rolloverCap: 19_900, byokEnabled: true },
|
|
103
|
+
{ planKey: "oxygen_499", tier: "oxygen", isLegacy: false, monthlyPriceCents: 49_900, monthlyCredits: 49_900, weeklyCreditsLimit: null, rolloverCap: 49_900, byokEnabled: true },
|
|
104
|
+
{ planKey: "oxygen_999", tier: "oxygen", isLegacy: false, monthlyPriceCents: 99_900, monthlyCredits: 99_900, weeklyCreditsLimit: null, rolloverCap: 99_900, byokEnabled: true },
|
|
105
|
+
{ planKey: "oxygen_1999", tier: "oxygen", isLegacy: false, monthlyPriceCents: 199_900, monthlyCredits: 199_900, weeklyCreditsLimit: null, rolloverCap: 199_900, byokEnabled: true },
|
|
106
|
+
{ planKey: "scale", tier: "scale", isLegacy: false, monthlyPriceCents: null, monthlyCredits: 1_000_000, weeklyCreditsLimit: null, rolloverCap: 1_000_000, byokEnabled: true },
|
|
104
107
|
{ planKey: "enterprise", tier: "enterprise", isLegacy: false, monthlyPriceCents: null, monthlyCredits: null, weeklyCreditsLimit: null, rolloverCap: null, byokEnabled: true },
|
|
105
|
-
{ planKey: "
|
|
106
|
-
{ planKey: "
|
|
107
|
-
{ planKey: "
|
|
108
|
-
{ planKey: "
|
|
109
|
-
{ planKey: "
|
|
110
|
-
{ planKey: "
|
|
111
|
-
{ planKey: "
|
|
112
|
-
{ planKey: "
|
|
108
|
+
{ planKey: "starter", tier: "starter", isLegacy: true, monthlyPriceCents: 9_900, monthlyCredits: 9_900, weeklyCreditsLimit: null, rolloverCap: 9_900, byokEnabled: true },
|
|
109
|
+
{ planKey: "pro", tier: "pro", isLegacy: true, monthlyPriceCents: 24_900, monthlyCredits: 24_900, weeklyCreditsLimit: null, rolloverCap: 24_900, byokEnabled: true },
|
|
110
|
+
{ planKey: "team", tier: "team", isLegacy: true, monthlyPriceCents: 74_900, monthlyCredits: 74_900, weeklyCreditsLimit: null, rolloverCap: 74_900, byokEnabled: true },
|
|
111
|
+
{ planKey: "launch_50", tier: "starter", isLegacy: true, monthlyPriceCents: 5_000, monthlyCredits: 20_000, weeklyCreditsLimit: 20_000, rolloverCap: 20_000, byokEnabled: true },
|
|
112
|
+
{ planKey: "starter_50", tier: "starter", isLegacy: true, monthlyPriceCents: 5_000, monthlyCredits: 20_000, weeklyCreditsLimit: 20_000, rolloverCap: 20_000, byokEnabled: true },
|
|
113
|
+
{ planKey: "pro_149", tier: "pro", isLegacy: true, monthlyPriceCents: 14_900, monthlyCredits: 100_000, weeklyCreditsLimit: 100_000, rolloverCap: 100_000, byokEnabled: true },
|
|
114
|
+
{ planKey: "team_399", tier: "team", isLegacy: true, monthlyPriceCents: 39_900, monthlyCredits: 300_000, weeklyCreditsLimit: 300_000, rolloverCap: 300_000, byokEnabled: true },
|
|
115
|
+
{ planKey: "growth_250", tier: "pro", isLegacy: true, monthlyPriceCents: 25_000, monthlyCredits: 25_000, weeklyCreditsLimit: 10_000, rolloverCap: 25_000, byokEnabled: true },
|
|
116
|
+
{ planKey: "scale_750", tier: "team", isLegacy: true, monthlyPriceCents: 75_000, monthlyCredits: 75_000, weeklyCreditsLimit: 30_000, rolloverCap: 75_000, byokEnabled: true },
|
|
117
|
+
{ planKey: "starter_legacy", tier: "starter", isLegacy: true, monthlyPriceCents: null, monthlyCredits: 20_000, weeklyCreditsLimit: null, rolloverCap: 20_000, byokEnabled: true },
|
|
118
|
+
{ planKey: "scale_legacy", tier: "scale", isLegacy: true, monthlyPriceCents: null, monthlyCredits: 120_000, weeklyCreditsLimit: null, rolloverCap: 240_000, byokEnabled: true },
|
|
113
119
|
];
|
|
114
120
|
export function creditsToUsd(credits) {
|
|
115
121
|
return credits / CREDITS_PER_USD;
|
|
@@ -24,6 +24,15 @@ export function resolveProductAnalyticsEnvironmentFromEnv(env = process.env) {
|
|
|
24
24
|
?? env.NEXT_PUBLIC_SENTRY_ENVIRONMENT);
|
|
25
25
|
if (explicit)
|
|
26
26
|
return explicit;
|
|
27
|
+
// The self-hosted selector is the first non-explicit signal: a self-hosted box
|
|
28
|
+
// has no VERCEL_ENV and no FLY_APP_NAME, so without it every environment
|
|
29
|
+
// (including the production shadow) would fall through to LOCAL. `shadow` is
|
|
30
|
+
// DEV: it carries production-shaped data but is not production traffic.
|
|
31
|
+
const deployEnv = env.OXYGEN_DEPLOY_ENV?.trim().toLowerCase();
|
|
32
|
+
if (deployEnv === "selfhost-prod")
|
|
33
|
+
return "PROD";
|
|
34
|
+
if (deployEnv === "selfhost-shadow" || deployEnv === "selfhost-dev")
|
|
35
|
+
return "DEV";
|
|
27
36
|
const vercelEnv = env.VERCEL_ENV ?? env.NEXT_PUBLIC_VERCEL_ENV;
|
|
28
37
|
if (vercelEnv === "production")
|
|
29
38
|
return "PROD";
|