●TOOLING — Rork's developer repos keep moving: rork-xcode was updated on July 16, rork-device on July 15, and rork-plist on July 13●OPUS46 — Claude Opus 4.6 is live in Rork, and Rork Max is built to assemble apps on top of Claude Code●SIM — A cloud iOS simulator runs in the browser, with one click to install on a device and two clicks to publish to the App Store●MAX — Rork Max emits pure Swift rather than React Native, reaching iPhone, iPad, Apple Watch, Apple TV, Vision Pro, and even iMessage●NATIVE — That opens up HealthKit, ARKit and LiDAR, NFC, Dynamic Island, Live Activities, 3D through Metal, and on-device inference with Core ML●SEED — Rork raised a $15M seed led by Left Lane Capital, with Peak XV and a16z Speedrun joining the round●TOOLING — Rork's developer repos keep moving: rork-xcode was updated on July 16, rork-device on July 15, and rork-plist on July 13●OPUS46 — Claude Opus 4.6 is live in Rork, and Rork Max is built to assemble apps on top of Claude Code●SIM — A cloud iOS simulator runs in the browser, with one click to install on a device and two clicks to publish to the App Store●MAX — Rork Max emits pure Swift rather than React Native, reaching iPhone, iPad, Apple Watch, Apple TV, Vision Pro, and even iMessage●NATIVE — That opens up HealthKit, ARKit and LiDAR, NFC, Dynamic Island, Live Activities, 3D through Metal, and on-device inference with Core ML●SEED — Rork raised a $15M seed led by Left Lane Capital, with Peak XV and a16z Speedrun joining the round
Acquiring Enterprise Contracts with Rork: B2B Strategy for Indie Developers 2026
A practical guide for indie developers to win business clients with their Rork apps. Covers multi-tenant architecture, pricing models, sales strategy, contracts, and solo support operations.
The biggest barrier for indie developers trying B2B isn't the technology. It's the belief that "selling to companies is something I could never do."
Here's the reality: the average B2B contract is worth 20–100x more than a consumer subscription. Getting one ¥100,000/month business contract is far less stressful than managing 100 individual subscribers at ¥1,000 each. The business problems your Rork app can solve are closer than you think.
Why Indie Developers Are Actually Well-Suited for B2B
Understanding the Fundamental Difference Between B2C and B2B
In the B2C world, you compete against apps backed by hundreds of engineers and billion-yen marketing budgets. That's a brutal place for a solo developer. B2B is different. Large enterprise software companies ignore niche industries because the total addressable market seems too small. Those niches are exactly where you can win.
Take a site inspection app for small construction contractors. There are around 48,000 general contractors in Japan alone. They struggle with photo documentation daily, but enterprise software like Salesforce or kintone is overkill for their needs. That "just right" problem space is where indie developers thrive.
Referrals: B2C occasional / B2B industry word-of-mouth is highly predictable
Pressure: B2C constant feature demand / B2B stability and support matter most
Where Indie Developer Strengths Shine in B2B
Speed of response: When a business customer asks for a feature, a large vendor schedules it for next quarter's sprint. You can deploy it next week. That responsiveness builds trust that no enterprise vendor can match.
Pricing flexibility: You can offer custom pricing that doesn't fit any standard tier. "¥80,000/month for 50 users" or "10% discount for annual prepayment" — you can agree to these on the spot.
Direct relationship: The CEO and the developer are the same person. Business clients find this reassuring. When something breaks, the person who built it is the one fixing it.
What Types of Rork Apps Work for B2B
The most B2B-ready categories:
Field operations: Site checklists, photo documentation, quality inspection for construction, manufacturing, and agriculture
Service businesses: Appointment management, client records, report generation for salons, clinics, consulting firms
Professional services support: Document sharing and approval workflows for accounting firms, legal offices
Retail and F&B: Inventory management, ordering automation, staff scheduling
Education and coaching: Attendance tracking, progress reporting for tutoring centers and sports academies
If your existing app falls into any of these categories, you likely already have a B2B opportunity waiting to be unlocked.
Designing Your Rork App for Business Clients
Multi-Tenant Architecture: Managing Many Clients with One Backend
The foundation of any B2B app is multi-tenant architecture. Each "tenant" is one business client. You need their data to be completely isolated from each other while running on a shared backend infrastructure.
Supabase's Row Level Security (RLS) makes this safe and straightforward in Rork Max.
-- Supabase: Multi-tenant table design-- Tenants (business clients) tableCREATE TABLE tenants ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), name TEXT NOT NULL, plan TEXT NOT NULL DEFAULT 'starter', -- starter, professional, enterprise created_at TIMESTAMPTZ DEFAULT now());-- User-to-tenant mappingCREATE TABLE tenant_users ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), tenant_id UUID REFERENCES tenants(id) ON DELETE CASCADE, user_id UUID REFERENCES auth.users(id) ON DELETE CASCADE, role TEXT NOT NULL DEFAULT 'member', -- owner, admin, member created_at TIMESTAMPTZ DEFAULT now(), UNIQUE(tenant_id, user_id));-- RLS: Users can only see their own tenant membershipsALTER TABLE tenant_users ENABLE ROW LEVEL SECURITY;CREATE POLICY "Users can see their own tenant memberships" ON tenant_users FOR SELECT USING (user_id = auth.uid());-- Business data table (example: site inspection records)CREATE TABLE site_checks ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), tenant_id UUID REFERENCES tenants(id) ON DELETE CASCADE, title TEXT NOT NULL, status TEXT DEFAULT 'pending', created_by UUID REFERENCES auth.users(id), created_at TIMESTAMPTZ DEFAULT now());ALTER TABLE site_checks ENABLE ROW LEVEL SECURITY;-- RLS: Only tenant members can access their dataCREATE POLICY "Tenant members can access site checks" ON site_checks FOR ALL USING ( tenant_id IN ( SELECT tenant_id FROM tenant_users WHERE user_id = auth.uid() ) );
Once this SQL is configured in Supabase, your Rork app automatically enforces data isolation between tenants without any conditional logic in your app code.
Building the Admin Dashboard Business Clients Always Want
The first feature every business client asks for is an admin console. "I want to see who's using this," "I need to add or remove users" — these requests are universal.
// Rork Max: Tenant management API client// src/lib/tenant-admin.tsimport { createClient } from '@supabase/supabase-js';const supabase = createClient( process.env.EXPO_PUBLIC_SUPABASE_URL\!, process.env.EXPO_PUBLIC_SUPABASE_ANON_KEY\!);// Fetch all members of a tenantexport async function getTenantMembers(tenantId: string) { const { data, error } = await supabase .from('tenant_users') .select(` id, role, created_at, users:user_id ( id, email, raw_user_meta_data->>full_name as name, last_sign_in_at ) `) .eq('tenant_id', tenantId) .order('created_at', { ascending: true }); if (error) { throw new Error(`Failed to fetch members: ${error.message}`); } return data ?? [];}// Invite a new member via emailexport async function inviteMember( tenantId: string, email: string, role: 'admin' | 'member' = 'member') { // Step 1: Send invitation email via Supabase Auth const { data: inviteData, error: inviteError } = await supabase.auth.admin.inviteUserByEmail(email, { data: { tenant_id: tenantId, role }, redirectTo: `${process.env.EXPO_PUBLIC_APP_URL}/auth/callback` }); if (inviteError) { throw new Error(`Failed to send invitation: ${inviteError.message}`); } // Step 2: Pre-create tenant_users record for "pending" display const { error: insertError } = await supabase .from('tenant_users') .insert({ tenant_id: tenantId, user_id: inviteData.user.id, role }); if (insertError) { throw new Error(`Failed to register tenant membership: ${insertError.message}`); } return { success: true, email };}// Change a member's roleexport async function updateMemberRole( tenantId: string, userId: string, newRole: 'admin' | 'member') { const { error } = await supabase .from('tenant_users') .update({ role: newRole }) .eq('tenant_id', tenantId) .eq('user_id', userId); if (error) { throw new Error(`Failed to update role: ${error.message}`); }}
Implementing Audit Logs — The Feature That Closes Enterprise Deals
Business clients in legal, medical, or financial sectors will often ask: "Can I see who accessed what data and when?" This is an audit log, and implementing it is often the difference between winning or losing a regulated-industry client.
The key design principle: audit log writes should never block your business logic. Use async fire-and-forget so that even if the log fails, the user's core action succeeds.
✦
Thank you for reading this far.
Continue Reading
What follows includes implementation code, benchmarks, and practical content we hope you'll find useful. This site runs without ads — server and development costs are supported entirely by members like you. If it's been helpful, we'd be truly grateful for your support.
WHAT YOU'LL LEARN
✦Implement per-seat billing with Stripe invoice payments that let you earn ¥50K–500K per business client using copy-paste code
✦Master three proven sales channels—user upselling, community outreach, and cold outreach—to land your first contract within 90 days
✦Build a solo support system with automated monthly reports, audit logs, and NDA/DPA templates that satisfy enterprise-grade requirements
Secure payment via Stripe · Cancel anytime
✦
Unlock This Article
Get full access to the rest of this article. Buy once, read anytime. This site is ad-free — your support goes directly toward keeping it running.
Pricing Strategy: Setting Rates That Business Clients Respect
Three Pricing Models and When to Use Each
Per-Seat (User Count)
The simplest model: monthly fee × number of users. Easy for clients to budget, easy for you to predict revenue.
Best for: Tools every team member uses equally (checklists, attendance, expenses)
Example: ¥5,000/user/month, minimum 5 users (starts at ¥25,000/month)
Tiered Features
Starter / Professional / Enterprise tiers differentiated by feature access. Good for upselling as clients grow.
Best for: Apps where feature depth is the key differentiator
Example: Starter ¥30,000/month (10 users) / Pro ¥80,000/month (50 users + API access)
Usage-Based
Charge based on actual consumption (API calls, records processed, storage). Low entry barrier, revenue grows naturally with client usage.
Best for: AI-powered apps where compute costs scale with usage
Example: Base ¥10,000/month + ¥10 per processed item
Implementing B2B Invoice Payments with Stripe
Most business clients expect invoice payment (net-30 terms) rather than card-on-file. Stripe supports this, and you can automate the entire process from your Rork backend.
With this in place, you can issue invoices from your admin panel with a single click. Stripe sends a PDF invoice by email, and payment confirmation is handled automatically via webhook.
Annual Contracts: The Key to Predictable Revenue
Offering an annual prepayment option typically moves 30–40% of business clients onto it, in our experience. Structure it as follows:
Communicate it as: "Save 17% with annual billing vs. monthly"
From your side, you get 10–12 months of cash upfront. From the client's side, they simplify their accounting. It's a genuine win-win.
Landing Your First B2B Contract: Three Proven Channels
Channel 1: Upsell Your Existing Individual Users
Your highest-probability lead is someone who's already paying for your app individually. Look for reviews or support messages that say "I wish I could share this with my team" — that's a B2B signal hiding in plain sight.
Sample outreach message:
Subject: [App Name] is now available for your entire team
Hi [Name],
Thank you for using [App Name]. We've heard from several users who
want to use it with their teams, so we've created a business plan.
With the business plan, you can:
- Manage all team accounts from one admin console
- Track usage with reporting dashboards
- Pay via invoice (net-30)
- Access a dedicated support channel
We'd love to offer you a free 2-week trial for your team.
If you're interested, just reply to this email.
[Your name]
Response rates from existing users typically run 10–20% — far higher than cold outreach.
Channel 2: Industry Community Participation
Join communities where your target industry gathers — Facebook groups, trade association events, Slack workspaces. The goal isn't to pitch immediately. It's to be present when someone mentions the problem your app solves.
The most effective framing: "I've actually been building something for exactly that problem. Would you be willing to try it and give me feedback?" This is genuine, non-pushy, and positions you as someone solving real problems rather than selling a product.
Channel 3: Cold Outreach at Small Scale
Build a target list of 10–20 companies. Reach out via LinkedIn or their contact form. Expect 1–5% response rates, but even one response per 20 contacts can lead to your first contract.
Three rules for effective cold outreach:
Lead with their problem, not your product features
Keep the email under 6 lines — long emails don't get read
Propose exactly one next step ("Would you have 30 minutes for a call?")
Contracts, NDAs, and Privacy Policy: The Practical Reality
What You Actually Need
When a business client asks to see your terms or wants to sign an NDA, here's how to handle it without a full legal team.
The minimum set of documents:
Terms of Service: What users can and can't do, liability limits, cancellation terms
Privacy Policy: What data you collect, how it's used, how to request deletion
DPA (Data Processing Agreement): Required by many regulated industries for GDPR or Japan's Act on Personal Information Protection
NDAs are usually simpler than they sound. Most of the time, the client will send you their own NDA to sign. Review it for: definition of confidential information, term length (typically 2–3 years), and standard exceptions (publicly known info, independently developed). If it looks reasonable, sign it.
Template resources:
Japan's Ministry of Economy publishes NDA templates in Japanese
CloudSign and DocuSign both offer template libraries for e-signature workflows
For a B2B-serious setup, electronic signature capability (via CloudSign or DocuSign) is worth the investment
One Negotiation Principle That Saves Time
Business clients in regulated industries may request changes to your standard terms. Most commonly: explicit SLA language, data residency requirements (Japan-only storage), and data return policies on cancellation.
Handle these proactively. Decide your positions in advance ("We use Supabase Japan region, so data is stored in Tokyo"), write them into your standard enterprise addendum, and offer it preemptively to regulated-industry prospects. It signals professionalism and speeds up the deal.
Running B2B Support Solo: Building Systems That Scale
The Support Stack for One-Person B2B Operations
Business clients expect responsiveness that individual users don't. The key is building self-service infrastructure so clients can solve most problems before reaching you.
Recommended solo support stack:
Help documentation: Notion published publicly — comprehensive, searchable, always up to date
Chat support: Intercom (from ~$100/month) or a shared Slack channel (free to create)
Email support: support@yourdomain.com forwarded to your inbox with auto-responder acknowledging receipt
Status page: Statuspage.io (free tier available) — shows real-time uptime status, reducing "is your service down?" questions
Automating Monthly Reports
Business clients need to justify software spending to their managers. If you send them a monthly usage report automatically, you remove that friction and dramatically reduce the likelihood of them questioning the value of their subscription.
// Automated monthly report generator and sender// src/lib/monthly-report.tsimport { Resend } from 'resend';const resend = new Resend(process.env.RESEND_API_KEY\!);export async function sendMonthlyReport(tenantId: string) { const tenant = await getTenantById(tenantId); const now = new Date(); const lastMonth = new Date(now.getFullYear(), now.getMonth() - 1, 1); const lastMonthEnd = new Date(now.getFullYear(), now.getMonth(), 0); // Aggregate usage statistics const { data: logs } = await supabase .from('audit_logs') .select('user_id, action') .eq('tenant_id', tenantId) .gte('created_at', lastMonth.toISOString()) .lte('created_at', lastMonthEnd.toISOString()); const totalActions = logs?.length ?? 0; const activeUsers = new Set(logs?.map(l => l.user_id)).size; const reportHtml = ` <h2>Monthly Usage Report — ${tenant.company_name}</h2> <p>Period: ${lastMonth.toLocaleDateString('en-US', { month: 'long', year: 'numeric' })}</p> <table cellpadding="8" style="border-collapse: collapse; width: 100%;"> <tr style="background: #f5f5f5;"> <td><strong>Active Users</strong></td> <td>${activeUsers}</td> </tr> <tr> <td><strong>Total Actions</strong></td> <td>${totalActions.toLocaleString()}</td> </tr> <tr style="background: #f5f5f5;"> <td><strong>Current Plan</strong></td> <td>${tenant.plan}</td> </tr> </table> <p style="margin-top: 16px;">Thank you for another month with us. Please reply to this email with any questions.</p> `; const { error } = await resend.emails.send({ from: 'reports@yourdomain.com', to: tenant.billing_email, subject: `[Monthly Report] ${tenant.company_name} — ${lastMonth.toLocaleDateString('en-US', { month: 'long' })} Usage`, html: reportHtml }); if (error) { throw new Error(`Failed to send report: ${error.message}`); } console.log(`✅ Monthly report sent: ${tenant.company_name}`);}// Schedule with Cloudflare Cron Trigger// In wrangler.toml:// [[triggers.crons]]// cron = "0 9 1 * *" # First day of every month at 9:00 UTC
Seven B2B Pitfalls That Sink Indie Developers
1. Pricing Too Low
"Let me start cheap to build a track record" seems logical but backfires in B2B. Prices that seem too low raise questions about your reliability and financial sustainability. Business buyers associate price with quality in a way individual consumers don't.
Start at a price you can defend: "Here's the value this creates, here's why it's priced this way." Then hold that price.
2. Accepting Unlimited Customization Requests
"Can you change this one thing to match our workflow?" will come from every client. If you say yes to everything for free, your codebase becomes a spaghetti of client-specific branches that make it impossible to serve new clients efficiently.
The solution: have a transparent customization policy. General features go on the roadmap. Client-specific work is scoped and priced separately (¥50,000–100,000 per day). Clients who need extreme customization may not be the right fit.
3. Offering Trials That Are Too Long
A 30-day free trial makes sense for individuals but often fails for businesses. Corporate procurement takes 2–3 months on average. A 30-day trial expires before anyone with budget authority has even heard about the tool.
Better options: a 2-week intensive trial with a structured onboarding call, or skip the trial entirely and offer a 60-day money-back guarantee instead.
4. Over-promising on SLA
"We respond within 24 hours" sounds professional until you're dealing with a weekend outage from a client in a different time zone. Start with a realistic SLA: "We respond to all inquiries within one business day during business hours (9 AM–6 PM JST)." Under-promise and over-deliver.
5. Over-Dependence on a Single Client
If one client represents 80% or more of your B2B revenue, their cancellation becomes an existential event for your business. Actively diversify. The goal is 10 clients at ¥100,000/month rather than one client at ¥1,000,000/month.
6. Verbal Commitments Without Written Record
"I'll have that feature done by end of next month" said on a call can become a contractual obligation in the client's mind. Always follow up verbal commitments with an email: "As discussed, I'll evaluate adding [feature] to the roadmap and will update you by [date]. This is subject to technical feasibility review." Manage expectations in writing.
7. Ignoring Competitors
Business buyers comparison-shop. Know your top three competitors — both enterprise SaaS (that's too expensive for your targets) and other indie tools. Be ready to answer "Why should we choose you over X?" with three concrete, specific points.
Revenue Growth Roadmap: ¥100K to ¥1M/Month
Phase 1: Zero to One (3–6 months)
Email your existing personal-plan users about business plan availability
Update App Store screenshots to include "for teams" messaging
Join two or three industry-specific communities in your target vertical
Target: 1–2 business clients at ¥50,000–100,000/month each
Phase 2: One to Ten (6–12 months)
Publish case studies (with client permission) on your website
Ask your first clients to refer you to peers in their industry — most are happy to when asked directly
Set up automatic upsell triggers when teams exceed their user-count tier
Target: ¥500,000–1,000,000/month across 10+ clients
Phase 3: Ten to One Hundred (1–2 years)
Partner with consultants, accountants, or industry associations to become their recommended tool
Offer resellers 20–30% margin for referrals
Consider white-label licensing to other indie developers or small vendors
Target: ¥2,000,000–5,000,000/month — the practical ceiling for a solo-operated business
Measuring Success: The KPIs That Matter for a Solo B2B App Business
Once you have business clients signed up, you need metrics to tell you whether your B2B operation is truly healthy — not just whether revenue went up.
Monthly Recurring Revenue and Net Revenue Retention
MRR is straightforward: total monthly contract value from all active business clients. The more revealing metric is Net Revenue Retention (NRR) — what percentage of last month's MRR do you still have this month, including upsells but accounting for downgrades and cancellations.
NRR above 100% means you grow even without adding new clients. For a solo B2B developer, NRR above 90% (minimal churn) is a strong foundation. When you consistently see 95%+, your business is compounding.
Health Score Monitoring to Prevent Silent Churn
Business clients don't cancel loudly. They quietly stop using the app, then let the contract expire. Proactive health scoring catches this before it's too late.
Run this weekly for each tenant. When a score drops below 50 out of 100, send a proactive message: "We noticed usage slowed down this month — is there anything we can improve for your team?" This single habit, done consistently, can cut churn by 30–40% compared to reactive support alone.
The Renewal Conversation
Set a calendar reminder 60 days before each client's contract renewal date. That's your window to proactively discuss renewal, introduce any price adjustments, and upsell if their usage has grown.
The best renewal conversation isn't "are you renewing?" but "here's what you've accomplished with the tool this year" followed by a concrete proposal for next year. Monthly reports make this conversation easy — you have the data already.
Building Your B2B Sales Infrastructure (Without Hiring)
A Lightweight CRM That Actually Works
For 1–15 active business clients, a structured Notion database beats most paid CRM tools. Create a single database with these pipeline stages:
Prospect: Identified but not contacted
Outreach: Contacted, awaiting response
Trial: Running a pilot
Proposal: Contract under review
Active: Current paying client
At Risk: Health score below 50
For each entry track: company name, industry, primary contact, contract value, renewal date, last touch date. Update it every Friday. This 15-minute habit prevents leads from going cold and renewal conversations from being missed.
Systematizing Onboarding
The first 30 days after signing determine whether a client stays for 3 months or 3 years. A defined onboarding sequence reduces early churn dramatically.
Day 1: Welcome email with login, quick-start guide, and your direct contact
Day 3: Short check-in confirming the team is set up and no blockers exist
Day 14: 30-minute usage review call — hear what's working, what isn't
Day 30: First health score check and usage report highlighting early wins
You can automate Day 1 and Day 3 emails with Resend. The Day 14 call is the one you should never skip — it surfaces friction that written feedback rarely captures, and it's the moment clients decide whether they're truly committed.
Recommended Reading for Serious B2B Growth
The Only Thing Left to Do
B2B success doesn't happen overnight, but the path is more straightforward than most indie developers assume. The technology is already handled by Rork. The architecture patterns are documented above. The pricing models are proven.
What remains is a single action: look at your existing user base, find the person who said they wanted to use your app "with their team," and send them a message today.
That's the first step toward a business where one email can be worth ¥100,000 a month.
Share
Thank You for Reading
Rork Lab is ad-free, supported entirely by members like you. We publish practical guides daily with implementation code, benchmarks, and production-ready patterns. If you've found it useful, we'd love to have you on board.