@oxygen-agent/cli 1.1010.650 → 1.1010.905
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/auto-update.d.ts +129 -0
- package/dist/auto-update.js +392 -0
- package/dist/command-manifest.js +15 -1
- package/dist/credentials.d.ts +2 -0
- package/dist/credentials.js +6 -3
- package/dist/functions-commands.js +1 -1
- package/dist/http-client.js +28 -4
- package/dist/inbox-needs-reply-notice.d.ts +12 -0
- package/dist/inbox-needs-reply-notice.js +51 -0
- package/dist/index.js +756 -177
- package/dist/run-wait.d.ts +3 -1
- package/dist/run-wait.js +19 -5
- package/dist/skills.js +48 -22
- package/dist/streamed-file-import.d.ts +58 -0
- package/dist/streamed-file-import.js +115 -0
- package/dist/update.d.ts +29 -0
- package/dist/update.js +62 -16
- package/dist/workflow-plan-limit-notices.d.ts +8 -0
- package/dist/workflow-plan-limit-notices.js +28 -0
- package/node_modules/@oxygen/cli-ugc/dist/commands.js +3 -3
- package/node_modules/@oxygen/shared/dist/billing-anchors.d.ts +50 -2
- package/node_modules/@oxygen/shared/dist/billing-anchors.js +94 -2
- package/node_modules/@oxygen/shared/dist/billing.d.ts +247 -37
- package/node_modules/@oxygen/shared/dist/billing.js +418 -45
- package/node_modules/@oxygen/shared/dist/capability-discovery.js +66 -6
- 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/cost-estimate-view.d.ts +50 -0
- package/node_modules/@oxygen/shared/dist/cost-estimate-view.js +90 -0
- package/node_modules/@oxygen/shared/dist/cost-estimate.d.ts +167 -0
- package/node_modules/@oxygen/shared/dist/cost-estimate.js +361 -0
- package/node_modules/@oxygen/shared/dist/credit-gate.d.ts +26 -0
- package/node_modules/@oxygen/shared/dist/credit-gate.js +65 -0
- package/node_modules/@oxygen/shared/dist/email-deliverability-policy.d.ts +51 -0
- package/node_modules/@oxygen/shared/dist/email-deliverability-policy.js +101 -0
- package/node_modules/@oxygen/shared/dist/email-hard-bounce.d.ts +27 -0
- package/node_modules/@oxygen/shared/dist/email-hard-bounce.js +27 -0
- package/node_modules/@oxygen/shared/dist/error-redaction.d.ts +1 -1
- package/node_modules/@oxygen/shared/dist/error-redaction.js +1 -1
- package/node_modules/@oxygen/shared/dist/feature-gates.d.ts +10 -1
- package/node_modules/@oxygen/shared/dist/feature-gates.js +12 -1
- package/node_modules/@oxygen/shared/dist/file-import.d.ts +13 -1
- package/node_modules/@oxygen/shared/dist/file-import.js +33 -6
- package/node_modules/@oxygen/shared/dist/hosted-ai.d.ts +73 -3
- package/node_modules/@oxygen/shared/dist/hosted-ai.js +246 -24
- package/node_modules/@oxygen/shared/dist/import-limits.d.ts +25 -1
- package/node_modules/@oxygen/shared/dist/import-limits.js +35 -2
- package/node_modules/@oxygen/shared/dist/index.d.ts +4 -23
- package/node_modules/@oxygen/shared/dist/index.js +4 -43
- package/node_modules/@oxygen/shared/dist/linkedin-sequences.d.ts +114 -0
- package/node_modules/@oxygen/shared/dist/linkedin-sequences.js +150 -0
- package/node_modules/@oxygen/shared/dist/object-storage.d.ts +9 -0
- package/node_modules/@oxygen/shared/dist/object-storage.js +17 -0
- package/node_modules/@oxygen/shared/dist/operational-telemetry.d.ts +41 -0
- package/node_modules/@oxygen/shared/dist/operational-telemetry.js +55 -0
- package/node_modules/@oxygen/shared/dist/otlp-log-sink.js +19 -2
- package/node_modules/@oxygen/shared/dist/plan-band.d.ts +234 -0
- package/node_modules/@oxygen/shared/dist/plan-band.js +312 -0
- package/node_modules/@oxygen/shared/dist/plan-capabilities.d.ts +77 -7
- package/node_modules/@oxygen/shared/dist/plan-capabilities.js +87 -7
- package/node_modules/@oxygen/shared/dist/plan-limits-view.d.ts +219 -0
- package/node_modules/@oxygen/shared/dist/plan-limits-view.js +330 -0
- package/node_modules/@oxygen/shared/dist/plan-limits.d.ts +335 -126
- package/node_modules/@oxygen/shared/dist/plan-limits.js +277 -86
- package/node_modules/@oxygen/shared/dist/pricing-sheet.d.ts +158 -49
- package/node_modules/@oxygen/shared/dist/pricing-sheet.js +139 -41
- package/node_modules/@oxygen/shared/dist/pricing-snapshot.generated.d.ts +42 -23
- package/node_modules/@oxygen/shared/dist/pricing-snapshot.generated.js +56 -37
- package/node_modules/@oxygen/shared/dist/process-resource.d.ts +4 -0
- package/node_modules/@oxygen/shared/dist/process-resource.js +25 -0
- package/node_modules/@oxygen/shared/dist/provider-http-error.d.ts +10 -0
- package/node_modules/@oxygen/shared/dist/provider-http-error.js +27 -0
- package/node_modules/@oxygen/shared/dist/repricing.d.ts +257 -0
- package/node_modules/@oxygen/shared/dist/repricing.js +721 -0
- package/node_modules/@oxygen/shared/dist/semver.d.ts +21 -0
- package/node_modules/@oxygen/shared/dist/semver.js +41 -0
- package/node_modules/@oxygen/shared/dist/sending-limits.d.ts +30 -0
- package/node_modules/@oxygen/shared/dist/sending-limits.js +43 -0
- package/node_modules/@oxygen/shared/dist/sending-seats.d.ts +18 -15
- package/node_modules/@oxygen/shared/dist/sending-seats.js +22 -17
- package/node_modules/@oxygen/shared/dist/sequence-failures.js +4 -1
- package/node_modules/@oxygen/shared/dist/spend-safety.d.ts +57 -8
- package/node_modules/@oxygen/shared/dist/spend-safety.js +64 -11
- package/node_modules/@oxygen/shared/dist/stripe-price-catalog.d.ts +33 -1
- package/node_modules/@oxygen/shared/dist/stripe-price-catalog.js +71 -1
- package/node_modules/@oxygen/shared/dist/table-capacity.d.ts +68 -10
- package/node_modules/@oxygen/shared/dist/table-capacity.js +85 -4
- package/node_modules/@oxygen/shared/dist/telemetry-export-observer.d.ts +6 -0
- package/node_modules/@oxygen/shared/dist/telemetry-export-observer.js +13 -5
- package/node_modules/@oxygen/shared/dist/telemetry-resource.d.ts +40 -0
- package/node_modules/@oxygen/shared/dist/telemetry-resource.js +35 -0
- package/node_modules/@oxygen/shared/dist/telemetry.d.ts +9 -0
- package/node_modules/@oxygen/shared/dist/telemetry.js +41 -2
- package/node_modules/@oxygen/shared/dist/trace-context.d.ts +29 -0
- package/node_modules/@oxygen/shared/dist/trace-context.js +88 -0
- package/node_modules/@oxygen/shared/dist/ugc.d.ts +15 -0
- package/node_modules/@oxygen/shared/dist/ugc.js +29 -0
- package/node_modules/@oxygen/shared/dist/version.d.ts +1 -3
- package/node_modules/@oxygen/shared/dist/version.generated.d.ts +1 -1
- package/node_modules/@oxygen/shared/dist/version.generated.js +1 -1
- package/node_modules/@oxygen/shared/dist/version.js +14 -27
- package/node_modules/@oxygen/shared/dist/workspace-file-storage.d.ts +5 -0
- package/node_modules/@oxygen/shared/dist/workspace-file-storage.js +5 -0
- package/node_modules/@oxygen/workflows/dist/graph/manifest-schema.d.ts +3 -3
- package/node_modules/@oxygen/workflows/dist/graph/types.d.ts +15 -1
- package/node_modules/@oxygen/workflows/dist/graph/types.js +15 -1
- package/node_modules/@oxygen/workflows/dist/index.d.ts +45 -0
- package/node_modules/@oxygen/workflows/dist/index.js +152 -2
- package/node_modules/@oxygen/workflows/dist/usage-estimate.d.ts +10 -1
- package/node_modules/@oxygen/workflows/dist/usage-estimate.js +33 -29
- package/package.json +1 -1
- package/node_modules/@oxygen/shared/dist/email-warmup-readiness.d.ts +0 -64
- package/node_modules/@oxygen/shared/dist/email-warmup-readiness.js +0 -90
|
@@ -34,22 +34,42 @@
|
|
|
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 { type RepricingOptions } from "./repricing.js";
|
|
37
38
|
export { creditsToUsd, usdToCredits } from "./pricing-snapshot.generated.js";
|
|
38
39
|
export declare const PRICING_SHEET_VERIFIED = "2026-07";
|
|
39
40
|
export declare const PRICING_CREDITS_PER_USD = 100;
|
|
40
|
-
/**
|
|
41
|
-
|
|
41
|
+
/**
|
|
42
|
+
* On-demand top-up price per 100 credits (USD) right now; subscriptions pay
|
|
43
|
+
* $1.00. It rises $1.25 → $1.30 at the 2026-09 repricing's instant (S10), so a
|
|
44
|
+
* page resolves it on the server and passes the number to client components,
|
|
45
|
+
* which cannot read the switch. Same value as `creditTopupUsdCentsPer100() / 100`
|
|
46
|
+
* from `@oxygen/shared/billing`.
|
|
47
|
+
*/
|
|
48
|
+
export declare function topupUsdPer100(options?: RepricingOptions): number;
|
|
49
|
+
/**
|
|
50
|
+
* How marketing copy quotes the top-up rate per 100 credits: `inForce` is the
|
|
51
|
+
* rate charged now ("$1.25"); `scheduled` names the rate and date it moves to
|
|
52
|
+
* ("$1.30 from October 27, 2026") only while the repricing date is set and still
|
|
53
|
+
* ahead, so nothing is announced before an operator sets it.
|
|
54
|
+
*/
|
|
55
|
+
export declare function topupRateCopy(options?: RepricingOptions): {
|
|
56
|
+
inForce: string;
|
|
57
|
+
scheduled: string | null;
|
|
58
|
+
};
|
|
42
59
|
export declare const SENDING_SEAT_USD_CENTS: {
|
|
43
60
|
readonly linkedin: 3000;
|
|
44
61
|
readonly whatsapp: 3000;
|
|
45
62
|
readonly phone_number: 1000;
|
|
46
63
|
readonly email_sender: 100;
|
|
47
64
|
};
|
|
48
|
-
export declare const MANAGED_INBOX_USD_CENTS = 400;
|
|
49
|
-
export declare const SENDING_DOMAIN_USD_CENTS = 1250;
|
|
50
65
|
export declare const SUBSCRIPTION_USD_PER_100 = 1;
|
|
51
66
|
/**
|
|
52
|
-
* AI column runs
|
|
67
|
+
* AI column runs per tier (Fast / Balanced / Max), re-priced 2026-09-26 with the
|
|
68
|
+
* model refresh (Philipp: Clay-level quality, 30-50% under Clay, >= 5x markup,
|
|
69
|
+
* Max excepted). Calibrated production mean COGS per row is $0.0013 / $0.0079 /
|
|
70
|
+
* $0.098, so the markups are ~11x / ~5.1x / ~2.5x; Max at 2.5x is an explicit
|
|
71
|
+
* founder exception ("gpt-6 sol @ 2.5x markup"). Evidence and method:
|
|
72
|
+
* packages/shared/src/hosted-ai.ts.
|
|
53
73
|
*
|
|
54
74
|
* RESOLVER-DERIVED, not seed-derived: the canonical values live in
|
|
55
75
|
* packages/integrations/src/cogs-rates.ts and are served per-workspace from
|
|
@@ -59,7 +79,7 @@ export declare const SUBSCRIPTION_USD_PER_100 = 1;
|
|
|
59
79
|
*/
|
|
60
80
|
export declare const AI_COLUMN_CREDITS: {
|
|
61
81
|
readonly low: 1.5;
|
|
62
|
-
readonly medium:
|
|
82
|
+
readonly medium: 4;
|
|
63
83
|
readonly high: 25;
|
|
64
84
|
};
|
|
65
85
|
/**
|
|
@@ -72,53 +92,125 @@ export declare const AI_COLUMN_CREDITS: {
|
|
|
72
92
|
* never read.
|
|
73
93
|
*
|
|
74
94
|
* The figures below describe the DEFAULT research column, which since D53 discovers
|
|
75
|
-
* then reads: `serper.search` (0.5) finds the URLs, then
|
|
76
|
-
*
|
|
77
|
-
*
|
|
78
|
-
*
|
|
79
|
-
*
|
|
80
|
-
* grounded on the snippets
|
|
95
|
+
* then reads: `serper.search` (0.5) finds the URLs, then an additive read turns the
|
|
96
|
+
* top result's ~160-char SERP teaser into real page text. The read tries OXYGEN's
|
|
97
|
+
* own `web.page_fetch` (0.1) first and `exa.contents` (0.5) only when the native
|
|
98
|
+
* fetch cannot read the page. So a typical row spends 0.6 and a preview reserves
|
|
99
|
+
* 4.6: the ceiling covers the `exa.search` fallback (3.5) firing when serper finds
|
|
100
|
+
* nothing plus both read lanes. A read miss leaves the row grounded on the snippets
|
|
101
|
+
* it already has.
|
|
81
102
|
*
|
|
82
103
|
* Both numbers are RESOLVER-DERIVED and pinned by pricing-sheet-conformance.test.ts
|
|
83
104
|
* against the shipped default, so a re-price or a lane change fails a test rather
|
|
84
105
|
* than quietly mispricing this page. Do not hand-edit them.
|
|
85
106
|
*/
|
|
86
|
-
export declare const AI_COLUMN_WEB_SEARCH_TYPICAL_CREDITS =
|
|
87
|
-
export declare const AI_COLUMN_WEB_SEARCH_RESERVED_CREDITS = 4.
|
|
88
|
-
/**
|
|
89
|
-
|
|
107
|
+
export declare const AI_COLUMN_WEB_SEARCH_TYPICAL_CREDITS = 0.6;
|
|
108
|
+
export declare const AI_COLUMN_WEB_SEARCH_RESERVED_CREDITS = 4.6;
|
|
109
|
+
/**
|
|
110
|
+
* Research depth (Claygent parity). `quick` is the single grounded pass priced
|
|
111
|
+
* above (the column's tier price plus AI_COLUMN_WEB_SEARCH_*; 2.1 typical at the
|
|
112
|
+
* Fast tier). A `standard` or `deep` row runs a bounded agent loop — several model
|
|
113
|
+
* turns over a growing evidence list — on a model the DEPTH fixes (standard on the
|
|
114
|
+
* Fast tier, deep on Balanced; the column's own tier applies to quick only), so its
|
|
115
|
+
* model leg is one flat price per row, reserved once:
|
|
116
|
+
*
|
|
117
|
+
* standard: 4.3 + 1.2 tools = 5.5 typical
|
|
118
|
+
* deep: 7.6 + 2.4 tools = 10 typical
|
|
119
|
+
*
|
|
120
|
+
* Founder-ratified 2026-09-26: 30-50% under Clay, >=5x markup. The Clay comparison
|
|
121
|
+
* it was set against: Clay web research bills per row in Data Credits — GPT-5 Nano
|
|
122
|
+
* 0.5 DC, Mini/Flash 1 DC, Claygent Neon 2 DC, Argon 3 DC — at >= $0.05 per DC plus
|
|
123
|
+
* ~$0.01 of action per row; OXYGEN credits are $0.01. Every figure must also keep
|
|
124
|
+
* >= 5x over the loop's modelled COGS. Pinned against the live estimator by
|
|
125
|
+
* @oxygen/integrations pricing-sheet-conformance.test.ts.
|
|
126
|
+
*
|
|
127
|
+
* Per-turn cost basis after the 2026-09-26 model refresh (UNMEASURED for the
|
|
128
|
+
* loop -- measure on dev via Langfuse after deploy). One calibrated single call
|
|
129
|
+
* costs $0.0013 on Fast (gpt-6-luna) and $0.0079 on Balanced (deepseek-v4.1-flash,
|
|
130
|
+
* reasoning off); a loop turn re-sends its growing evidence, so it costs at
|
|
131
|
+
* least that. At 5x the standard leg (4.3 cr = $0.043) covers ~$0.0086 of model
|
|
132
|
+
* spend, about 6.6 Fast single-call equivalents; the deep leg (7.6 cr = $0.076)
|
|
133
|
+
* covers ~$0.0152, about 1.9 Balanced single-call equivalents. Deep is the one
|
|
134
|
+
* likely under 5x once a loop runs more than two turns.
|
|
135
|
+
*/
|
|
136
|
+
export declare const RESEARCH_DEPTH_MODEL_CREDITS: {
|
|
137
|
+
readonly standard: 4.3;
|
|
138
|
+
readonly deep: 7.6;
|
|
139
|
+
};
|
|
140
|
+
/** The tier whose model each loop depth runs on, whatever tier the column stores. */
|
|
141
|
+
export declare const RESEARCH_DEPTH_MODEL_TIER: {
|
|
142
|
+
readonly standard: "low";
|
|
143
|
+
readonly deep: "medium";
|
|
144
|
+
};
|
|
145
|
+
/**
|
|
146
|
+
* The tool half of a standard/deep row. `typical` is the ratified planning shape —
|
|
147
|
+
* standard: 2 serper searches + 2 native page reads; deep: 3 serper searches + 4
|
|
148
|
+
* native reads + 1 exa.contents fallback read. `reserved` is every budgeted tool
|
|
149
|
+
* call at its dearest lane — each web_search, the row's shared exa.search pool
|
|
150
|
+
* (standard 1, deep 2: the zero-result fallback and semantic_search draw on it),
|
|
151
|
+
* each read's full ladder, deep's one Firecrawl read and site crawls. Deep's
|
|
152
|
+
* company-news call is opt-in (a news lead-lane column) and adds its own price to
|
|
153
|
+
* the reserve only there. Resolver-derived, pinned like the above.
|
|
154
|
+
*/
|
|
155
|
+
export declare const RESEARCH_DEPTH_GROUNDING_CREDITS: {
|
|
156
|
+
readonly standard: {
|
|
157
|
+
readonly typical: 1.2;
|
|
158
|
+
readonly reserved: 7.4;
|
|
159
|
+
};
|
|
160
|
+
readonly deep: {
|
|
161
|
+
readonly typical: 2.4;
|
|
162
|
+
readonly reserved: 17.4;
|
|
163
|
+
};
|
|
164
|
+
};
|
|
165
|
+
/** Typical per-row totals at each depth's default tier (founder-ratified 2026-09-26). */
|
|
166
|
+
export declare const RESEARCH_DEPTH_TYPICAL_ROW_CREDITS: {
|
|
167
|
+
readonly quick: 2.1;
|
|
168
|
+
readonly standard: 5.5;
|
|
169
|
+
readonly deep: 10;
|
|
170
|
+
};
|
|
171
|
+
/**
|
|
172
|
+
* Workflow steps are priced through the 2026-09 repricing switch, so this sheet
|
|
173
|
+
* carries no flat number for them: the price in force is
|
|
174
|
+
* `automationStepCredits()` (`@oxygen/shared/billing`), resolved on the server.
|
|
175
|
+
* The definition is re-exported for surfaces that show what the step costs
|
|
176
|
+
* before and after the switch. Row writes inside a run are free.
|
|
177
|
+
*/
|
|
178
|
+
export { AUTOMATION_STEP_CREDITS_REPRICING } from "./repricing.js";
|
|
90
179
|
/**
|
|
91
|
-
*
|
|
92
|
-
*
|
|
93
|
-
*
|
|
94
|
-
*
|
|
180
|
+
* The flat mailbox line of a managed Google inbox after the 2026-09 repricing
|
|
181
|
+
* (400, decision 3.1, slice S32). Its 100-credit mailbox connection, warm-up
|
|
182
|
+
* included, bills beside it: 500 all-in. The all-in price waits for the S07
|
|
183
|
+
* switch, so a surface that quotes it uses `managedInboxAllInCredits()` from
|
|
184
|
+
* `@oxygen/shared/repricing`, resolved on the server. Kept as an object
|
|
185
|
+
* (min/typical/max all equal) so callers that destructure any field need no
|
|
186
|
+
* shape change.
|
|
95
187
|
*/
|
|
96
|
-
export declare const MANAGED_INBOX_MARKUP = 1.25;
|
|
97
188
|
export declare const MANAGED_INBOX_CREDITS_PER_MONTH: {
|
|
98
|
-
readonly min:
|
|
99
|
-
readonly typical:
|
|
100
|
-
readonly max:
|
|
189
|
+
readonly min: 400;
|
|
190
|
+
readonly typical: 400;
|
|
191
|
+
readonly max: 400;
|
|
101
192
|
};
|
|
102
193
|
/**
|
|
103
|
-
* VOICE (the call channel).
|
|
104
|
-
*
|
|
105
|
-
*
|
|
106
|
-
* per-minute rate is small enough that a 1.25× markup would not cover it.
|
|
194
|
+
* VOICE (the call channel). One price per connected minute, 5 credits ($0.05),
|
|
195
|
+
* with answering-machine detection folded in (repricing 2026-09, decision 7.3;
|
|
196
|
+
* it was 9 a minute plus 3.8 per connected call). A call nobody answered is free.
|
|
107
197
|
*
|
|
108
|
-
* A browser-softphone call bills TWO Twilio legs, which is easy to miss
|
|
198
|
+
* A browser-softphone call bills TWO Twilio legs, which is easy to miss when
|
|
199
|
+
* checking the margin:
|
|
109
200
|
* browser/app (the rep's WebRTC leg) $0.0040 / min
|
|
110
201
|
* outbound to a US local/mobile $0.0140 / min
|
|
111
202
|
* ─────────────
|
|
112
|
-
* $0.0180 / min
|
|
113
|
-
* Costing only the outbound leg
|
|
203
|
+
* $0.0180 / min → 5 credits is ~2.8×
|
|
204
|
+
* Costing only the outbound leg understates the cost of every call by 29%.
|
|
114
205
|
*/
|
|
115
|
-
export declare const
|
|
116
|
-
export declare const
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
206
|
+
export declare const VOICE_NUMBER_CREDITS_PER_MONTH = 1000;
|
|
207
|
+
export declare const VOICE_CREDITS_PER_MINUTE = 5;
|
|
208
|
+
/**
|
|
209
|
+
* Sending domain bought through OXYGEN: InboxKit's cost passed through at 1.0x, a year at
|
|
210
|
+
* a time, renewed yearly at the vendor's renewal cost (repricing 2026-09, decision 3.3).
|
|
211
|
+
* Representative: a .com is 1,250 credits a year; the charge is the exact domain's price.
|
|
212
|
+
*/
|
|
213
|
+
export declare const SENDING_DOMAIN_CREDITS_PER_YEAR_TYPICAL = 1250;
|
|
122
214
|
/**
|
|
123
215
|
* Inbox deliverability (EmailGuard placement seat). A flat monthly price per
|
|
124
216
|
* SUBSCRIBED inbox covering continuous deliverability monitoring (blacklist,
|
|
@@ -128,22 +220,32 @@ export declare const MANAGED_DOMAIN_CREDITS_PER_YEAR_TYPICAL = 1305;
|
|
|
128
220
|
*
|
|
129
221
|
* THE ALLOWANCE IS LOAD-BEARING, not a perk. Placement COGS is per TEST
|
|
130
222
|
* ($0.1327 on EmailGuard's Agency plan), not per inbox, so an unbounded seat
|
|
131
|
-
* inverts its own margin: at $1.00/inbox-month the EIGHTH test in a cycle
|
|
132
|
-
* already sold at a loss. Two included tests cost $0.265 against $1.
|
|
133
|
-
* revenue
|
|
223
|
+
* inverts its own margin: at $1.00/inbox-month the EIGHTH test in a cycle was
|
|
224
|
+
* already sold at a loss. Two included tests cost $0.265 against $1.35 of
|
|
225
|
+
* revenue at the 2026-09 price, and everything past them bills
|
|
134
226
|
* PLACEMENT_TEST_OVERAGE_CREDITS. Orgs on their own EmailGuard key (BYOK) pay 0.
|
|
227
|
+
*
|
|
228
|
+
* These two prices are the RATIFIED list prices from the 2026-09 repricing
|
|
229
|
+
* (135 and 66, slice S30). The rises wait for the S07 effective-date switch, so
|
|
230
|
+
* a surface that quotes or bills uses `deliverabilitySeatCredits()` and
|
|
231
|
+
* `placementTestCredits()` from `@oxygen/shared/repricing` (100 and 16.6 until
|
|
232
|
+
* the switch's instant), never these constants.
|
|
135
233
|
*/
|
|
136
|
-
export declare const DELIVERABILITY_SEAT_CREDITS_PER_MONTH =
|
|
234
|
+
export declare const DELIVERABILITY_SEAT_CREDITS_PER_MONTH = 135;
|
|
137
235
|
export declare const DELIVERABILITY_INCLUDED_TESTS_PER_INBOX = 2;
|
|
138
|
-
export declare const PLACEMENT_TEST_OVERAGE_CREDITS =
|
|
236
|
+
export declare const PLACEMENT_TEST_OVERAGE_CREDITS = 66;
|
|
139
237
|
/**
|
|
140
238
|
* LinkedIn accounts: founder decision (2026-07-25) — a PURE seat model. The
|
|
141
239
|
* flat monthly connection fee per connected account is the WHOLE LinkedIn
|
|
142
240
|
* price; every per-action charge is 0. Per-MESSAGE sends on email and WhatsApp
|
|
143
241
|
* stay 0 too — but a connected WhatsApp NUMBER carries its own monthly
|
|
144
242
|
* connection fee, see WHATSAPP_ACCOUNT_CREDITS_PER_MONTH.
|
|
243
|
+
*
|
|
244
|
+
* The value is the seeded price after the 2026-09 repricing (3,400, decision
|
|
245
|
+
* 2.1). The price in force before its effective-date switch is lower: resolve
|
|
246
|
+
* it with repricedChargeCredits from `@oxygen/shared/repricing` on the server.
|
|
145
247
|
*/
|
|
146
|
-
export declare const LINKEDIN_ACCOUNT_CREDITS_PER_MONTH =
|
|
248
|
+
export declare const LINKEDIN_ACCOUNT_CREDITS_PER_MONTH = 3400;
|
|
147
249
|
export declare const LINKEDIN_ACTION_CREDITS: {
|
|
148
250
|
readonly visit_profile: 0;
|
|
149
251
|
readonly invite: 0;
|
|
@@ -156,11 +258,18 @@ export declare const LINKEDIN_ACTION_CREDITS: {
|
|
|
156
258
|
export declare const LINKEDIN_TYPICAL_ACTIONS_CREDITS_PER_MONTH = 0;
|
|
157
259
|
/**
|
|
158
260
|
* WhatsApp numbers: flat monthly connection fee per connected number, the same
|
|
159
|
-
* seat shape as LinkedIn.
|
|
160
|
-
*
|
|
161
|
-
*
|
|
261
|
+
* seat shape as LinkedIn. WhatsApp message sends themselves remain 0 credits.
|
|
262
|
+
* Seeded at the 2026-09 repricing's price (3,000, decision 2.3); resolve the
|
|
263
|
+
* price in force with repricedChargeCredits.
|
|
264
|
+
*/
|
|
265
|
+
export declare const WHATSAPP_ACCOUNT_CREDITS_PER_MONTH = 3000;
|
|
266
|
+
/**
|
|
267
|
+
* X accounts: monthly credit reservation per connected account (2026-09
|
|
268
|
+
* repricing, decision 2.2). Like the LinkedIn and WhatsApp constants above this
|
|
269
|
+
* is the seeded, post-repricing price; show the price in force with
|
|
270
|
+
* repricedChargeCredits from `@oxygen/shared/repricing`.
|
|
162
271
|
*/
|
|
163
|
-
export declare const
|
|
272
|
+
export declare const X_ACCOUNT_CREDITS_PER_MONTH = 1000;
|
|
164
273
|
/** Dedicated egress IP add-on. */
|
|
165
274
|
export declare const EGRESS_IP_CREDITS_PER_MONTH = 2500;
|
|
166
275
|
/**
|
|
@@ -182,7 +291,7 @@ export declare const ENRICHMENT_CREDITS: {
|
|
|
182
291
|
readonly phone_find_typical: 99;
|
|
183
292
|
readonly company_enrich_typical: 9.9;
|
|
184
293
|
readonly web_search: 0.5;
|
|
185
|
-
readonly page_scrape:
|
|
294
|
+
readonly page_scrape: 1.6;
|
|
186
295
|
readonly linkedin_profile_scrape: 1;
|
|
187
296
|
};
|
|
188
297
|
/** Editable calculator default: blended credits per fully-enriched row. */
|
|
@@ -34,21 +34,46 @@
|
|
|
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 {
|
|
37
|
+
import { 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, 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_INBOX_CREDITS_PER_MONTH as SNAPSHOT_MANAGED_INBOX_CREDITS_PER_MONTH, PLACEMENT_TEST_OVERAGE_CREDITS as SNAPSHOT_PLACEMENT_TEST_OVERAGE_CREDITS, PRICE_SHEET_VERIFIED as SNAPSHOT_PRICE_SHEET_VERIFIED, SEND_CREDITS as SNAPSHOT_SEND_CREDITS, SENDING_DOMAIN_CREDITS_PER_YEAR_TYPICAL as SNAPSHOT_SENDING_DOMAIN_CREDITS_PER_YEAR_TYPICAL, SUBSCRIPTION_USD_PER_100 as SNAPSHOT_SUBSCRIPTION_USD_PER_100, VOICE_CREDITS_PER_MINUTE as SNAPSHOT_VOICE_CREDITS_PER_MINUTE, VOICE_NUMBER_CREDITS_PER_MONTH as SNAPSHOT_VOICE_NUMBER_CREDITS_PER_MONTH, WHATSAPP_ACCOUNT_CREDITS_PER_MONTH as SNAPSHOT_WHATSAPP_ACCOUNT_CREDITS_PER_MONTH, X_ACCOUNT_CREDITS_PER_MONTH as SNAPSHOT_X_ACCOUNT_CREDITS_PER_MONTH, } from "./pricing-snapshot.generated.js";
|
|
38
|
+
import { formatRepricingDate, repricedValue, scheduledRepricedValue, TOPUP_RATE_REPRICING, } from "./repricing.js";
|
|
38
39
|
export { creditsToUsd, usdToCredits } from "./pricing-snapshot.generated.js";
|
|
39
40
|
export const PRICING_SHEET_VERIFIED = SNAPSHOT_PRICE_SHEET_VERIFIED;
|
|
40
41
|
export const PRICING_CREDITS_PER_USD = SNAPSHOT_CREDITS_PER_USD;
|
|
41
|
-
/**
|
|
42
|
-
|
|
42
|
+
/**
|
|
43
|
+
* On-demand top-up price per 100 credits (USD) right now; subscriptions pay
|
|
44
|
+
* $1.00. It rises $1.25 → $1.30 at the 2026-09 repricing's instant (S10), so a
|
|
45
|
+
* page resolves it on the server and passes the number to client components,
|
|
46
|
+
* which cannot read the switch. Same value as `creditTopupUsdCentsPer100() / 100`
|
|
47
|
+
* from `@oxygen/shared/billing`.
|
|
48
|
+
*/
|
|
49
|
+
export function topupUsdPer100(options = {}) {
|
|
50
|
+
return repricedValue(TOPUP_RATE_REPRICING, options) / 100;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* How marketing copy quotes the top-up rate per 100 credits: `inForce` is the
|
|
54
|
+
* rate charged now ("$1.25"); `scheduled` names the rate and date it moves to
|
|
55
|
+
* ("$1.30 from October 27, 2026") only while the repricing date is set and still
|
|
56
|
+
* ahead, so nothing is announced before an operator sets it.
|
|
57
|
+
*/
|
|
58
|
+
export function topupRateCopy(options = {}) {
|
|
59
|
+
const next = scheduledRepricedValue(TOPUP_RATE_REPRICING, options);
|
|
60
|
+
return {
|
|
61
|
+
inForce: `$${topupUsdPer100(options).toFixed(2)}`,
|
|
62
|
+
scheduled: next ? `$${(next.value / 100).toFixed(2)} from ${formatRepricingDate(next.effectiveAt)}` : null,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
43
65
|
// Dollar-priced CAPACITY, re-exported on the client-safe subpath so the pricing
|
|
44
66
|
// calculator and the marketing sections quote the same numbers the product
|
|
45
67
|
// charges. These are not credits and must never be converted as if they were.
|
|
46
68
|
export const SENDING_SEAT_USD_CENTS = SNAPSHOT_SENDING_SEAT_USD_CENTS;
|
|
47
|
-
export const MANAGED_INBOX_USD_CENTS = SNAPSHOT_MANAGED_INBOX_USD_CENTS;
|
|
48
|
-
export const SENDING_DOMAIN_USD_CENTS = SNAPSHOT_SENDING_DOMAIN_USD_CENTS;
|
|
49
69
|
export const SUBSCRIPTION_USD_PER_100 = SNAPSHOT_SUBSCRIPTION_USD_PER_100;
|
|
50
70
|
/**
|
|
51
|
-
* AI column runs
|
|
71
|
+
* AI column runs per tier (Fast / Balanced / Max), re-priced 2026-09-26 with the
|
|
72
|
+
* model refresh (Philipp: Clay-level quality, 30-50% under Clay, >= 5x markup,
|
|
73
|
+
* Max excepted). Calibrated production mean COGS per row is $0.0013 / $0.0079 /
|
|
74
|
+
* $0.098, so the markups are ~11x / ~5.1x / ~2.5x; Max at 2.5x is an explicit
|
|
75
|
+
* founder exception ("gpt-6 sol @ 2.5x markup"). Evidence and method:
|
|
76
|
+
* packages/shared/src/hosted-ai.ts.
|
|
52
77
|
*
|
|
53
78
|
* RESOLVER-DERIVED, not seed-derived: the canonical values live in
|
|
54
79
|
* packages/integrations/src/cogs-rates.ts and are served per-workspace from
|
|
@@ -56,7 +81,7 @@ export const SUBSCRIPTION_USD_PER_100 = SNAPSHOT_SUBSCRIPTION_USD_PER_100;
|
|
|
56
81
|
* against the live estimator, so a tier re-price fails a test rather than
|
|
57
82
|
* quietly mispricing the page.
|
|
58
83
|
*/
|
|
59
|
-
export const AI_COLUMN_CREDITS = { low: 1.5, medium:
|
|
84
|
+
export const AI_COLUMN_CREDITS = { low: 1.5, medium: 4, high: 25 };
|
|
60
85
|
/**
|
|
61
86
|
* Web-search grounding, billed per PROVIDER CALL on top of the model — not a flat
|
|
62
87
|
* adder.
|
|
@@ -67,53 +92,109 @@ export const AI_COLUMN_CREDITS = { low: 1.5, medium: 7.5, high: 25 };
|
|
|
67
92
|
* never read.
|
|
68
93
|
*
|
|
69
94
|
* The figures below describe the DEFAULT research column, which since D53 discovers
|
|
70
|
-
* then reads: `serper.search` (0.5) finds the URLs, then
|
|
71
|
-
*
|
|
72
|
-
*
|
|
73
|
-
*
|
|
74
|
-
*
|
|
75
|
-
* grounded on the snippets
|
|
95
|
+
* then reads: `serper.search` (0.5) finds the URLs, then an additive read turns the
|
|
96
|
+
* top result's ~160-char SERP teaser into real page text. The read tries OXYGEN's
|
|
97
|
+
* own `web.page_fetch` (0.1) first and `exa.contents` (0.5) only when the native
|
|
98
|
+
* fetch cannot read the page. So a typical row spends 0.6 and a preview reserves
|
|
99
|
+
* 4.6: the ceiling covers the `exa.search` fallback (3.5) firing when serper finds
|
|
100
|
+
* nothing plus both read lanes. A read miss leaves the row grounded on the snippets
|
|
101
|
+
* it already has.
|
|
76
102
|
*
|
|
77
103
|
* Both numbers are RESOLVER-DERIVED and pinned by pricing-sheet-conformance.test.ts
|
|
78
104
|
* against the shipped default, so a re-price or a lane change fails a test rather
|
|
79
105
|
* than quietly mispricing this page. Do not hand-edit them.
|
|
80
106
|
*/
|
|
81
|
-
export const AI_COLUMN_WEB_SEARCH_TYPICAL_CREDITS =
|
|
82
|
-
export const AI_COLUMN_WEB_SEARCH_RESERVED_CREDITS = 4.
|
|
83
|
-
/**
|
|
84
|
-
|
|
107
|
+
export const AI_COLUMN_WEB_SEARCH_TYPICAL_CREDITS = 0.6;
|
|
108
|
+
export const AI_COLUMN_WEB_SEARCH_RESERVED_CREDITS = 4.6;
|
|
109
|
+
/**
|
|
110
|
+
* Research depth (Claygent parity). `quick` is the single grounded pass priced
|
|
111
|
+
* above (the column's tier price plus AI_COLUMN_WEB_SEARCH_*; 2.1 typical at the
|
|
112
|
+
* Fast tier). A `standard` or `deep` row runs a bounded agent loop — several model
|
|
113
|
+
* turns over a growing evidence list — on a model the DEPTH fixes (standard on the
|
|
114
|
+
* Fast tier, deep on Balanced; the column's own tier applies to quick only), so its
|
|
115
|
+
* model leg is one flat price per row, reserved once:
|
|
116
|
+
*
|
|
117
|
+
* standard: 4.3 + 1.2 tools = 5.5 typical
|
|
118
|
+
* deep: 7.6 + 2.4 tools = 10 typical
|
|
119
|
+
*
|
|
120
|
+
* Founder-ratified 2026-09-26: 30-50% under Clay, >=5x markup. The Clay comparison
|
|
121
|
+
* it was set against: Clay web research bills per row in Data Credits — GPT-5 Nano
|
|
122
|
+
* 0.5 DC, Mini/Flash 1 DC, Claygent Neon 2 DC, Argon 3 DC — at >= $0.05 per DC plus
|
|
123
|
+
* ~$0.01 of action per row; OXYGEN credits are $0.01. Every figure must also keep
|
|
124
|
+
* >= 5x over the loop's modelled COGS. Pinned against the live estimator by
|
|
125
|
+
* @oxygen/integrations pricing-sheet-conformance.test.ts.
|
|
126
|
+
*
|
|
127
|
+
* Per-turn cost basis after the 2026-09-26 model refresh (UNMEASURED for the
|
|
128
|
+
* loop -- measure on dev via Langfuse after deploy). One calibrated single call
|
|
129
|
+
* costs $0.0013 on Fast (gpt-6-luna) and $0.0079 on Balanced (deepseek-v4.1-flash,
|
|
130
|
+
* reasoning off); a loop turn re-sends its growing evidence, so it costs at
|
|
131
|
+
* least that. At 5x the standard leg (4.3 cr = $0.043) covers ~$0.0086 of model
|
|
132
|
+
* spend, about 6.6 Fast single-call equivalents; the deep leg (7.6 cr = $0.076)
|
|
133
|
+
* covers ~$0.0152, about 1.9 Balanced single-call equivalents. Deep is the one
|
|
134
|
+
* likely under 5x once a loop runs more than two turns.
|
|
135
|
+
*/
|
|
136
|
+
export const RESEARCH_DEPTH_MODEL_CREDITS = { standard: 4.3, deep: 7.6 };
|
|
137
|
+
/** The tier whose model each loop depth runs on, whatever tier the column stores. */
|
|
138
|
+
export const RESEARCH_DEPTH_MODEL_TIER = { standard: "low", deep: "medium" };
|
|
139
|
+
/**
|
|
140
|
+
* The tool half of a standard/deep row. `typical` is the ratified planning shape —
|
|
141
|
+
* standard: 2 serper searches + 2 native page reads; deep: 3 serper searches + 4
|
|
142
|
+
* native reads + 1 exa.contents fallback read. `reserved` is every budgeted tool
|
|
143
|
+
* call at its dearest lane — each web_search, the row's shared exa.search pool
|
|
144
|
+
* (standard 1, deep 2: the zero-result fallback and semantic_search draw on it),
|
|
145
|
+
* each read's full ladder, deep's one Firecrawl read and site crawls. Deep's
|
|
146
|
+
* company-news call is opt-in (a news lead-lane column) and adds its own price to
|
|
147
|
+
* the reserve only there. Resolver-derived, pinned like the above.
|
|
148
|
+
*/
|
|
149
|
+
export const RESEARCH_DEPTH_GROUNDING_CREDITS = {
|
|
150
|
+
standard: { typical: 1.2, reserved: 7.4 },
|
|
151
|
+
deep: { typical: 2.4, reserved: 17.4 },
|
|
152
|
+
};
|
|
153
|
+
/** Typical per-row totals at each depth's default tier (founder-ratified 2026-09-26). */
|
|
154
|
+
export const RESEARCH_DEPTH_TYPICAL_ROW_CREDITS = { quick: 2.1, standard: 5.5, deep: 10 };
|
|
85
155
|
/**
|
|
86
|
-
*
|
|
87
|
-
*
|
|
88
|
-
*
|
|
89
|
-
*
|
|
156
|
+
* Workflow steps are priced through the 2026-09 repricing switch, so this sheet
|
|
157
|
+
* carries no flat number for them: the price in force is
|
|
158
|
+
* `automationStepCredits()` (`@oxygen/shared/billing`), resolved on the server.
|
|
159
|
+
* The definition is re-exported for surfaces that show what the step costs
|
|
160
|
+
* before and after the switch. Row writes inside a run are free.
|
|
161
|
+
*/
|
|
162
|
+
export { AUTOMATION_STEP_CREDITS_REPRICING } from "./repricing.js";
|
|
163
|
+
/**
|
|
164
|
+
* The flat mailbox line of a managed Google inbox after the 2026-09 repricing
|
|
165
|
+
* (400, decision 3.1, slice S32). Its 100-credit mailbox connection, warm-up
|
|
166
|
+
* included, bills beside it: 500 all-in. The all-in price waits for the S07
|
|
167
|
+
* switch, so a surface that quotes it uses `managedInboxAllInCredits()` from
|
|
168
|
+
* `@oxygen/shared/repricing`, resolved on the server. Kept as an object
|
|
169
|
+
* (min/typical/max all equal) so callers that destructure any field need no
|
|
170
|
+
* shape change.
|
|
90
171
|
*/
|
|
91
|
-
export const MANAGED_INBOX_MARKUP = SNAPSHOT_MANAGED_INBOX_MARKUP;
|
|
92
172
|
export const MANAGED_INBOX_CREDITS_PER_MONTH = {
|
|
93
173
|
min: SNAPSHOT_MANAGED_INBOX_CREDITS_PER_MONTH,
|
|
94
174
|
typical: SNAPSHOT_MANAGED_INBOX_CREDITS_PER_MONTH,
|
|
95
175
|
max: SNAPSHOT_MANAGED_INBOX_CREDITS_PER_MONTH,
|
|
96
176
|
};
|
|
97
177
|
/**
|
|
98
|
-
* VOICE (the call channel).
|
|
99
|
-
*
|
|
100
|
-
*
|
|
101
|
-
* per-minute rate is small enough that a 1.25× markup would not cover it.
|
|
178
|
+
* VOICE (the call channel). One price per connected minute, 5 credits ($0.05),
|
|
179
|
+
* with answering-machine detection folded in (repricing 2026-09, decision 7.3;
|
|
180
|
+
* it was 9 a minute plus 3.8 per connected call). A call nobody answered is free.
|
|
102
181
|
*
|
|
103
|
-
* A browser-softphone call bills TWO Twilio legs, which is easy to miss
|
|
182
|
+
* A browser-softphone call bills TWO Twilio legs, which is easy to miss when
|
|
183
|
+
* checking the margin:
|
|
104
184
|
* browser/app (the rep's WebRTC leg) $0.0040 / min
|
|
105
185
|
* outbound to a US local/mobile $0.0140 / min
|
|
106
186
|
* ─────────────
|
|
107
|
-
* $0.0180 / min
|
|
108
|
-
* Costing only the outbound leg
|
|
187
|
+
* $0.0180 / min → 5 credits is ~2.8×
|
|
188
|
+
* Costing only the outbound leg understates the cost of every call by 29%.
|
|
109
189
|
*/
|
|
110
|
-
export const VOICE_MARKUP = SNAPSHOT_VOICE_MARKUP;
|
|
111
190
|
export const VOICE_NUMBER_CREDITS_PER_MONTH = SNAPSHOT_VOICE_NUMBER_CREDITS_PER_MONTH;
|
|
112
191
|
export const VOICE_CREDITS_PER_MINUTE = SNAPSHOT_VOICE_CREDITS_PER_MINUTE;
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
192
|
+
/**
|
|
193
|
+
* Sending domain bought through OXYGEN: InboxKit's cost passed through at 1.0x, a year at
|
|
194
|
+
* a time, renewed yearly at the vendor's renewal cost (repricing 2026-09, decision 3.3).
|
|
195
|
+
* Representative: a .com is 1,250 credits a year; the charge is the exact domain's price.
|
|
196
|
+
*/
|
|
197
|
+
export const SENDING_DOMAIN_CREDITS_PER_YEAR_TYPICAL = SNAPSHOT_SENDING_DOMAIN_CREDITS_PER_YEAR_TYPICAL;
|
|
117
198
|
/**
|
|
118
199
|
* Inbox deliverability (EmailGuard placement seat). A flat monthly price per
|
|
119
200
|
* SUBSCRIBED inbox covering continuous deliverability monitoring (blacklist,
|
|
@@ -123,10 +204,16 @@ export const MANAGED_DOMAIN_CREDITS_PER_YEAR_TYPICAL = SNAPSHOT_MANAGED_DOMAIN_C
|
|
|
123
204
|
*
|
|
124
205
|
* THE ALLOWANCE IS LOAD-BEARING, not a perk. Placement COGS is per TEST
|
|
125
206
|
* ($0.1327 on EmailGuard's Agency plan), not per inbox, so an unbounded seat
|
|
126
|
-
* inverts its own margin: at $1.00/inbox-month the EIGHTH test in a cycle
|
|
127
|
-
* already sold at a loss. Two included tests cost $0.265 against $1.
|
|
128
|
-
* revenue
|
|
207
|
+
* inverts its own margin: at $1.00/inbox-month the EIGHTH test in a cycle was
|
|
208
|
+
* already sold at a loss. Two included tests cost $0.265 against $1.35 of
|
|
209
|
+
* revenue at the 2026-09 price, and everything past them bills
|
|
129
210
|
* PLACEMENT_TEST_OVERAGE_CREDITS. Orgs on their own EmailGuard key (BYOK) pay 0.
|
|
211
|
+
*
|
|
212
|
+
* These two prices are the RATIFIED list prices from the 2026-09 repricing
|
|
213
|
+
* (135 and 66, slice S30). The rises wait for the S07 effective-date switch, so
|
|
214
|
+
* a surface that quotes or bills uses `deliverabilitySeatCredits()` and
|
|
215
|
+
* `placementTestCredits()` from `@oxygen/shared/repricing` (100 and 16.6 until
|
|
216
|
+
* the switch's instant), never these constants.
|
|
130
217
|
*/
|
|
131
218
|
export const DELIVERABILITY_SEAT_CREDITS_PER_MONTH = SNAPSHOT_DELIVERABILITY_SEAT_CREDITS_PER_MONTH;
|
|
132
219
|
export const DELIVERABILITY_INCLUDED_TESTS_PER_INBOX = SNAPSHOT_DELIVERABILITY_INCLUDED_TESTS_PER_INBOX;
|
|
@@ -137,17 +224,28 @@ export const PLACEMENT_TEST_OVERAGE_CREDITS = SNAPSHOT_PLACEMENT_TEST_OVERAGE_CR
|
|
|
137
224
|
* price; every per-action charge is 0. Per-MESSAGE sends on email and WhatsApp
|
|
138
225
|
* stay 0 too — but a connected WhatsApp NUMBER carries its own monthly
|
|
139
226
|
* connection fee, see WHATSAPP_ACCOUNT_CREDITS_PER_MONTH.
|
|
227
|
+
*
|
|
228
|
+
* The value is the seeded price after the 2026-09 repricing (3,400, decision
|
|
229
|
+
* 2.1). The price in force before its effective-date switch is lower: resolve
|
|
230
|
+
* it with repricedChargeCredits from `@oxygen/shared/repricing` on the server.
|
|
140
231
|
*/
|
|
141
232
|
export const LINKEDIN_ACCOUNT_CREDITS_PER_MONTH = SNAPSHOT_LINKEDIN_ACCOUNT_CREDITS_PER_MONTH;
|
|
142
233
|
export const LINKEDIN_ACTION_CREDITS = SNAPSHOT_LINKEDIN_ACTION_CREDITS;
|
|
143
234
|
export const LINKEDIN_TYPICAL_ACTIONS_CREDITS_PER_MONTH = SNAPSHOT_LINKEDIN_TYPICAL_ACTIONS_CREDITS_PER_MONTH;
|
|
144
235
|
/**
|
|
145
236
|
* WhatsApp numbers: flat monthly connection fee per connected number, the same
|
|
146
|
-
* seat shape as LinkedIn.
|
|
147
|
-
*
|
|
148
|
-
*
|
|
237
|
+
* seat shape as LinkedIn. WhatsApp message sends themselves remain 0 credits.
|
|
238
|
+
* Seeded at the 2026-09 repricing's price (3,000, decision 2.3); resolve the
|
|
239
|
+
* price in force with repricedChargeCredits.
|
|
149
240
|
*/
|
|
150
241
|
export const WHATSAPP_ACCOUNT_CREDITS_PER_MONTH = SNAPSHOT_WHATSAPP_ACCOUNT_CREDITS_PER_MONTH;
|
|
242
|
+
/**
|
|
243
|
+
* X accounts: monthly credit reservation per connected account (2026-09
|
|
244
|
+
* repricing, decision 2.2). Like the LinkedIn and WhatsApp constants above this
|
|
245
|
+
* is the seeded, post-repricing price; show the price in force with
|
|
246
|
+
* repricedChargeCredits from `@oxygen/shared/repricing`.
|
|
247
|
+
*/
|
|
248
|
+
export const X_ACCOUNT_CREDITS_PER_MONTH = SNAPSHOT_X_ACCOUNT_CREDITS_PER_MONTH;
|
|
151
249
|
/** Dedicated egress IP add-on. */
|
|
152
250
|
export const EGRESS_IP_CREDITS_PER_MONTH = SNAPSHOT_EGRESS_IP_CREDITS_PER_MONTH;
|
|
153
251
|
/**
|
|
@@ -173,7 +271,7 @@ export const ENRICHMENT_CREDITS = {
|
|
|
173
271
|
phone_find_typical: 99, // Prospeo/Findymail-class mobile
|
|
174
272
|
company_enrich_typical: 9.9,
|
|
175
273
|
web_search: 0.5, // Serper
|
|
176
|
-
page_scrape:
|
|
274
|
+
page_scrape: 1.6, // Firecrawl, 5x of $0.0032 (repricing 2026-09, S44)
|
|
177
275
|
linkedin_profile_scrape: 1, // Managed profile credit at $0.002 COGS, exactly 5x
|
|
178
276
|
};
|
|
179
277
|
/** Editable calculator default: blended credits per fully-enriched row. */
|