@tomako/tools-runtime 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +13 -6
- package/src/components/tomato-logo.tsx +71 -0
- package/src/components/tools/workspace/tool-workspace-layout.tsx +1 -1
- package/src/constants/related-tools.ts +4 -0
- package/src/features/tools/app-icon-resizer/app-icon-resizer.container.tsx +15 -2
- package/src/features/tools/app-icon-resizer/app-icon-resizer.spec.ts +1 -1
- package/src/features/tools/app-icon-resizer/widget/app-icon-resizer.tsx +54 -11
- package/src/features/tools/app-icon-resizer/widget/platform-icons.tsx +2 -5
- package/src/features/tools/mrr-calculator/mrr-calculator.container.tsx +23 -0
- package/src/features/tools/mrr-calculator/mrr-calculator.spec.ts +15 -0
- package/src/features/tools/mrr-calculator/widget/calculations.ts +74 -0
- package/src/features/tools/mrr-calculator/widget/index.ts +1 -0
- package/src/features/tools/mrr-calculator/widget/mrr-calculator.tsx +581 -0
- package/src/features/tools/registry.ts +6 -0
- package/src/features/tools/runtime-registry.ts +4 -0
- package/src/features/tools/shared/create-standard-landing-container.tsx +35 -5
- package/src/features/tools/shared/tool-page-shell.tsx +10 -137
- package/src/features/tools/shared/tool-standard-landing-sections.tsx +262 -52
- package/src/features/tools/spec-registry.ts +2 -0
- package/src/features/tools/tarot-reading/tarot-reading.container.tsx +1 -22
- package/src/features/tools/widget-registry.ts +2 -0
- package/src/i18n/messages/en/tools/app-icon-resizer.ts +90 -62
- package/src/i18n/messages/en/tools/index.ts +2 -0
- package/src/i18n/messages/en/tools/mrr-calculator.ts +202 -0
- package/src/i18n/messages/en/tools-ui.ts +3 -2
- package/src/i18n/messages/zh/page/tools.ts +2 -3
- package/src/i18n/messages/zh/tools/app-icon-resizer.ts +90 -62
- package/src/i18n/messages/zh/tools/index.ts +2 -0
- package/src/i18n/messages/zh/tools/mrr-calculator.ts +112 -0
- package/src/i18n/messages/zh/tools-ui.ts +3 -2
- package/src/i18n/messages/zh-tw/tools/app-icon-resizer.ts +90 -62
- package/src/i18n/messages/zh-tw/tools/index.ts +2 -0
- package/src/i18n/messages/zh-tw/tools/mrr-calculator.ts +52 -0
- package/src/i18n/messages/zh-tw/tools-ui.ts +3 -2
- package/src/lib/tools/resolve-tool-locale-copy.ts +7 -1
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
const appIconResizer = {
|
|
2
2
|
meta: {
|
|
3
|
-
title: "App Icon Resizer for iOS
|
|
3
|
+
title: "App Icon Resizer for iOS and Android",
|
|
4
4
|
description:
|
|
5
|
-
"
|
|
5
|
+
"Upload one square app icon and locally generate an Xcode AppIcon, Google Play 512 icon, and Android legacy launcher package, then review and download one ZIP.",
|
|
6
6
|
intro:
|
|
7
|
-
"
|
|
7
|
+
"Upload one 1024px+ square source and locally generate Xcode, Google Play, and Android legacy launcher files.",
|
|
8
8
|
category: "App submission tools",
|
|
9
9
|
keywords: [
|
|
10
10
|
"app icon resizer",
|
|
@@ -21,48 +21,61 @@ const appIconResizer = {
|
|
|
21
21
|
guide: {
|
|
22
22
|
heroVisualAlt:
|
|
23
23
|
"App icon asset package visual showing one source icon exported into store submission, Xcode, and Android launcher files.",
|
|
24
|
-
workspaceHeading: "App icon
|
|
24
|
+
workspaceHeading: "App icon package generator",
|
|
25
25
|
workspaceHint:
|
|
26
|
-
"
|
|
26
|
+
"One source, one local ZIP for store and engineering handoff.",
|
|
27
27
|
workspaceBadge: "PNG + ZIP",
|
|
28
28
|
standard: {
|
|
29
29
|
benefits: {
|
|
30
|
-
title: "
|
|
30
|
+
title: "Why use this app icon resizer",
|
|
31
31
|
cards: [
|
|
32
32
|
{
|
|
33
|
-
title: "
|
|
34
|
-
body: "Generate Xcode AppIcon,
|
|
33
|
+
title: "Generate the handoff at once",
|
|
34
|
+
body: "Skip individual artboards and exports. Generate Xcode AppIcon, Google Play 512, and Android legacy launcher files together.",
|
|
35
35
|
},
|
|
36
36
|
{
|
|
37
|
-
title: "
|
|
38
|
-
body: "
|
|
37
|
+
title: "Folders and names are ready",
|
|
38
|
+
body: "Store uploads, Xcode assets, and Android project files are grouped by destination, with no manual renaming or folder setup.",
|
|
39
39
|
},
|
|
40
40
|
{
|
|
41
|
-
title: "
|
|
42
|
-
body: "
|
|
41
|
+
title: "Review before download",
|
|
42
|
+
body: "Check transparency, crop mode, and file-size warnings first. Resizing and ZIP packaging stay in the current browser.",
|
|
43
43
|
},
|
|
44
44
|
],
|
|
45
45
|
},
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
46
|
+
outputPreview: {
|
|
47
|
+
eyebrow: "Example output",
|
|
48
|
+
title: "What is inside the download",
|
|
49
|
+
intro: "With both platforms selected, the ZIP groups files by their real handoff destination. These are the files the current tool generates.",
|
|
50
|
+
inputLabel: "Example input",
|
|
51
|
+
input: "One 1024 × 1024 square PNG with Apple + Google Play / Android selected",
|
|
52
|
+
outputLabel: "Main ZIP contents",
|
|
53
|
+
fields: [
|
|
54
|
+
{
|
|
55
|
+
label: "Apple/AppIcon.appiconset",
|
|
56
|
+
body: "Compatible iPhone, iPad, and ios-marketing sizes with Contents.json.",
|
|
57
57
|
},
|
|
58
|
-
|
|
59
|
-
|
|
58
|
+
{
|
|
59
|
+
label: "Apple/AppStoreIcon-1024.png",
|
|
60
|
+
body: "A 1024px review copy for checking composition, padding, and brand consistency.",
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
label: "GooglePlay/app-icon-512.png",
|
|
64
|
+
body: "The 512 × 512 PNG for the Play Console store listing.",
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
label: "Android/res/mipmap-*",
|
|
68
|
+
body: "mdpi through xxxhdpi legacy launcher PNGs; no adaptive icon layers.",
|
|
69
|
+
},
|
|
70
|
+
],
|
|
71
|
+
},
|
|
72
|
+
imageTextSections: [
|
|
60
73
|
{
|
|
61
74
|
id: "platform-scope",
|
|
62
|
-
title: "
|
|
75
|
+
title: "How to use the files",
|
|
63
76
|
body: [
|
|
64
|
-
"Apple
|
|
65
|
-
"
|
|
77
|
+
"Import Apple/AppIcon.appiconset into the Xcode asset catalog and submit it with the build. GooglePlay/app-icon-512.png is for the Play Console store listing.",
|
|
78
|
+
"Android/res/mipmap-* contains legacy launcher resources. If the project uses adaptive icons, configure foreground, background, and optional monochrome layers in Android Studio.",
|
|
66
79
|
],
|
|
67
80
|
image: {
|
|
68
81
|
src: "/tools/app-icon-resizer-section-variation-8bit-v3.webp",
|
|
@@ -71,10 +84,10 @@ const appIconResizer = {
|
|
|
71
84
|
},
|
|
72
85
|
{
|
|
73
86
|
id: "handoff-review",
|
|
74
|
-
title: "
|
|
87
|
+
title: "What to know before use",
|
|
75
88
|
body: [
|
|
76
|
-
"
|
|
77
|
-
"
|
|
89
|
+
"Non-square images are center-cropped without stretching. Use square full-bleed source artwork for final handoff, and do not pre-apply rounded corners or outer shadows.",
|
|
90
|
+
"Image reading, resizing, and ZIP packaging happen locally in your browser. Before release, review current platform rules, brand rights, and legibility on light and dark backgrounds.",
|
|
78
91
|
],
|
|
79
92
|
image: {
|
|
80
93
|
src: "/tools/app-icon-resizer-section-support-8bit-v3.webp",
|
|
@@ -84,21 +97,17 @@ const appIconResizer = {
|
|
|
84
97
|
},
|
|
85
98
|
],
|
|
86
99
|
generation: {
|
|
87
|
-
title: "
|
|
100
|
+
title: "Finish in three steps",
|
|
88
101
|
imageAlt: "8bit workflow scene showing upload, package scope, resize preview, and ZIP export.",
|
|
89
102
|
ctaLabel: "Generate icon package",
|
|
90
103
|
steps: [
|
|
91
104
|
{
|
|
92
|
-
title: "Upload
|
|
93
|
-
body: "
|
|
94
|
-
},
|
|
95
|
-
{
|
|
96
|
-
title: "Choose the platform scope",
|
|
97
|
-
body: "Pick Apple, Google Play, or both. The tool maps that choice to the right size list and folder structure.",
|
|
105
|
+
title: "Upload and choose platforms",
|
|
106
|
+
body: "Upload a PNG, JPG, or WebP, then choose Apple, Google Play / Android, or both. Apple packages need at least 1024px on the shortest side.",
|
|
98
107
|
},
|
|
99
108
|
{
|
|
100
|
-
title: "Generate
|
|
101
|
-
body: "
|
|
109
|
+
title: "Generate the package locally",
|
|
110
|
+
body: "Your browser crops, resizes, names, and organizes the files, then creates PNGs, Contents.json, and README.",
|
|
102
111
|
},
|
|
103
112
|
{
|
|
104
113
|
title: "Review and download the ZIP",
|
|
@@ -106,9 +115,38 @@ const appIconResizer = {
|
|
|
106
115
|
},
|
|
107
116
|
],
|
|
108
117
|
},
|
|
118
|
+
referenceTable: {
|
|
119
|
+
title: "Actual outputs and destinations",
|
|
120
|
+
intro: "Modern Xcode can generate smaller variants from one 1024px icon. Tomako still exports a compatible full AppIcon.appiconset for existing projects and team handoff.",
|
|
121
|
+
mobileHint: "Swipe the table sideways to review every file destination.",
|
|
122
|
+
columns: ["Output group", "Included files", "Current purpose", "Destination"],
|
|
123
|
+
rows: [
|
|
124
|
+
{
|
|
125
|
+
label: "Xcode AppIcon",
|
|
126
|
+
cells: ["Compatible 20–1024px sizes with Contents.json", "iOS / iPadOS project icons", "Xcode asset catalog"],
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
label: "Apple 1024 review copy",
|
|
130
|
+
cells: ["Apple/AppStoreIcon-1024.png", "Team review copy, not a separate fixed upload flow", "Check composition and padding"],
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
label: "Google Play",
|
|
134
|
+
cells: ["GooglePlay/app-icon-512.png", "512 × 512 PNG; warns above 1024KB", "Play Console store listing"],
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
label: "Android legacy launcher",
|
|
138
|
+
cells: ["48 / 72 / 96 / 144 / 192px", "Compatible launcher PNGs", "Android/res/mipmap-*"],
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
label: "Handoff notes",
|
|
142
|
+
cells: ["README.txt", "Folder roles and output boundaries", "Design, engineering, and ASO"],
|
|
143
|
+
},
|
|
144
|
+
],
|
|
145
|
+
note: "Google Play icons must also meet the platform's PNG, file-size, and content rules. This version does not generate Android adaptive foreground, background, or monochrome layers.",
|
|
146
|
+
},
|
|
109
147
|
faqIntro:
|
|
110
|
-
"
|
|
111
|
-
faqCtaLabel: "
|
|
148
|
+
"Confirm source requirements and file destinations before deciding whether this package fits your release workflow.",
|
|
149
|
+
faqCtaLabel: "Back to workspace",
|
|
112
150
|
},
|
|
113
151
|
whatYouGetHeading: "What you get after generation",
|
|
114
152
|
valueVisualAlt: "Organized app icon package with Xcode assets, store upload icons, Android brand folders, and a downloadable zip.",
|
|
@@ -194,44 +232,34 @@ const appIconResizer = {
|
|
|
194
232
|
faqHeading: "FAQ",
|
|
195
233
|
faqItems: [
|
|
196
234
|
{
|
|
197
|
-
question: "
|
|
235
|
+
question: "What size and format should the source icon be?",
|
|
198
236
|
answer:
|
|
199
|
-
"
|
|
237
|
+
"Use a 1024 × 1024 or larger square PNG when possible. JPG and WebP are supported; Google Play / Android-only packages need at least 512px on the shortest side.",
|
|
200
238
|
},
|
|
201
239
|
{
|
|
202
|
-
question: "
|
|
240
|
+
question: "Are uploaded app icons stored on a server?",
|
|
203
241
|
answer:
|
|
204
|
-
"
|
|
242
|
+
"No. Image reading, canvas resizing, and ZIP packaging happen locally in your browser. Refreshing the page clears the file state, and the source icon is not uploaded.",
|
|
205
243
|
},
|
|
206
244
|
{
|
|
207
|
-
question: "
|
|
245
|
+
question: "Can I use the generated files for App Store and Google Play?",
|
|
208
246
|
answer:
|
|
209
|
-
"
|
|
247
|
+
"They are ready as project and store assets, but you should still review them before release. GooglePlay/app-icon-512.png goes to Play Console; Apple/AppIcon.appiconset belongs in Xcode and ships with your build to App Store Connect.",
|
|
210
248
|
},
|
|
211
249
|
{
|
|
212
250
|
question: "Why does the tool not add rounded corners or shadows?",
|
|
213
251
|
answer:
|
|
214
|
-
"Stores and operating systems apply their own masks, corners, or shadows
|
|
215
|
-
},
|
|
216
|
-
{
|
|
217
|
-
question: "What if my source image is not square?",
|
|
218
|
-
answer:
|
|
219
|
-
"The tool center-crops it to a square without stretching. For final delivery, export square full-bleed artwork from the design source to avoid shifted subjects or clipped edges.",
|
|
252
|
+
"Do not add them in advance. Stores and operating systems apply their own masks, corners, or shadows, and pre-processing can cause double clipping or uneven edges.",
|
|
220
253
|
},
|
|
221
254
|
{
|
|
222
|
-
question: "
|
|
255
|
+
question: "What if the source is not square or has transparency?",
|
|
223
256
|
answer:
|
|
224
|
-
"
|
|
257
|
+
"It is center-cropped without stretching. Transparent pixels are preserved, but review alignment, crop edges, and legibility on different backgrounds before release.",
|
|
225
258
|
},
|
|
226
259
|
{
|
|
227
260
|
question: "Does this generate Android adaptive icons?",
|
|
228
261
|
answer:
|
|
229
|
-
"No. It exports Google Play 512 and legacy launcher mipmap PNGs, but it does not generate adaptive icon foreground/background XML
|
|
230
|
-
},
|
|
231
|
-
{
|
|
232
|
-
question: "What happens if the image is too small?",
|
|
233
|
-
answer:
|
|
234
|
-
"Apple or dual-platform packages require 1024px or larger on the shortest side. Google Play / Android packages require at least 512px. The tool also warns when the Google Play 512 PNG exceeds 1024KB.",
|
|
262
|
+
"No. It exports Google Play 512 and legacy launcher mipmap PNGs, but it does not generate adaptive icon foreground/background XML. Configure adaptive icons separately in the Android project.",
|
|
235
263
|
},
|
|
236
264
|
],
|
|
237
265
|
ctaPrimary: "Create store screenshots",
|
|
@@ -14,6 +14,7 @@ import kokoCodexAssistant from "./koko-codex-assistant";
|
|
|
14
14
|
import logoGenerator from "./logo-generator";
|
|
15
15
|
import marketForecastReport from "./market-forecast-report";
|
|
16
16
|
import millionUserGrowthTest from "./million-user-growth-test";
|
|
17
|
+
import mrrCalculator from "./mrr-calculator";
|
|
17
18
|
import ogImageGenerator from "./og-image-generator";
|
|
18
19
|
import productAgreementGenerator from "./product-agreement-generator";
|
|
19
20
|
import pitchDeckGenerator from "./pitch-deck-generator";
|
|
@@ -59,6 +60,7 @@ const toolsPages = {
|
|
|
59
60
|
logoGenerator,
|
|
60
61
|
marketForecastReport,
|
|
61
62
|
millionUserGrowthTest,
|
|
63
|
+
mrrCalculator,
|
|
62
64
|
ogImageGenerator,
|
|
63
65
|
appStoreScreenshotGenerator,
|
|
64
66
|
twitterGifDownloader,
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
const mrrCalculator = {
|
|
2
|
+
meta: {
|
|
3
|
+
title: "MRR Calculator for SaaS Revenue",
|
|
4
|
+
description:
|
|
5
|
+
"Calculate MRR and ARR from customer data, or estimate SaaS MRR from public website traffic, pricing and editable assumptions.",
|
|
6
|
+
intro:
|
|
7
|
+
"Normalize monthly, quarterly or annual subscriptions into monthly recurring revenue, then inspect the formula or switch to a rough public-data estimate.",
|
|
8
|
+
category: "SaaS metrics tools",
|
|
9
|
+
keywords: [
|
|
10
|
+
"mrr calculator",
|
|
11
|
+
"monthly recurring revenue calculator",
|
|
12
|
+
"monthly recurring revenue formula",
|
|
13
|
+
"how to calculate mrr",
|
|
14
|
+
"mrr to arr calculator",
|
|
15
|
+
"saas mrr calculator",
|
|
16
|
+
],
|
|
17
|
+
inputSignal: "Customer and billing data, or public traffic and pricing",
|
|
18
|
+
outputSignal: "MRR, ARR, monthly ARPA, growth or a public-data estimate",
|
|
19
|
+
boundarySignal: "Browser-side calculation; estimates are directional, not reported revenue",
|
|
20
|
+
},
|
|
21
|
+
guide: {
|
|
22
|
+
workspaceHeading: "MRR Calculator for SaaS",
|
|
23
|
+
workspaceHint:
|
|
24
|
+
"Calculate monthly recurring revenue from known customer data, or switch to a rough SaaS MRR estimate using public traffic and pricing.",
|
|
25
|
+
standard: {
|
|
26
|
+
benefits: {
|
|
27
|
+
title: "What you get from this MRR calculator",
|
|
28
|
+
cards: [
|
|
29
|
+
{
|
|
30
|
+
title: "MRR and ARR together",
|
|
31
|
+
body: "See monthly recurring revenue, annual recurring revenue and monthly ARPA without building a spreadsheet.",
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
title: "Billing periods normalized",
|
|
35
|
+
body: "Enter monthly, quarterly or annual subscription prices and let the calculator convert them to one monthly basis.",
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
title: "A second view for competitors",
|
|
39
|
+
body: "When customer counts are unknown, use public traffic and pricing with editable assumptions to get a clearly labeled rough estimate.",
|
|
40
|
+
},
|
|
41
|
+
],
|
|
42
|
+
},
|
|
43
|
+
imageTextSections: [
|
|
44
|
+
{
|
|
45
|
+
id: "choose-the-right-mrr-method",
|
|
46
|
+
title: "Choose the right way\nto calculate MRR",
|
|
47
|
+
body: [
|
|
48
|
+
{ text: "To calculate MRR or ARR for your own product, use the default Calculate MRR mode. Enter active paying customers, recurring amount per customer and billing period for a direct result.", highlights: ["Calculate MRR"] },
|
|
49
|
+
{ text: "To roughly understand a competitor's or another SaaS product's revenue scale, switch to Estimate SaaS MRR. Use public website traffic and plan pricing as inputs; the result is directional, not reported company revenue.", highlights: ["Estimate SaaS MRR"] },
|
|
50
|
+
],
|
|
51
|
+
image: {
|
|
52
|
+
src: "/tools/mrr-calculator-section-steps-8bit.webp",
|
|
53
|
+
alt: "Pixel-art workspace comparing calculated MRR from customer data with estimated SaaS MRR from public traffic and pricing.",
|
|
54
|
+
},
|
|
55
|
+
imageFirst: true,
|
|
56
|
+
hideImageOnMobile: true,
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
id: "monthly-recurring-revenue-formula",
|
|
60
|
+
title: "How to calculate\nmonthly recurring revenue",
|
|
61
|
+
body: [
|
|
62
|
+
{ text: "The monthly recurring revenue formula is MRR = active paying customers × monthly ARPA. Divide a quarterly recurring amount by 3 or an annual amount by 12 before multiplying by the customer count.", highlights: ["MRR = active paying customers × monthly ARPA"] },
|
|
63
|
+
"Example: 12 customers paying $1,200 per year have monthly ARPA of $100, MRR of $1,200 and ARR of $14,400. If previous MRR was $1,000, MoM growth is ($1,200 − $1,000) ÷ $1,000 = 20%.",
|
|
64
|
+
],
|
|
65
|
+
image: {
|
|
66
|
+
src: "/tools/mrr-calculator-section-primary-8bit.webp",
|
|
67
|
+
alt: "Pixel-art SaaS ledger normalizing monthly, quarterly and annual subscriptions into one calculated MRR result.",
|
|
68
|
+
},
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
id: "estimate-saas-mrr",
|
|
72
|
+
title: "Estimate SaaS MRR\nfrom public data",
|
|
73
|
+
body: [
|
|
74
|
+
"Estimate mode calculates new paid customers as visits × acquisition-eligible share × visitor-to-paid rate. It then uses average paid lifetime to approximate active customers and multiplies them by the normalized monthly plan price.",
|
|
75
|
+
"Repeat visits, existing customers, channel mix, conversion, plan mix and churn remain unknown. Use the same assumptions when comparing products, and change them when the business model differs; the result is directional, not factual revenue.",
|
|
76
|
+
],
|
|
77
|
+
image: {
|
|
78
|
+
src: "/tools/mrr-calculator-section-variation-8bit.webp",
|
|
79
|
+
alt: "Pixel-art public traffic chart and pricing card feeding a clearly labeled estimated SaaS MRR result.",
|
|
80
|
+
},
|
|
81
|
+
imageFirst: true,
|
|
82
|
+
},
|
|
83
|
+
],
|
|
84
|
+
editorialSections: [
|
|
85
|
+
{
|
|
86
|
+
id: "what-counts-as-mrr",
|
|
87
|
+
title: "What counts as monthly recurring revenue",
|
|
88
|
+
body: [
|
|
89
|
+
"MRR means recurring subscription revenue normalized to one month. Include active plan revenue that continues under the current contract, and convert quarterly or annual recurring amounts to a monthly basis.",
|
|
90
|
+
"Exclude one-time setup and implementation fees, professional services, hardware, tax and other non-recurring payments. For discounts, refunds, usage billing, expansion, contraction or churn movements, use billing-system data and a fuller revenue model.",
|
|
91
|
+
],
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
id: "common-mrr-calculation-mistakes",
|
|
95
|
+
title: "Common MRR calculation mistakes",
|
|
96
|
+
body: [
|
|
97
|
+
"Do not put a full annual payment into one month's MRR, count one-time revenue, or confuse new MRR with the company's total MRR. If several plans are involved, calculate each plan separately or use a weighted monthly average instead of assuming customers are evenly distributed.",
|
|
98
|
+
"In estimate mode, do not treat all website visits or direct traffic as new prospects. Visits can include returning users, current customers, employees and repeated sessions, so the acquisition-eligible share must remain an explicit assumption.",
|
|
99
|
+
"Most importantly, do not present an Estimated MRR scenario as a competitor's actual revenue. Public traffic and pricing do not reveal its real customers, discounts, retention or channel mix.",
|
|
100
|
+
],
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
id: "use-mrr-and-arr-results",
|
|
104
|
+
title: "How to use your MRR and ARR results",
|
|
105
|
+
body: [
|
|
106
|
+
"Use calculated MRR for a quick operating check, monthly reporting or pricing scenarios after verifying the customer count, recurring amount and billing period. Use the optional previous MRR to inspect month-over-month growth, and convert MRR to ARR for an annualized run-rate view.",
|
|
107
|
+
"Use estimated MRR only for directional competitor comparisons. Keep the assumptions consistent across products, save the basis with the number and rerun the scenario when traffic or pricing changes.",
|
|
108
|
+
"These results can lead into churn, retention and LTV:CAC analysis, but they are not accounting statements, financial advice or a valuation opinion.",
|
|
109
|
+
],
|
|
110
|
+
},
|
|
111
|
+
],
|
|
112
|
+
faqIntro:
|
|
113
|
+
"Short answers about mixed plans, zero growth denominators, direct traffic, estimate limits and browser-local data.",
|
|
114
|
+
faqCtaLabel: "Use the calculator",
|
|
115
|
+
},
|
|
116
|
+
faqHeading: "MRR calculator FAQ",
|
|
117
|
+
faqItems: [
|
|
118
|
+
{
|
|
119
|
+
question: "How do I use this MRR calculator?",
|
|
120
|
+
answer: "To calculate MRR or ARR for your own product, stay in the default Calculate MRR mode and enter active paying customers, recurring amount per customer and billing period. To roughly understand a competitor or another SaaS product, switch to Estimate SaaS MRR and use public website traffic and plan pricing as inputs. The first is a direct calculation from your inputs; the second is directional only.",
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
question: "Can I calculate several pricing plans together?",
|
|
124
|
+
answer: "V1 accepts one blended average recurring amount. Calculate each plan separately and add the MRR values, or first compute a weighted average monthly price if your plan mix is known.",
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
question: "What happens when previous MRR is zero?",
|
|
128
|
+
answer: "The calculator still returns current MRR and ARR but hides month-over-month growth, because percentage growth from a zero denominator is not meaningful.",
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
question: "Should direct traffic be treated as new customers?",
|
|
132
|
+
answer: "No. Direct traffic can include returning visitors, current customers, employees, bookmarked visits and unattributed sessions. Count only an editable acquisition-eligible share when building an estimate.",
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
question: "How accurate is the SaaS MRR estimate?",
|
|
136
|
+
answer: "Treat it as directional, not precise. Its usefulness depends on whether the traffic, price, conversion and paid-lifetime assumptions are reasonable for the product being compared.",
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
question: "Is the estimate financial advice or a valuation opinion?",
|
|
140
|
+
answer: "No. It is a scenario based on public inputs and your assumptions. Do not use it as accounting evidence, a factual claim about a company, financial advice or a valuation conclusion.",
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
question: "Does my calculator data leave the browser?",
|
|
144
|
+
answer: "No. This version calculates in the browser and does not upload the values or require an account.",
|
|
145
|
+
},
|
|
146
|
+
],
|
|
147
|
+
},
|
|
148
|
+
widget: {
|
|
149
|
+
calculateMode: "Calculate MRR",
|
|
150
|
+
estimateMode: "Estimate SaaS MRR",
|
|
151
|
+
modeSwitchLabel: "Switch between calculated and estimated MRR",
|
|
152
|
+
calculateHint: "Use known paying-customer and subscription data for a calculated result.",
|
|
153
|
+
estimateHint: "Use public traffic and pricing for a rough estimate—not reported company revenue.",
|
|
154
|
+
activeCustomers: "Active paying customers",
|
|
155
|
+
recurringAmount: "Recurring amount per customer",
|
|
156
|
+
billingPeriod: "Billing period",
|
|
157
|
+
previousMrr: "Previous month MRR",
|
|
158
|
+
optional: "Optional",
|
|
159
|
+
addPreviousMrr: "Add previous month MRR (optional)",
|
|
160
|
+
currency: "Currency",
|
|
161
|
+
monthlyVisits: "Estimated monthly website visits",
|
|
162
|
+
planPrice: "Representative public plan price",
|
|
163
|
+
showAssumptions: "Adjust estimate assumptions",
|
|
164
|
+
hideAssumptions: "Hide estimate assumptions",
|
|
165
|
+
assumptionNote: "Starter assumptions, not industry benchmarks. Change them to match the product you are evaluating.",
|
|
166
|
+
eligibleVisitShare: "Acquisition-eligible visit share (%)",
|
|
167
|
+
visitorToPaidRate: "Visitor-to-paid rate (%)",
|
|
168
|
+
averagePaidLifetime: "Average paid lifetime (months)",
|
|
169
|
+
periods: { month: "Monthly", quarter: "Quarterly", year: "Annual" },
|
|
170
|
+
calculatedLabel: "Calculated",
|
|
171
|
+
estimatedLabel: "Estimated",
|
|
172
|
+
calculatedResultTitle: "Monthly recurring revenue",
|
|
173
|
+
estimatedResultTitle: "Directional SaaS revenue estimate",
|
|
174
|
+
calculatedMrr: "Calculated MRR",
|
|
175
|
+
estimatedMrr: "Estimated MRR",
|
|
176
|
+
arr: "ARR",
|
|
177
|
+
estimatedArr: "Estimated ARR",
|
|
178
|
+
monthlyArpa: "Monthly ARPA",
|
|
179
|
+
monthlyPlanPrice: "Monthly plan price",
|
|
180
|
+
momGrowth: "MoM growth",
|
|
181
|
+
newPaidCustomers: "New paid customers / month",
|
|
182
|
+
activePaidCustomers: "Estimated active paid customers",
|
|
183
|
+
formula: "Formula check",
|
|
184
|
+
perMonth: "per month",
|
|
185
|
+
assumptionsUsed: "Assumptions used",
|
|
186
|
+
notAvailable: "Not available",
|
|
187
|
+
calculatedGuidance: "Include recurring subscription revenue. Exclude one-time fees, tax and non-recurring services.",
|
|
188
|
+
estimateDisclaimer: "Public-data estimate only. Actual traffic quality, conversion, plan mix, churn and revenue may differ.",
|
|
189
|
+
copyResult: "Copy result",
|
|
190
|
+
copied: "Copied",
|
|
191
|
+
reset: "Reset",
|
|
192
|
+
fixInputsTitle: "Check the highlighted inputs",
|
|
193
|
+
fixInputsBody: "Enter valid values to update the result.",
|
|
194
|
+
errors: {
|
|
195
|
+
nonNegative: "Enter zero or a positive number.",
|
|
196
|
+
positive: "Enter a number greater than zero.",
|
|
197
|
+
percent: "Enter a percentage from 0 to 100.",
|
|
198
|
+
},
|
|
199
|
+
},
|
|
200
|
+
} as const;
|
|
201
|
+
|
|
202
|
+
export default mrrCalculator;
|
|
@@ -648,9 +648,10 @@ const toolsUi = {
|
|
|
648
648
|
downloadZip: "Download ZIP",
|
|
649
649
|
selectedTitle: "Selected icon",
|
|
650
650
|
downloadPng: "Download PNG",
|
|
651
|
-
outputEmptyTitle: "
|
|
651
|
+
outputEmptyTitle: "Review the package here after upload",
|
|
652
652
|
outputEmptyHint:
|
|
653
|
-
"
|
|
653
|
+
"Your current platform choice will create these main folders. After generation, this area switches to real PNG previews and the ZIP download.",
|
|
654
|
+
outputExampleLabel: "Example app-icon-assets.zip structure",
|
|
654
655
|
platforms: {
|
|
655
656
|
all: "App Store + Google Play",
|
|
656
657
|
apple: "Apple App Store / iOS",
|
|
@@ -5,10 +5,9 @@ const tools = {
|
|
|
5
5
|
"免费使用产品起名、市场调研、App 上架图和社媒内容等在线工具。",
|
|
6
6
|
},
|
|
7
7
|
eyebrow: "全部工具",
|
|
8
|
-
title: "
|
|
8
|
+
title: "Tomako 工具",
|
|
9
9
|
heroTitle: "用可执行工具,把上线前的 GTM 工作跑清楚",
|
|
10
|
-
description:
|
|
11
|
-
"产品起名、市场调研、App 上架图和社媒内容等工具都在这里,选择一个即可开始。",
|
|
10
|
+
description: "免费工具,帮你完成产品、营销与内容任务,任选一个即可开始",
|
|
12
11
|
toolsCount: "{count} 个工具可免费使用",
|
|
13
12
|
filters: {
|
|
14
13
|
all: "全部工具",
|