business-as-code 2.1.1 → 2.1.3
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/.turbo/turbo-build.log +1 -1
- package/CHANGELOG.md +8 -0
- package/LICENSE +21 -0
- package/dist/canvas/activities.d.ts +19 -0
- package/dist/canvas/activities.d.ts.map +1 -0
- package/dist/canvas/activities.js +20 -0
- package/dist/canvas/activities.js.map +1 -0
- package/dist/canvas/channels.d.ts +20 -0
- package/dist/canvas/channels.d.ts.map +1 -0
- package/dist/canvas/channels.js +21 -0
- package/dist/canvas/channels.js.map +1 -0
- package/dist/canvas/relationships.d.ts +20 -0
- package/dist/canvas/relationships.d.ts.map +1 -0
- package/dist/canvas/relationships.js +21 -0
- package/dist/canvas/relationships.js.map +1 -0
- package/dist/canvas/resources.d.ts +20 -0
- package/dist/canvas/resources.d.ts.map +1 -0
- package/dist/canvas/resources.js +30 -0
- package/dist/canvas/resources.js.map +1 -0
- package/dist/canvas/revenue.d.ts +22 -0
- package/dist/canvas/revenue.d.ts.map +1 -0
- package/dist/canvas/revenue.js +30 -0
- package/dist/canvas/revenue.js.map +1 -0
- package/dist/canvas/segments.d.ts +20 -0
- package/dist/canvas/segments.d.ts.map +1 -0
- package/dist/canvas/segments.js +28 -0
- package/dist/canvas/segments.js.map +1 -0
- package/dist/canvas/types.d.ts +232 -0
- package/dist/canvas/types.d.ts.map +1 -0
- package/dist/canvas/types.js +8 -0
- package/dist/canvas/types.js.map +1 -0
- package/dist/canvas/value.d.ts +20 -0
- package/dist/canvas/value.d.ts.map +1 -0
- package/dist/canvas/value.js +21 -0
- package/dist/canvas/value.js.map +1 -0
- package/dist/entities/planning.d.ts +0 -87
- package/package.json +13 -13
- package/src/canvas/activities.ts +32 -0
- package/src/canvas/canvas.ts +482 -0
- package/src/canvas/channels.ts +34 -0
- package/src/canvas/costs.ts +43 -0
- package/src/canvas/economics.ts +99 -0
- package/src/canvas/index.ts +206 -0
- package/src/canvas/partnerships.ts +34 -0
- package/src/canvas/projections.ts +141 -0
- package/src/canvas/relationships.ts +34 -0
- package/src/canvas/resources.ts +43 -0
- package/src/canvas/revenue.ts +56 -0
- package/src/canvas/segments.ts +42 -0
- package/src/canvas/types.ts +363 -0
- package/src/canvas/value.ts +34 -0
- package/tests/canvas.test.ts +842 -0
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Business Model Canvas Types
|
|
3
|
+
*
|
|
4
|
+
* TypeScript types for the 9 building blocks of the Business Model Canvas
|
|
5
|
+
* plus unit economics and financial projections.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
// =============================================================================
|
|
9
|
+
// Customer Segments
|
|
10
|
+
// =============================================================================
|
|
11
|
+
|
|
12
|
+
export type CustomerSegmentType =
|
|
13
|
+
| 'mass-market'
|
|
14
|
+
| 'niche'
|
|
15
|
+
| 'segmented'
|
|
16
|
+
| 'diversified'
|
|
17
|
+
| 'multi-sided'
|
|
18
|
+
|
|
19
|
+
export interface CustomerSegment {
|
|
20
|
+
name: string
|
|
21
|
+
description?: string
|
|
22
|
+
type: CustomerSegmentType
|
|
23
|
+
characteristics?: string[]
|
|
24
|
+
size?: number
|
|
25
|
+
revenuePerCustomer?: number
|
|
26
|
+
expectedPenetration?: number
|
|
27
|
+
potential?: number
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// =============================================================================
|
|
31
|
+
// Value Propositions
|
|
32
|
+
// =============================================================================
|
|
33
|
+
|
|
34
|
+
export type ValueType =
|
|
35
|
+
| 'newness'
|
|
36
|
+
| 'performance'
|
|
37
|
+
| 'customization'
|
|
38
|
+
| 'getting-job-done'
|
|
39
|
+
| 'design'
|
|
40
|
+
| 'brand-status'
|
|
41
|
+
| 'price'
|
|
42
|
+
| 'cost-reduction'
|
|
43
|
+
| 'risk-reduction'
|
|
44
|
+
| 'accessibility'
|
|
45
|
+
| 'convenience'
|
|
46
|
+
|
|
47
|
+
export interface ValueProposition {
|
|
48
|
+
name: string
|
|
49
|
+
description?: string
|
|
50
|
+
valueType?: ValueType
|
|
51
|
+
benefits: string[]
|
|
52
|
+
targetSegments?: string[]
|
|
53
|
+
quantifiedValue?: string
|
|
54
|
+
segmentFit?: Record<string, number>
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// =============================================================================
|
|
58
|
+
// Channels
|
|
59
|
+
// =============================================================================
|
|
60
|
+
|
|
61
|
+
export type ChannelType = 'direct' | 'indirect' | 'partner' | 'digital'
|
|
62
|
+
|
|
63
|
+
export type ChannelPhase =
|
|
64
|
+
| 'awareness'
|
|
65
|
+
| 'evaluation'
|
|
66
|
+
| 'purchase'
|
|
67
|
+
| 'delivery'
|
|
68
|
+
| 'support'
|
|
69
|
+
|
|
70
|
+
export interface Channel {
|
|
71
|
+
name: string
|
|
72
|
+
type: ChannelType
|
|
73
|
+
phases?: ChannelPhase[]
|
|
74
|
+
costPerAcquisition?: number
|
|
75
|
+
partnerType?: string
|
|
76
|
+
revenueShare?: number
|
|
77
|
+
conversionRate?: number
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// =============================================================================
|
|
81
|
+
// Customer Relationships
|
|
82
|
+
// =============================================================================
|
|
83
|
+
|
|
84
|
+
export type RelationshipType =
|
|
85
|
+
| 'personal-assistance'
|
|
86
|
+
| 'dedicated-assistance'
|
|
87
|
+
| 'self-service'
|
|
88
|
+
| 'automated'
|
|
89
|
+
| 'community'
|
|
90
|
+
| 'co-creation'
|
|
91
|
+
|
|
92
|
+
export interface CustomerRelationship {
|
|
93
|
+
name: string
|
|
94
|
+
type: RelationshipType
|
|
95
|
+
segment?: string
|
|
96
|
+
touchFrequency?: string
|
|
97
|
+
automationLevel?: number
|
|
98
|
+
supportChannels?: string[]
|
|
99
|
+
platforms?: string[]
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// =============================================================================
|
|
103
|
+
// Revenue Streams
|
|
104
|
+
// =============================================================================
|
|
105
|
+
|
|
106
|
+
export type RevenueType = 'recurring' | 'one-time' | 'transaction'
|
|
107
|
+
|
|
108
|
+
export type PricingModel =
|
|
109
|
+
| 'subscription'
|
|
110
|
+
| 'usage-based'
|
|
111
|
+
| 'tiered'
|
|
112
|
+
| 'freemium'
|
|
113
|
+
| 'fixed'
|
|
114
|
+
| 'dynamic'
|
|
115
|
+
| 'auction'
|
|
116
|
+
| 'licensing'
|
|
117
|
+
|
|
118
|
+
export interface PricingTier {
|
|
119
|
+
name: string
|
|
120
|
+
price: number
|
|
121
|
+
features?: string[]
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
export interface RevenueStream {
|
|
125
|
+
name: string
|
|
126
|
+
type: RevenueType
|
|
127
|
+
pricingModel: PricingModel
|
|
128
|
+
price?: number
|
|
129
|
+
billingCycle?: 'monthly' | 'quarterly' | 'annual'
|
|
130
|
+
pricePerUnit?: number
|
|
131
|
+
unitName?: string
|
|
132
|
+
tiers?: PricingTier[]
|
|
133
|
+
activeCustomers?: number
|
|
134
|
+
annualRevenue?: number
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// =============================================================================
|
|
138
|
+
// Key Resources
|
|
139
|
+
// =============================================================================
|
|
140
|
+
|
|
141
|
+
export type ResourceType = 'physical' | 'intellectual' | 'human' | 'financial'
|
|
142
|
+
|
|
143
|
+
export interface KeyResource {
|
|
144
|
+
name: string
|
|
145
|
+
type: ResourceType
|
|
146
|
+
cost?: number
|
|
147
|
+
depreciation?: string
|
|
148
|
+
protectionType?: string
|
|
149
|
+
headcount?: number
|
|
150
|
+
averageCost?: number
|
|
151
|
+
totalCost?: number
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// =============================================================================
|
|
155
|
+
// Key Activities
|
|
156
|
+
// =============================================================================
|
|
157
|
+
|
|
158
|
+
export type ActivityCategory = 'production' | 'problem-solving' | 'platform'
|
|
159
|
+
|
|
160
|
+
export interface KeyActivity {
|
|
161
|
+
name: string
|
|
162
|
+
category: ActivityCategory
|
|
163
|
+
description?: string
|
|
164
|
+
resources?: string[]
|
|
165
|
+
metrics?: string[]
|
|
166
|
+
uptime?: number
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// =============================================================================
|
|
170
|
+
// Key Partnerships
|
|
171
|
+
// =============================================================================
|
|
172
|
+
|
|
173
|
+
export type PartnershipType =
|
|
174
|
+
| 'strategic-alliance'
|
|
175
|
+
| 'coopetition'
|
|
176
|
+
| 'joint-venture'
|
|
177
|
+
| 'buyer-supplier'
|
|
178
|
+
|
|
179
|
+
export interface KeyPartnership {
|
|
180
|
+
name: string
|
|
181
|
+
type: PartnershipType
|
|
182
|
+
purpose?: string
|
|
183
|
+
benefits?: string[]
|
|
184
|
+
contractValue?: number
|
|
185
|
+
contractTerm?: number
|
|
186
|
+
sharedActivities?: string[]
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
// =============================================================================
|
|
190
|
+
// Cost Structure
|
|
191
|
+
// =============================================================================
|
|
192
|
+
|
|
193
|
+
export type CostCategory = 'fixed' | 'variable' | 'semi-variable'
|
|
194
|
+
|
|
195
|
+
export interface CostItem {
|
|
196
|
+
name: string
|
|
197
|
+
category: CostCategory
|
|
198
|
+
amount?: number
|
|
199
|
+
period?: 'monthly' | 'quarterly' | 'annual'
|
|
200
|
+
unitCost?: number
|
|
201
|
+
unitName?: string
|
|
202
|
+
volumeEstimate?: number
|
|
203
|
+
estimatedTotal?: number
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
// =============================================================================
|
|
207
|
+
// Business Model Canvas
|
|
208
|
+
// =============================================================================
|
|
209
|
+
|
|
210
|
+
export interface BusinessModelCanvas {
|
|
211
|
+
name: string
|
|
212
|
+
customerSegments: CustomerSegment[]
|
|
213
|
+
valuePropositions: ValueProposition[]
|
|
214
|
+
channels: Channel[]
|
|
215
|
+
customerRelationships: CustomerRelationship[]
|
|
216
|
+
revenueStreams: RevenueStream[]
|
|
217
|
+
keyResources: KeyResource[]
|
|
218
|
+
keyActivities: KeyActivity[]
|
|
219
|
+
keyPartnerships: KeyPartnership[]
|
|
220
|
+
costStructure: CostItem[]
|
|
221
|
+
metadata?: Record<string, unknown>
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
export interface CanvasValidation {
|
|
225
|
+
isComplete: boolean
|
|
226
|
+
missingBlocks: string[]
|
|
227
|
+
warnings: string[]
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
export interface CanvasSummary {
|
|
231
|
+
totalAddressableMarket: number
|
|
232
|
+
projectedAnnualRevenue: number
|
|
233
|
+
totalAnnualCosts: number
|
|
234
|
+
projectedProfit: number
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
// =============================================================================
|
|
238
|
+
// Unit Economics
|
|
239
|
+
// =============================================================================
|
|
240
|
+
|
|
241
|
+
export interface UnitEconomics {
|
|
242
|
+
ltv: number
|
|
243
|
+
cac: number
|
|
244
|
+
ltvCacRatio: number
|
|
245
|
+
paybackMonths: number
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
export interface LTVInput {
|
|
249
|
+
averageRevenuePerUser: number
|
|
250
|
+
grossMargin: number
|
|
251
|
+
churnRate: number
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
export interface CACInput {
|
|
255
|
+
marketingSpend: number
|
|
256
|
+
salesSpend: number
|
|
257
|
+
newCustomers: number
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
export interface UnitEconomicsInput extends LTVInput, CACInput {}
|
|
261
|
+
|
|
262
|
+
export interface Margins {
|
|
263
|
+
grossMargin: number
|
|
264
|
+
grossProfit: number
|
|
265
|
+
operatingMargin: number
|
|
266
|
+
operatingIncome: number
|
|
267
|
+
netMargin: number
|
|
268
|
+
netIncome: number
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
export interface MarginsInput {
|
|
272
|
+
revenue: number
|
|
273
|
+
cogs: number
|
|
274
|
+
operatingExpenses: number
|
|
275
|
+
taxes?: number
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
// =============================================================================
|
|
279
|
+
// Financial Projections
|
|
280
|
+
// =============================================================================
|
|
281
|
+
|
|
282
|
+
export interface MonthlyRevenue {
|
|
283
|
+
month: number
|
|
284
|
+
mrr: number
|
|
285
|
+
arr: number
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
export interface RevenueProjection {
|
|
289
|
+
months: MonthlyRevenue[]
|
|
290
|
+
endingMRR: number
|
|
291
|
+
endingARR: number
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
export interface MonthlyCost {
|
|
295
|
+
month: number
|
|
296
|
+
fixedCosts: number
|
|
297
|
+
variableCosts: number
|
|
298
|
+
totalCost: number
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
export interface CostProjection {
|
|
302
|
+
months: MonthlyCost[]
|
|
303
|
+
totalCosts: number
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
export interface MonthlyProfitability {
|
|
307
|
+
month: number
|
|
308
|
+
revenue: number
|
|
309
|
+
costs: number
|
|
310
|
+
profit: number
|
|
311
|
+
cumulativeProfit: number
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
export interface ProfitabilityProjection {
|
|
315
|
+
months: MonthlyProfitability[]
|
|
316
|
+
breakEvenMonth: number | undefined
|
|
317
|
+
totalProfit: number
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
export interface RevenueProjectionInput {
|
|
321
|
+
startingMRR: number
|
|
322
|
+
monthlyGrowthRate: number
|
|
323
|
+
months: number
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
export interface CostProjectionInput {
|
|
327
|
+
fixedCosts: number
|
|
328
|
+
variableCostPerUser: number
|
|
329
|
+
startingUsers: number
|
|
330
|
+
monthlyUserGrowth: number
|
|
331
|
+
months: number
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
export interface ProfitabilityProjectionInput {
|
|
335
|
+
startingMRR: number
|
|
336
|
+
monthlyGrowthRate: number
|
|
337
|
+
fixedCosts: number
|
|
338
|
+
grossMargin: number
|
|
339
|
+
months: number
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
// =============================================================================
|
|
343
|
+
// Canvas Analysis
|
|
344
|
+
// =============================================================================
|
|
345
|
+
|
|
346
|
+
export interface CanvasStrengthAnalysis {
|
|
347
|
+
overallScore: number
|
|
348
|
+
strengths: string[]
|
|
349
|
+
weaknesses: string[]
|
|
350
|
+
blockScores: Record<string, number>
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
export interface CanvasGaps {
|
|
354
|
+
criticalGaps: string[]
|
|
355
|
+
warnings: string[]
|
|
356
|
+
recommendations: string[]
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
export interface FinancialProjection {
|
|
360
|
+
revenue: RevenueProjection
|
|
361
|
+
costs: CostProjection
|
|
362
|
+
profitability: ProfitabilityProjection
|
|
363
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Value Propositions
|
|
3
|
+
*
|
|
4
|
+
* Functions for creating and working with value propositions.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type { ValueProposition, ValueType } from './types.js'
|
|
8
|
+
|
|
9
|
+
export interface CreateValuePropositionInput {
|
|
10
|
+
name: string
|
|
11
|
+
description?: string
|
|
12
|
+
valueType?: ValueType
|
|
13
|
+
benefits?: string[]
|
|
14
|
+
targetSegments?: string[]
|
|
15
|
+
quantifiedValue?: string
|
|
16
|
+
segmentFit?: Record<string, number>
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Create a value proposition
|
|
21
|
+
*/
|
|
22
|
+
export function createValueProposition(input: CreateValuePropositionInput): ValueProposition {
|
|
23
|
+
const { name, description, valueType, benefits = [], targetSegments, quantifiedValue, segmentFit } = input
|
|
24
|
+
|
|
25
|
+
return {
|
|
26
|
+
name,
|
|
27
|
+
description,
|
|
28
|
+
valueType,
|
|
29
|
+
benefits,
|
|
30
|
+
targetSegments,
|
|
31
|
+
quantifiedValue,
|
|
32
|
+
segmentFit,
|
|
33
|
+
}
|
|
34
|
+
}
|