

Notes from the studio — case studies, design process, engineering retrospectives, and the occasional cosmic detour.

Short answer: The best tech stack for a SaaS startup in 2026, for most teams, is TypeScript end to end : Next.js 16 and React 19 on the front, PostgreSQL (through Supabase or Neon) with Drizzle ORM for data, managed auth, Stripe or a Merchant of Record for billing, Vercel for hosting, and pgvector plus a model API for AI features. Boring on purpose. Boring ships. That's the answer we give founders on discovery calls, and it rarely changes. At Craxinno we've shipped 200+ web apps since 2017, and the stack conversation almost never decides whether a SaaS product succeeds. What it does decide is how fast you can ship the next feature, how easily you can hire, and whether you'll be stuck rewriting your billing code in month 14 instead of selling. So this guide to the best tech stack for a SaaS startup skips the "top 25 frameworks" roundup. You'll get one opinionated default stack, the reasoning behind each layer, what it costs per month, and the specific situations where you should throw our advice out. The 2026 SaaS Tech Stack at a Glance Layer Our default pick Swap it when... Language TypeScript Your product is mostly ML or data work → Python Frontend Next.js 16 + React 19 The app is 100% behind a login and SEO doesn't matter → Vite + React SPA UI Tailwind CSS + shadcn/ui You hire a designer and need a custom design system Backend/API Next.js route handlers, then a Node.js service (Hono or NestJS) Heavy AI pipelines → FastAPI. Very high throughput → Go Database PostgreSQL (Supabase or Neon) Almost never. Seriously ORM Drizzle Your team already knows Prisma well Auth Supabase Auth or Better Auth You want hosted UI in an afternoon → Clerk. Enterprise SSO → WorkOS Payments Stripe You sell globally and don't want to file taxes → Paddle, Lemon Squeezy or Polar. Indian customers paying in INR → Razorpay Hosting Vercel + managed Postgres Steady heavy compute, long jobs or strict compliance → AWS Background jobs Inngest or Trigger.dev High-volume queues → BullMQ on Redis or RabbitMQ Email Resend Very high volume → AWS SES Analytics PostHog You only need traffic stats → Plausible Error tracking Sentry (Rarely worth swapping) AI layer OpenAI / Claude APIs + pgvector RAG, agents or self-hosted models at scale → Python service on GPU infra Now the why, layer by layer. We spend a lot more time on the database and payments than on CSS, because that's where the expensive mistakes live. Why TypeScript End to End Wins for Most SaaS Startups One language from the database schema to the button component. That's the whole argument, and it's a strong one. When your Drizzle schema, your API responses and your React props share the same types, a renamed column breaks the build instead of breaking production. A three-person team can move between frontend and backend tickets without context switching between languages. And hiring is easier: TypeScript and React developers are the deepest talent pool you'll find in India, the US or Eastern Europe. There's a 2026-specific reason too. Most teams now write a big chunk of their code with AI assistants like Claude , Cursor or Copilot. Those tools are noticeably more reliable on mainstream, well-documented stacks than on niche ones, simply because there's far more public TypeScript and Next.js code for them to have learned from. Picking a popular stack is now also picking the stack your AI pair programmer writes best. (The counter-case: if your founding engineer is a Django or Rails veteran who can ship a feature a day, let them. Team fluency beats trend fluency every time. More on that below.) Read more about how we use TypeScript on client projects. Frontend: Next.js 16, With One Honest Caveat Next.js 16 wen t stable on October 21, 2025 , with Turbopack as the default bundler and React 19.2 support. For a SaaS product, it gives you the marketing site, the blog, the docs and the logged-in app in a single codebase, with server rendering where Google needs it and client interactivity where users need it. Pair it with Tailwind CSS and shadcn/ui. You copy components into your repo instead of installing a black-box library, so you own every line and can restyle anything without fighting a theme API. The caveat. Next.js's App Router, server components and caching model have a real learning curve. If your product is a dashboard that lives entirely behind a login, with no public pages that need to rank, a plain Vite + React single-page app is simpler to reason about and cheaper to host. Put your marketing site on a separate Next.js or static build and move on. Database: Just Use PostgreSQL This is the one decision we'd defend in any argument. PostgreSQL was used by 55.6% of all respondents in the 2025 Stack Overflow Developer Survey , and it ranked first for both "admired" (65.5%) and "desired" (46.5%). Popularity isn't the reason to pick it, though. The reason is that Postgres alone covers what used to take three databases: Relational data for users, organizations, subscriptions and invoices JSONB columns for the flexible, schema-light data people used to reach for MongoDB to store Full-text search that's good enough until you have hundreds of thousands of documents Vector search through pgvector, so your AI features don't need a separate vector database on day one Supabase or Neon? Supabase gives you Postgres plus auth, storage and realtime in one dashboard, and its Pro plan is $25/month per organization. Neon is a leaner serverless Postgres with database branching that's handy for preview environments. Both are plain Postgres underneath, which means you can migrate to AWS RDS later with a dump and restore. That exit path matters. Plan multi-tenancy on day one Every B2B SaaS is multi-tenant, and the cheapest time to design for it is before your first table exists. Our default: a shared schema where every tenant-owned table carries an organization_id , enforced with Postgres row-level security. Schema-per-tenant or database-per-tenant only makes sense when an enterprise contract demands data isolation, and you can add it for that one customer later. One production gotcha we see in audits: RLS policies that filter on organization_id without an index on that column. Everything works fine at 1,000 rows and crawls at 1,000,000. Index the tenant column on every table. It's a one-line fix that saves a very bad week. Authentication: Don't Build It Yourself You can write a login form in an hour. You can't write password resets, email verification, rate limiting, session rotation, OAuth, MFA and SAML SSO in an hour, and every one of those will eventually be asked for. Your realistic options in 2026: Supabase Auth if you're already on Supabase. The free plan covers up to 50,000 monthly active users and Pro covers 100,000, which is plenty for most early SaaS products. Better Auth if you want an open-source library that stores everything in your own Postgres, with plugins for organizations and SSO. Clerk if you want polished, prebuilt sign-in UI and are fine paying per user as you grow. WorkOS when your first enterprise prospect asks for SAML SSO and SCIM provisioning. Whichever you pick, model organizations, members and roles from the start. Retrofitting "teams" into an app built around single users is one of the most expensive refactors we get hired for. Payments: Stripe vs. a Merchant of Record (and the India Question) Billing is where SaaS founders lose the most time, so think about it earlier than feels necessary. Stripe is the default for good reason: excellent subscription APIs, a hosted customer portal and the best developer docs in payments. The standard US card rate is 2.9% + 30¢ per successful charge. The catch is that you are the seller, so sales tax, VAT and GST compliance are your problem (Stripe Tax helps, for an extra fee). A Merchant of Record (Paddle, Lemon Squeezy, Polar) becomes the legal seller of your software. They charge more per transaction, but they calculate, collect and remit taxes in every country for you. For a two-person team selling worldwide, that trade is usually worth it. If you're a founder in India , there's one more wrinkle. Stripe moved to invite-only onboarding for new Indian businesses in 2024 . The two common routes: Set up a US entity (Delaware or Wyoming are the usual picks; Craxinno itself runs a US entity out of Cheyenne, Wyoming) and use Stripe or a Merchant of Record for international customers. Use Razorpay for Indian customers paying in INR, including UPI AutoPay for recurring subscriptions. Plenty of Indian SaaS companies end up running both: Razorpay for domestic billing, Stripe or a Merchant of Record for everyone else. Build a thin billing layer in your code so the provider is swappable. We've done enough payment gateway integrations to know that "we'll only ever need one provider" doesn't survive the first enterprise deal. Hosting and Infrastructure: Start Managed, Move When the Bill Tells You To Start on Vercel for the Next.js app and a managed Postgres host for data. Zero servers to patch, preview deployments for every pull request, and deploys that take minutes. One thing founders miss: Vercel's free Hobby plan is restricted to non-commercial, personal use . The moment you charge customers, you need Pro at $20 per developer seat per month. When should you move to AWS ? Watch for these signals: Your Vercel function and bandwidth bill has become a meaningful line item every month You have long-running jobs (video processing, large imports, model inference) that don't fit serverless time limits An enterprise customer or regulation requires a specific data region, a signed BAA or a dedicated VPC You need a mix of always-on workers, queues and GPUs Even then, skip Kubernetes. ECS on Fargate, or a platform like Railway or Fly.io, covers most SaaS workloads well into the millions of requests without a dedicated DevOps hire. The AI Layer Is Now Part of the Default Stack In 2026, customers expect at least one AI feature in a SaaS product: a smart search, a summary, a draft, an agent that does the boring part of the workflow. So plan for it in the architecture instead of bolting it on. Stage 1: call models from your TypeScript backend. Use the Vercel AI SDK (or the official SDKs) to call OpenAI or Anthropic's Claude . Store embeddings in pgvector, in the same Postgres database as everything else. This handles AI search, summarization, chat over your users' data and simple tool-calling agents. Most startups never need to leave this stage. Stage 2: add a Python service when the work gets heavy. Python still owns the AI ecosystem. Once you're building multi-step RAG pipelines, parsing messy PDFs at volume, running evaluations or hosting open-source models on GPU providers like RunPod, stand up a separate FastAPI service. Your Next.js app talks to it over HTTP for quick calls and through a queue (Inngest, BullMQ or RabbitMQ) for long-running jobs. Four habits save real money here: Meter tokens per tenant from the first AI feature. Otherwise one heavy customer quietly eats your margin. Route by difficulty. Send easy tasks to a small, cheap model and escalate only the hard ones. Cache repeated requests. Identical prompts (the same document summary, the same FAQ answer) shouldn't hit the model twice. Log every prompt and output so you can evaluate quality before swapping models. What This SaaS Stack Actually Costs Per Month List prices at the time of writing. Always check the vendor's pricing page before you budget, because these change often. Stage Setup Fixed monthly cost Building / pre-revenue Vercel Hobby, Supabase Free, Resend Free (3,000 emails/month), PostHog and Sentry free tiers $0 First paying customers Vercel Pro (1 seat, $20), Supabase Pro ($25), Resend Pro ($20 for 50,000 emails) ~$65 + AI usage Growing team Add a Vercel seat per developer ($20 each), paid Sentry and PostHog tiers as volume grows, larger database compute Scales with usage, not with a big jump On top of fixed costs you pay variable fees: Stripe's 2.9% + 30¢ per card charge (or a higher Merchant of Record rate) and your LLM token spend. For AI-heavy products, token spend is often the biggest infrastructure line by far, which is why per-tenant metering matters so much. Two warnings. Supabase's free projects pause after 7 days of inactivity, so don't run a demo for investors on one. And Vercel Hobby isn't allowed for commercial use, so budget for Pro on launch day. When You Should Ignore This Stack A default is a starting point, not a rule. Break it when: Your team is already fast in something else. A senior Django, Rails or Laravel developer will ship a SaaS MVP faster in their framework than in a stack they're learning. Their admin panels and conventions are a gift at MVP stage. The core product is AI or data science. If 80% of the work is models and pipelines, go Python-first: FastAPI and Postgres on the backend, a React frontend on top. You need extreme real-time throughput. Trading systems, IoT ingestion or multiplayer collaboration may need Go or Elixir services for the hot path. You're in a regulated industry from day one. Healthcare or fintech products should check every vendor for HIPAA BAAs, SOC 2 reports and data residency options before writing code. AWS-first is often simpler here. 6 Tech Stack Mistakes That Force a Rewrite We see these on almost every rescue project that comes through our door. Microservices on day one. A modular monolith is faster to build, easier to debug and simpler to deploy. Split services only when a specific part has different scaling or team needs. Building auth or billing in-house. Weeks of work, ongoing security liability, zero differentiation. No tenant model. Adding organization_id to 40 tables after launch, while keeping live customer data intact, is miserable. Choosing a database for scale you don't have. You aren't Netflix. Postgres on a modest instance handles more traffic than most SaaS products ever see. Proprietary data APIs without an exit plan. Firebase and similar platforms are quick to start with, but moving off a non-SQL proprietary backend later can mean a full data-layer rewrite. No error tracking or logs until the first outage. Sentry and structured logs take an hour to add. Debugging a production incident blind takes days. Security and Compliance: What to Have Before Your First Enterprise Deal Few stack guides cover this, yet it's exactly what stalls B2B deals. Enterprise buyers will send a security questionnaire. Have answers ready: Encryption in transit (TLS) and at rest (default on Supabase, Neon and RDS) Automated backups with point-in-time recovery, and a restore you've actually tested Role-based access control and audit logs for admin actions SSO/SAML on your roadmap, or available on a higher plan A data processing agreement covering GDPR for EU customers and India's Digital Personal Data Protection Act, 2023 for Indian users A path to SOC 2. Tools like Vanta or Drata make the first audit far less painful when your infra is already on mainstream cloud providers None of this requires a different stack. It requires choosing vendors that publish their own compliance reports, which every tool in our default stack does on its paid plans. How Craxinno Helps SaaS Founders Pick and Ship a Stack We're an AI-first design and development studio based in Jaipur, with a US entity in Wyoming. We've been building web apps, SaaS platforms and AI products since 2017, across Next.js, Node.js, Python (FastAPI, Django), AWS and payment gateway integrations. If you're choosing the best tech stack for a SaaS startup of your own, or you've inherited one that's slowing you down, we'll review it with you and tell you plainly what to keep and what to change. See how we work , browse projects we've shipped , or talk to us about your stack .
050stories

How to Build a Chatbot with the OpenAI API: Step-by-Step Python Tutorial Quick answer: To build a chatbot with the OpenAI API, install the openai Python SDK, save your API key in an environment variable, and send each user message to client.responses.create() with your system prompt in instructions . Pass the previous reply's ID back as previous_response_id so the bot remembers the conversation, then stream the output to a web page through a small backend. That's the whole idea. The rest of this tutorial turns it into code you can run in about 20 minutes. One warning first. Search "OpenAI chatbot tutorial" and a good share of the top results still call openai.ChatCompletion.create() . That function was removed when the Python SDK hit version 1.0 back in November 2023, and the SDK is on version 3.29 as of October 2026. Copy that code today and you get an error before your bot says hello. Everything below is written against the current Responses API and tested on openai 3.29.0. What you'll build A support assistant called Ava for a made-up coffee subscription brand, Brewly. By the end you'll have: A terminal chatbot that streams replies word by word and remembers earlier messages. A FastAPI backend that keeps your API key off the browser. A plain HTML chat page that talks to that backend. A clear idea of what each conversation costs you. Python 3.9 or newer and an OpenAI account with billing enabled are all you need. No frameworks like LangChain. You'll understand every line, which matters the first time something breaks in production. Responses API vs Chat Completions vs Assistants: which one? OpenAI has three APIs that can power a chatbot, and older tutorials mix them up. API Status (Oct 2026) Who manages conversation history Use it for Responses API Recommended for all new projects You, or OpenAI via previous_response_id / Conversations New chatbots and agents Chat Completions Still supported You (resend the messages array) Existing apps you don't want to migrate yet Assistants API Listed under legacy APIs OpenAI (threads) Nothing new OpenAI's own migration guide says Responses is "recommended for all new projects," and reports 40–80% better cache utilization than Chat Completions in internal tests. Better cache hits mean lower bills on long chats, which is reason enough for a chatbot. So this tutorial uses the Responses API throughout. Step 1: Set up the project and your API key Create a folder, a virtual environment and install four packages: 1 2 3 4 mkdir openai - chatbot && cd openai - chatbot python - m venv . venv source . venv / bin / activate # Windows : . venv\Scripts\activate pip install openai python - dotenv fastapi uvicorn Generate a key at platform.openai.com → API keys , then create a .env file in the project folder: 1 2 OPENAI_API_KEY = sk - proj - your - key - here OPENAI_MODEL = gpt - 6 - luna Add .env to .gitignore right now, before your first commit. Leaked keys get scraped from public GitHub repos within minutes, and the bill lands on your account. What goes wrong here: if you see OpenAIError: Missing credentials. Please pass an api_key... , the SDK can't find the variable. Check that load_dotenv() runs before OpenAI() is created and that you started Python from the folder containing .env . Step 2: Send your first request Create hello.py : 1 2 3 4 5 6 7 8 9 from dotenv import load_dotenv from openai import OpenAI load_dotenv ( ) client = OpenAI ( ) # reads OPENAI_API_KEY from the environment response = client . responses . create ( model = "gpt-6-luna" , input = "Explain what an API key is in one sentence." , ) print ( response . output_text ) Run python hello.py . If a sentence comes back, your account, key and billing all work. response.output_text is a convenience property that joins all the text the model produced. The full response.output list also holds reasoning items and tool calls, which you'll need later for memory. Which model should a chatbot use? These are the current text models and their prices per 1 million tokens, from OpenAI's models page: Model Input Output Good for gpt-6-luna $0.10 $0.50 FAQ and support bots, high volume, fastest replies gpt-6.1-sol $2 $10 Bots that need to reason over policies, data or code gpt-6-astra $10 $50 Hard, high-value queries where accuracy beats cost Our take: start every chatbot on Luna. Most customer-facing questions ("where's my order?", "can I change my plan?") don't need a frontier model, and Luna costs 1/20th of Sol. Upgrade only the conversations that need it. Because the model name lives in .env , switching is a one-line change. Step 3: Give the bot a personality and rules with a system prompt Without instructions, the model answers anything about anything. A support bot needs a job description. In the Responses API, that goes in the instructions parameter: 1 2 3 4 5 6 7 8 9 10 11 SYSTEM_PROMPT = """You are Ava, the support assistant for Brewly, an online coffee subscription. - Only answer questions about orders, subscriptions, shipping and coffee. - Keep replies under 80 words unless the user asks for more detail. - If you are not sure, say so and point the user to help@brewly.example. - Never invent order numbers, prices or delivery dates.""" response = client . responses . create ( model = "gpt-6-luna" , instructions = SYSTEM_PROMPT , input = "Can I pause my subscription for a month?" , ) print ( response . output_text ) A few things we've learned writing system prompts for client bots: Rules beat adjectives. "Keep replies under 80 words" works. "Be concise" gets interpreted loosely. Tell it what to do when it doesn't know. The fallback line (email support) is what stops a bot from making up a refund policy. Ban the specific lies. Order numbers and delivery dates are what support bots most love to invent, so the prompt names them. If you want to go deeper on wording, our guide to prompt engineering covers structure and testing. Step 4: Add conversation memory (three ways) Ask the bot from Step 3 "Can I pause my plan?", then follow up with "What about two months?" It has no idea what you mean. Every API call starts with a blank slate, because the model is stateless. You have three ways to fix that. Approach How it works Where history lives Best for A. Manual history Append every message and reply to a list, send the whole list each time Your app Full control, store=False for sensitive data B. previous_response_id Pass the last reply's ID; OpenAI fills in the earlier turns OpenAI (responses kept 30 days by default) Terminal bots, short sessions C. Conversations API Create a conversation object once, attach every response to it OpenAI (no 30-day expiry) Web apps where users come back later One thing none of the three changes: you pay for the history every turn. OpenAI's docs say it directly: with previous_response_id , "all previous input tokens for responses in the chain are billed as input tokens." Server-side memory saves you code, not tokens. Option A: manual history (stateless) 1 2 3 4 5 6 7 8 9 10 11 history = [ ] def ask ( user_text ) : history . append ( { "role" : "user" , "content" : user_text } ) response = client . responses . create ( model = "gpt-6-luna" , instructions = SYSTEM_PROMPT , input = history , store = False , # nothing kept on OpenAI's side ) history . extend ( response . output ) # keep ALL output items, not just the text return response . output_text Note history.extend(response.output) . OpenAI's conversation-state guide says to keep every output item so reasoning items stay intact. Appending only output_text as a string works on simple models and quietly degrades answers on reasoning ones. Option B: previous_response_id (the terminal chatbot) This is the full, runnable terminal bot. Save it as chat.py : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 import os from dotenv import load_dotenv from openai import OpenAI load_dotenv ( ) client = OpenAI ( ) MODEL = os . getenv ( "OPENAI_MODEL" , "gpt-6-luna" ) SYSTEM_PROMPT = """You are Ava, the support assistant for Brewly, an online coffee subscription. - Only answer questions about orders, subscriptions, shipping and coffee. - Keep replies under 80 words unless the user asks for more detail. - If you are not sure, say so and point the user to help@brewly.example. - Never invent order numbers, prices or delivery dates.""" def main ( ) : previous_id = None print ( "Ava is ready. Type 'quit' to exit.\n" ) while True : user_text = input ( "You: " ) . strip ( ) if user_text . lower ( ) in { "quit" , "exit" } : break if not user_text : continue stream = client . responses . create ( model = MODEL , instructions = SYSTEM_PROMPT , # resend every turn input = user_text , previous_response_id = previous_id , reasoning = { "effort" : "low" } , stream = True , ) print ( "Ava: " , end = "" , flush = True ) for event in stream : if event . type == "response.output_text.delta" : print ( event . delta , end = "" , flush = True ) elif event . type == "response.completed" : previous_id = event . response . id print ( "\n" ) if __name__ == "__main__" : main ( ) Run python chat.py , ask about pausing, then ask "what about two months?" Ava now knows what "that" refers to. See the comment # resend every turn ? That's the bug that catches almost everyone. The SDK documentation says that with previous_response_id , "the instructions from a previous response will not be carried over to the next response." Send instructions only on the first call and by turn three Ava has forgotten she's a coffee bot and will happily write you a cover letter. Option C: the Conversations API For a web app, a user might close the tab and come back tomorrow. A conversation object survives that, and unlike stored responses it isn't subject to the 30-day TTL: 1 2 3 4 5 6 7 conversation = client . conversations . create ( ) response = client . responses . create ( model = "gpt-6-luna" , instructions = SYSTEM_PROMPT , input = "Can I pause my plan?" , conversation = conversation . id , ) Save conversation.id against your user record and pass it back on every message. We'll use this in the web version. Step 5: Stream replies instead of waiting You already saw streaming in chat.py , but it deserves its own section because it changes how the bot feels more than any model upgrade. Without streaming, the user types a question and stares at nothing for two, three, four seconds while the whole answer generates. Then a wall of text appears. With streaming, the first words show up almost immediately and the reply types itself out. Same total time. Completely different experience. The mechanics are two lines: pass stream=True , then loop over events and print the ones of type response.output_text.delta . Other events you'll see include response.created , response.completed (which carries the final response object and its ID) and error . Step 6: Put the chatbot on a web page with FastAPI Here's where a lot of tutorials go wrong. They call the OpenAI API straight from browser JavaScript, which means shipping your API key to every visitor. Anyone who opens dev tools can copy it and run up your bill. The fix is a thin backend. The browser talks to your server; only your server talks to OpenAI. Create app.py : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 import os from dotenv import load_dotenv from fastapi import FastAPI from fastapi . responses import FileResponse , StreamingResponse from openai import OpenAI from pydantic import BaseModel , Field load_dotenv ( ) client = OpenAI ( timeout = 30 , max_retries = 3 ) MODEL = os . getenv ( "OPENAI_MODEL" , "gpt-6-luna" ) SYSTEM_PROMPT = """You are Ava, the support assistant for Brewly, an online coffee subscription. - Only answer questions about orders, subscriptions, shipping and coffee. - Keep replies under 80 words unless the user asks for more detail. - If you are not sure, say so and point the user to help@brewly.example. - Never invent order numbers, prices or delivery dates.""" app = FastAPI ( ) class ChatIn ( BaseModel ) : conversation_id : str message : str = Field ( min_length = 1 , max_length = 2000 ) @app . get ( "/" ) def home ( ) : return FileResponse ( "index.html" ) @app . post ( "/conversations" ) def new_conversation ( ) : conversation = client . conversations . create ( ) return { "conversation_id" : conversation . id } @app . post ( "/chat" ) def chat ( body : ChatIn ) : def generate ( ) : stream = client . responses . create ( model = MODEL , instructions = SYSTEM_PROMPT , input = body . message , conversation = body . conversation_id , reasoning = { "effort" : "low" } , max_output_tokens = 800 , stream = True , ) for event in stream : if event . type == "response.output_text.delta" : yield event . delta return StreamingResponse ( generate ( ) , media_type = "text/plain" ) Three small details doing real work here: max_length=2000 on the message stops someone pasting a novel into your bot and charging you for it. FastAPI rejects it with a 422 before OpenAI is ever called. max_output_tokens=800 caps the reply cost. Reasoning tokens count toward this limit, so don't set it too tight or replies get cut off. OpenAI(timeout=30, max_retries=3) raises the SDK's default of 2 automatic retries, which covers most brief rate-limit and network blips. Now the front end. Create index.html in the same folder: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 <! doctype html > < html lang = " en " > < head > < meta charset = " utf-8 " > < title > Brewly Assistant </ title > </ head > < body > < div id = " log " > </ div > < form id = " chat-form " > < input id = " msg " autocomplete = " off " placeholder = " Ask about your order... " > < button > Send </ button > </ form > < script > const log = document.getElementById("log"); let conversationId = null; function addLine(who, text) { const p = document.createElement("p"); p.textContent = `${who}: ${text}`; // textContent, never innerHTML log.appendChild(p); return p; } document.getElementById("chat-form").addEventListener("submit", async (e) => { e.preventDefault(); const input = document.getElementById("msg"); const text = input.value.trim(); if (!text) return; input.value = ""; if (!conversationId) { const res = await fetch("/conversations", { method: "POST" }); conversationId = (await res.json()).conversation_id; } addLine("You", text); const botLine = addLine("Ava", ""); const res = await fetch("/chat", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ conversation_id: conversationId, message: text }), }); const reader = res.body.getReader(); const decoder = new TextDecoder(); let reply = ""; while (true) { const { done, value } = await reader.read(); if (done) break; reply += decoder.decode(value, { stream: true }); botLine.textContent = `Ava: ${reply}`; } }); </ script > </ body > </ html > Start the server: 1 uvicorn app : app -- reload Open http://127.0.0.1:8000 and chat. That's a working, streaming, memory-aware chatbot in roughly 130 lines across two files. (The textContent comment isn't decoration. Model output rendered with innerHTML is an XSS hole: a user can talk the bot into returning a <script> tag. If you later want Markdown formatting, run it through a sanitizer such as DOMPurify first.) For a production widget with a launcher bubble, mobile layout and analytics, see our walkthrough on how to add AI chat to your website . How much does an OpenAI chatbot cost to run? Less than most people expect, if you pick the model deliberately. Take a typical support chat: a 300-token system prompt, 10 back-and-forth turns, user messages around 50 tokens and replies around 150. Because earlier turns are re-billed as input each time, the 10 turns add up to roughly 12,500 input tokens and 1,500 output tokens. Model Cost per 10-turn conversation Cost per 10,000 conversations gpt-6-luna ~$0.002 ~$20 gpt-6.1-sol ~$0.04 ~$400 gpt-6-astra ~$0.20 ~$2,000 These are estimates from list prices. They leave out reasoning tokens (billed as output) and cached-input discounts, which push in opposite directions. Measure your real numbers from response.usage after a week of traffic. The pattern that matters: cost grows with conversation length , not just count, because every turn re-sends the history. Two ways to keep long chats in check: Trim manual history. With Option A, keep the system prompt plus the last 10–20 items. Turn on server-side compaction. Pass context_management=[{"type": "compaction", "compact_threshold": 200000}] and OpenAI compresses older context once the conversation crosses that token count. Our full playbook on reducing LLM API costs covers caching, routing and batching in more depth. If you're budgeting a whole project rather than API calls, see what an AI chatbot costs to build in 2026 . Common mistakes (and the fix for each) AttributeError: module 'openai' has no attribute 'ChatCompletion' You copied pre-2023 code. Use client = OpenAI() and client.responses.create() . 400 Bad Request mentioning temperature GPT-6 models don't accept temperature , top_p or top_logprobs while reasoning is switched on. Remove them. Control tone through the system prompt instead. (On Luna you can set reasoning={"effort": "none"} if you really need sampling controls.) The bot forgets its role after a few messages You only sent instructions on the first call. With previous_response_id , resend them every turn. Replies stop mid-sentence max_output_tokens is too low. Reasoning tokens eat into it before visible text does. Raise the cap or lower the reasoning effort. RateLimitError (429) under load The SDK retries automatically, but sustained traffic needs a queue or per-user rate limit on your side. Check your usage tier in the OpenAI dashboard. Before you go live: a short production checklist The tutorial bot works. A public bot needs a bit more: Authenticate users and rate-limit per user. An open /chat endpoint is a free LLM for the whole internet. Send a safety_identifier . It's a stable per-user ID (OpenAI recommends hashing the email or username) that helps OpenAI detect abuse coming through your app without flagging your whole account. Decide on data retention. Responses are stored for 30 days by default. For health, finance or other sensitive data, use manual history with store=False . Log every conversation on your side. You can't improve a prompt you can't read. Review 20 real chats a week and you'll find the gaps fast. Write a test set. Twenty questions with expected answers, run after every prompt change, catches regressions before customers do. Give the bot real knowledge. A system prompt can't hold your entire help center. That's what retrieval is for. Where to go next: from chatbot to something useful Right now Ava is polite but knows nothing about Brewly's actual policies or orders. The next two upgrades fix that: Retrieval-augmented generation (RAG) lets the bot answer from your own documents. Upload them to a vector store and give the model the file_search tool, or build your own pipeline. Start with how RAG works , and if you're weighing it against training a custom model, read RAG vs fine-tuning . Function calling lets the bot do things: look up an order, pause a subscription, book a call. At that point it stops being a chatbot and starts being an agent. Here's the difference in practice: AI agents vs chatbots . Need a chatbot built for your business? This tutorial gets you a working prototype in an afternoon. Getting from prototype to a bot that knows your products, connects to your CRM or order system, and holds up under real traffic is where most of the work lives. That's the work our AI development team does: RAG chatbots, support agents and LLM integrations built in Python and FastAPI and shipped to production. Tell us what you're building and we'll tell you honestly whether you need us or this tutorial is enough.

How to Add Stripe Payments to a Next.js App Adding Stripe payments to a Next.js app takes about 30 minutes with the modern approach, and it is simpler than most tutorials make it look. The trick is to use Stripe Checkout , Stripe’s own hosted payment page, rather than building your own card form. You create a checkout session on the server, redirect the user to Stripe to pay, and Stripe sends you back. You never handle raw card details, which makes it faster to build and far more secure. This guide walks through the whole thing, step by step, for the Next.js App Router. Here is the one principle that matters more than any line of code, and the thing beginners get wrong: never trust the browser to confirm a payment. A user can close the tab, lose connection, or tamper with the page after paying. The only reliable way to know a payment succeeded is a webhook, a message Stripe sends directly to your server. Getting the webhook right is what separates a real integration from one that silently loses orders, so this guide treats it as essential, not optional. This guide covers setup, the checkout flow, the all-important webhook, testing, and going live. The quick answer: the whole flow If you want the shape of it first, here is what you are building. Install Stripe and add your API keys to environment variables. Create a server route that makes a Stripe Checkout session and returns its URL. Add a button that calls that route and redirects the user to Stripe to pay. Create a webhook route that listens for Stripe’s confirmation and fulfills the order (this is the critical part). Test locally with the Stripe CLI, then add your live keys and production webhook to go live. The golden rule throughout: Stripe Checkout handles the payment UI and card security for you, and the webhook, not the browser, is the source of truth for whether a payment actually happened. Prerequisites Get these in place first. A Next.js app using the App Router (Next.js 13 or newer), and Node.js 18 or newer. A Stripe account (free to create), with access to your API keys in the Stripe Dashboard. You will use test keys while building. Basic familiarity with Next.js API routes (route handlers) and environment variables. Step 1: Install Stripe and set up your keys Install the Stripe packages: npm install stripe @stripe/stripe-js Then add your keys to a .env.local file in your project root (use your test keys while building): STRIPE_SECRET_KEY=sk_test_your_key NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=pk_test_your_key STRIPE_WEBHOOK_SECRET=whsec_your_secret NEXT_PUBLIC_APP_URL= http://localhost:3000 Add .env.local to your .gitignore so your secret keys never reach your repository. The secret key must stay on the server only; the publishable key (prefixed NEXT_PUBLIC_) is safe in the browser. It also helps to create one shared Stripe client. Make a file at lib/stripe.ts: import Stripe from “stripe”; export const stripe = new Stripe(process.env.STRIPE_SECRET_KEY!); Now every route can import the same configured client. Step 2: Create the checkout session route This server route creates a Stripe Checkout session and returns its URL. Create app/api/checkout/route.ts: import { NextResponse } from “next/server”; import { stripe } from “@/lib/stripe”; export async function POST() { const session = await stripe.checkout.sessions.create({ mode: “payment”, line_items: [ { price_data: { currency: “usd”, product_data: { name: “Your Product” }, unit_amount: 2000, // $20.00, in cents }, quantity: 1, }, ], success_url: ${process.env.NEXT_PUBLIC_APP_URL}/success , cancel_url: ${process.env.NEXT_PUBLIC_APP_URL}/cancel , }); return NextResponse.json({ url: session.url }); } A few notes: amounts are in the smallest currency unit (cents), mode is “payment” for a one-time purchase (use “subscription” for recurring), and success_url and cancel_url are where Stripe sends the user after. The route returns session.url, the hosted Stripe page you will redirect to next. Step 3: Add the checkout button On your page, add a button that calls the route and redirects the user to Stripe. In a client component: “use client”; export default function CheckoutButton() { async function handleClick() { const res = await fetch(“/api/checkout”, { method: “POST” }); const data = await res.json(); window.location.href = data.url; // redirect to Stripe } return <button onClick={handleClick}>Buy now</button>; } That is the entire customer-facing flow: the user clicks, your route makes a session, and the browser sends them to Stripe’s secure page to enter card details. You never touch the card data. Step 4: Create the webhook (the critical part) This is the step that makes the integration trustworthy. After a payment, Stripe sends a message to your server confirming it. You listen for that message and fulfill the order, send the product, mark it paid, email the receipt. Create app/api/webhooks/stripe/route.ts: import { NextResponse } from “next/server”; import { headers } from “next/headers”; import { stripe } from “@/lib/stripe”; import Stripe from “stripe”; export async function POST(req: Request) { const body = await req.text(); // CRITICAL: raw text, not JSON const signature = (await headers()).get(“stripe-signature”)!; let event: Stripe.Event; try { event = stripe.webhooks.constructEvent( body, signature, process.env.STRIPE_WEBHOOK_SECRET! ); } catch (err) { return new NextResponse(“Invalid signature”, { status: 400 }); } if (event.type === “checkout.session.completed”) { const session = event.data.object as Stripe.Checkout.Session; // Fulfill the order here: mark paid, send the product, email receipt console.log(“Payment confirmed:”, session.id); } return NextResponse.json({ received: true }); } Two things catch almost everyone here. First, you must read the raw request body with req.text(), not parsed JSON, because Stripe verifies a signature against the exact raw bytes. Second, always return a 200 response, even for events you do not handle, otherwise Stripe retries for up to 72 hours. Verifying the signature is what proves the message genuinely came from Stripe and not an attacker. Step 5: Test locally with the Stripe CLI You cannot test webhooks just by clicking around, you need Stripe to reach your local server. The Stripe CLI does this. Install it, log in, then forward events to your app: stripe listen --forward-to localhost:3000/api/webhooks/stripe This prints a webhook signing secret (starting whsec_), put that in your STRIPE_WEBHOOK_SECRET. Now run a test payment through your checkout button using Stripe’s test card number, 4242 4242 4242 4242 with any future expiry and any CVC, and watch the CLI forward the checkout.session.completed event to your webhook. When your webhook logs the confirmation, the full loop works. Step 6: Go live Switching to real payments is a short checklist. Replace your test API keys with your live keys (from the Stripe Dashboard, after activating your account). In the Stripe Dashboard, under Developers then Webhooks, add your production webhook endpoint, https://your-domain.com/api/webhooks/stripe , and copy its signing secret into your production environment variables. Deploy, and run one real, small transaction to confirm the live flow end to end. On Vercel or similar, add all your environment variables in the project settings. That is it: real payments flowing, confirmed by webhook, with card security handled entirely by Stripe. The mistakes that break Stripe integrations A few errors catch almost everyone. Avoid these. Trusting the browser instead of the webhook. If you mark an order paid based on the user landing on your success page, you will lose orders and let people fake payments. The webhook is the only source of truth. This is the single most important rule. Parsing the webhook body as JSON. Reading the body any way other than raw text breaks signature verification. Use req.text(). Exposing the secret key. The secret key must stay server-side only. Never prefix it with NEXT_PUBLIC_ or use it in a client component. Not returning 200 from the webhook. If your handler errors or returns a non-200, Stripe retries for up to 72 hours. Handle events, then return 200. Forgetting the production webhook. Local testing uses the CLI; production needs a webhook endpoint registered in the Stripe Dashboard with its own signing secret. Forgetting this means payments work but orders never get fulfilled live. Ready to add payments to your app? Adding Stripe to a Next.js app is genuinely approachable: hosted Checkout handles the hard, sensitive parts, and a correct webhook makes it reliable. Get those two right, and you have production-grade payments without ever touching raw card data. When you want payments built properly, including subscriptions , multiple gateways, or complex billing, as part of a real product, the Craxinno team integrates Stripe and other payment gateways into Next.js and mobile apps. See recent work in the Craxinno portfolio, explore our custom software development service , or email sales@craxinno.com .

How to Add AI Chat to Your Website (Step-by-Step) Adding AI chat to your website is far easier in 2026 than most business owners expect, and there are three ways to do it, from a no-code tool you can set up in an afternoon to a fully custom assistant trained on your own content. The right path depends on one thing: how much you need the chat to actually know about your business. This guide walks through all three, step by step, so you can pick the one that fits and get it live. Here is the key decision to make first, because it saves you time and money. A generic chat widget that answers from a script is cheap and fast but limited. An AI chat that answers accurately from your own content, your products, policies, and FAQs, is more powerful and is what most businesses actually want, and it is now very achievable. Knowing which you need before you start is the difference between a quick win and a frustrating one. This guide covers the three ways to add AI chat, a step-by-step for each, what it costs, and how to choose. The quick answer: three ways to add AI chat If you want the options at a glance, here they are, from easiest to most powerful. A no-code chat tool (easiest). Sign up for a service like a hosted AI chat widget, paste a snippet of code into your site, and you have AI chat live in an afternoon. Best for simple needs and non-technical teams. A platform with your own content (middle). Use an AI chat platform that lets you upload your documents, website pages, or FAQs, so the chat answers accurately from your actual business content. Still mostly no-code, more useful, modest monthly cost. A custom AI chat (most powerful). Have a developer build a chat assistant trained on your content, connected to your systems (orders, bookings, accounts), that matches your brand and can actually take actions. Best when chat is important to your business and you want full control. The honest rule: start with the simplest option that meets your need. Most businesses are well served by option two, a platform that answers from their own content, without the cost of a custom build. First, decide what you actually need Before choosing a method, answer two quick questions, because they determine which path fits. Does the chat need to know your business? If you just want to greet visitors and answer a few generic questions, a basic widget is fine. If you want it to answer accurately about your products, pricing, policies, or services, you need a method that uses your own content, which rules out the most basic widgets. This is the single most important question. Does the chat need to do things, or just answer? If answering questions is enough, a platform works. If you need the chat to take actions, look up an order, book an appointment, update an account, you are moving toward a custom build, because that requires connecting to your systems. Most businesses start with answering and add actions later. Your answers point you straight to one of the three methods below. Method 1: Add a no-code AI chat widget (the fast path) This is the quickest way to get AI chat live, and it needs no developer. Here is the process. Step 1: Choose a tool. Pick a hosted AI chat service. Many exist, offering a chat widget you can add to any website, often with a free tier to start. Step 2: Sign up and configure. Create an account, set the chat's name, greeting, and tone, and choose basic settings like colors to match your brand. Step 3: Add your knowledge (if supported). Better no-code tools let you paste in FAQs or point the tool at your website so it can answer from your content. Do this if available, it is what makes the chat actually useful. Step 4: Copy the code snippet. The tool gives you a small snippet of code (usually one line). Step 5: Paste it into your website. Add the snippet to your site, in your site builder's "custom code" or "footer" section, or, on WordPress, via a plugin or the theme footer. Save, and the chat appears on your site. Step 6: Test it. Open your site, ask the chat a few real questions, and refine its settings or knowledge based on how it answers. That is it, AI chat live, often within an afternoon. The limit is that no-code tools offer less control and cannot deeply connect to your systems. Method 2: Use a platform trained on your content (the sweet spot) This is where most businesses should land. These platforms are still largely no-code, but they let the chat answer accurately from your own business content, which is what makes AI chat genuinely useful. Step 1: Choose a content-aware AI chat platform. Pick a service built to ingest your documents and website and answer from them (this uses a technique called RAG , which grounds answers in your real content so the chat does not make things up). Step 2: Upload your content. Add your FAQs, product and service pages, policies, and any help documents. The platform processes them so the chat can retrieve the right answer. Step 3: Configure behavior and brand. Set the tone, the greeting, what to do when it does not know (for example, offer to connect to a human), and match your brand. Step 4: Add it to your site. As with method one, paste the provided snippet into your website. Step 5: Test with real questions, then refine. Ask the questions your customers actually ask, see where answers fall short, and improve the content you fed it. The quality of your uploaded content largely determines how good the chat is. This path gives you a chat that answers accurately about your business, usually for a modest monthly fee, without a custom build. For most businesses, it is the best balance of power and effort. Method 3: Build a custom AI chat (the powerful path) When AI chat is important to your business, when you need it to match your brand exactly, answer from your full knowledge, and take real actions, a custom build is the answer. This needs a developer, but it gives you complete control. A custom AI chat typically uses an LLM (like Claude or GPT) connected to your content through RAG, so it answers accurately from your data, and connected to your systems so it can act, look up an order, check availability, update a record. It lives on your site exactly as you design it, with no third-party branding, and you own it. The build process, at a high level: define what the chat should do and answer, connect it to your content and systems, engineer and test its behavior against real questions, and deploy it to your site with a clean handoff to a human when needed. This is real development, and it is what our guide on the cost to build an AI chatbot breaks down in detail, and if the chat needs to complete tasks rather than just answer, that moves into agent territory, which our guide on AI agents vs chatbots explains. Choose this when chat is a core part of your customer experience and the simpler options have hit their limits. What it costs A quick, honest picture so you can budget. No-code widget: often free to start, then roughly $20 to $100 a month for a small business as you add features and volume. Content-aware platform: typically $50 to a few hundred dollars a month, depending on volume and features. The sweet spot for most businesses. Custom build: a one-time development cost (plus ongoing model usage and maintenance), which starts in the low five figures and scales with complexity. Right when chat is important enough to justify owning it. The pattern: the more the chat needs to know and do, and the more control you want, the more it costs, so match the spend to how much the chat matters to your business. How to choose your method A simple way to decide. If you want AI chat live fast, for simple questions, and have no developer, use a no-code widget (method one). If you want the chat to answer accurately about your business without a custom build, which is most businesses, use a content-aware platform (method two). If chat is core to your business and you need full control, brand match, and the ability to take actions, build custom (method three). And the smart sequence: start simple, prove chat helps your visitors, learn what they actually ask, then upgrade to a more powerful method if the value is there. There is no need to build custom on day one, and often no need to build custom at all. Ready to add AI chat to your website? Adding AI chat is one of the highest-return, lowest-friction ways to improve your website in 2026, it answers visitors instantly, around the clock, and captures leads you would otherwise lose. Start with the simplest method that meets your need, ground it in your real content, and upgrade only when the value justifies it. When you need AI chat that truly fits your business, trained on your content, connected to your systems, matched to your brand, the Craxinno team builds custom AI chat and assistants that work in production. See recent AI work in the Craxinno portfolio , explore our AI development service , or email sales@craxinno.com .

Stripe vs Razorpay: Which Payment Gateway to Use? Stripe vs Razorpay is less a head-to-head fight than a question of geography: where is your business registered, and where are your customers? Razorpay is built for India, dominating local payment methods like UPI, and is usually the better choice for Indian businesses serving Indian customers. Stripe is built for the world, excelling at international cards and global subscriptions, and is the better choice for cross-border and global businesses. They are not really competing for the same job, and knowing that clears up most of the decision. Here is the insight most comparisons miss, and the one that saves businesses the most money: for many companies, the answer is both. A common setup uses Razorpay to collect payments from Indian customers, where its UPI support and higher domestic success rates win, and Stripe to collect from international customers, where its global network and trust recognition win. So before you frame this as "which one," ask whether your business actually needs one, the other, or both. This guide covers what each gateway is, how they really differ, where each genuinely wins, and a simple way to choose for your business. The quick answer If you want the decision fast, use this. Choose Razorpay if your business is registered in India and your customers are mostly Indian. It supports all local payment methods (UPI, RuPay, net banking, wallets) with excellent success rates, charges around 2% plus GST on domestic cards and 0% on UPI, settles to your Indian bank quickly, and includes a business-banking suite (RazorpayX). For an India-first business, it is the natural default. Choose Stripe if your business is global, or you need to accept international cards and run complex subscriptions. Stripe leads on cross-border card payments, SaaS billing, and developer experience, and is trusted worldwide. Note that in India, Stripe is available only as a sales-gated preview, so availability depends on where your business is registered. Use both if you serve both Indian and international customers: Razorpay for domestic payments, Stripe for international. This is a common, sensible setup, not a compromise. The honest rule: let your business location and your customers' location decide. India-first points to Razorpay, global points to Stripe, and both-markets often points to running both. What Stripe and Razorpay actually are A quick definition of each, because they were built for different worlds. Razorpay is an Indian payment gateway built specifically for India's payments landscape. It handles all the local methods Indian customers actually use, UPI, RuPay cards, net banking, and wallets, with routing tuned for high success rates on Indian transactions. It has grown into a broader financial platform, adding business banking, payroll, and lending (RazorpayX). To use it, your business generally needs to be registered in India. Stripe is a global payment platform built for businesses operating across borders. It is known for a best-in-class developer experience, powerful subscription and billing tools, and support for card payments across many countries and currencies. It is the gateway behind a large share of global SaaS and online businesses. In India specifically, Stripe is offered only as a preview you reach through its sales team, so direct availability is limited. The core split: Razorpay is India-first, optimized for local methods and Indian businesses; Stripe is global-first, optimized for cross-border cards and international scale. That difference, more than any feature, decides which fits you. The differences that actually matter Five differences decide most real decisions. Here is the honest version of each. Where you can use it. This comes first because it can make the decision for you. Razorpay requires an India-registered business. Stripe signs up businesses directly in its many supported countries, but in India it is only a sales-gated preview. So your business's country of registration may rule one of them out before you compare anything else. Local payment methods (India). Razorpay wins decisively for Indian customers. It supports UPI (at 0% fee), RuPay, net banking, and wallets natively, with routing that delivers higher domestic success rates. Since UPI dominates Indian online payments, this is a major advantage for any business selling to Indian customers. Stripe's India method coverage is narrower. International payments. Stripe wins. For accepting cards from customers around the world and handling multiple currencies, Stripe's global network, higher international success rates, and worldwide trust make it the stronger choice. Razorpay does support international cards (around 3% plus GST) but is built primarily for the Indian market, and international settlement can involve extra approval steps. Subscriptions and billing. Stripe is the global gold standard for complex recurring billing, metered usage, and international subscriptions, making it the default for SaaS with global customers . Razorpay has strong subscription tools too, with deep support for Indian e-mandates, so for India-focused recurring billing it is excellent. Match this to where your subscribers are. Pricing. Broadly similar on standard domestic transactions (both around 2% plus GST on Indian cards), with the differences in the details: Razorpay charges 0% on UPI, a real saving for Indian businesses, while Stripe adds a surcharge on international cards plus a currency-conversion markup. The cheaper option depends on your payment mix, so model it against how your customers actually pay. Why many businesses use both Here is the part the "versus" framing misses, and the practical answer for a lot of companies. You do not have to pick one. If your business serves both Indian and international customers, a common and smart setup is Razorpay for domestic payments and Stripe for international. Indian customers pay via UPI and local cards through Razorpay, where success rates and fees are best for India; international customers pay by card through Stripe, where the global network and trust recognition win. You get the strengths of both, matched to each customer base. This is a mature, widely used architecture, not a hack, and it is especially common for Indian businesses with global ambitions, exporters, SaaS companies, and marketplaces selling across borders. The one cost is a bit more integration work to run two gateways, which is exactly the kind of thing worth getting right at build time rather than retrofitting later, since payment integration is one of the trickier parts of any build . When to choose Razorpay Razorpay is the right call in these common situations. Choose it when your business is registered in India and serves mainly Indian customers, since it supports all local methods with the best success rates. Choose it when UPI is important to your customers, because Razorpay's native, 0%-fee UPI support is a real advantage. Choose it when you want quick settlement to an Indian bank and a familiar, responsive India-based support team. And choose it when you want business banking, payroll, or lending alongside payments, via RazorpayX. For an India-first business, Razorpay is usually the practical winner. When to choose Stripe Stripe is the stronger choice when your business is global or cross-border. Choose it when you accept payments from customers around the world and need many currencies and high international success rates. Choose it when you run complex or international subscriptions, where Stripe's billing tools are the global standard. Choose it when developer experience and clean APIs matter to your team, since Stripe is known for them. And choose it when your business is registered in a country Stripe supports directly. For a global or SaaS business, Stripe is built for exactly that job. Ready to set up the right payment gateway? The Stripe versus Razorpay choice comes down to geography: where your business is registered and where your customers are. India-first points to Razorpay, global points to Stripe, and serving both markets often means running both. Getting the integration right, including handling both gateways cleanly if you need them, is what turns the right choice into reliable revenue. The Craxinno team integrates Stripe, Razorpay, and other payment gateways into web and mobile apps, including dual-gateway setups for businesses serving India and the world. See recent work in the Craxinno portfolio, explore our custom software development service, or email sales@craxinno.com .

Next.js vs WordPress for a Business Website (2026) Next.js vs WordPress for a business website comes down to one question in 2026: is your website a sales tool that needs to be fast, secure, and rank well, or a content site your team needs to edit every day without a developer? If it is the former, Next.js is usually the stronger choice. If it is the latter, WordPress is often the practical one. Both can build a good business website, so the honest decision is about fit, not about which is "better." Here is the single most useful thing to know before you choose, and it is the point most comparisons skip: the best platform is the one your team will actually use. A blazing-fast Next.js site that nobody on your team can update, so it goes stale, is worse than a WordPress site your marketing person keeps fresh. Choosing the framework before you have thought about who maintains the site is the most common and most expensive mistake in this decision. This guide covers what each one is, how they really differ for a business website, where each genuinely wins, and a simple way to choose. The quick answer If you want the decision fast, use this. Choose Next.js when your website is a sales and marketing tool: it must load fast, rank well on Google, convert visitors, and stay secure. Next.js is fast by default (scoring 95 to 100 on performance tests versus WordPress's typical 60 to 70), has a far smaller security surface, and gives you full control over SEO and design. Ideal when the site directly affects revenue. Choose WordPress when your team needs to edit the site frequently without a developer, when a large plugin ecosystem matters, or when you want a lower upfront cost and a familiar dashboard. Ideal for content-heavy sites and teams that publish often themselves. Consider headless WordPress (a hybrid) if you want both: the WordPress editor your team knows, with a fast Next.js front-end on top. A capable middle path for teams that need editing ease and modern performance. The honest rule: match the platform to how your website earns its keep and who will maintain it, not to which technology is newer. What Next.js and WordPress actually are A quick definition of each, because they are fundamentally different tools. WordPress is a content management system (CMS) that powers roughly 43% of all websites. It is a ready-made platform: you pick a theme, add plugins for features, and edit everything through a visual dashboard, often without touching code. Think of it as a customizable building that comes mostly pre-built. Its whole strength is letting non-technical people create and update a website themselves. Next.js is a framework for building fast, custom websites and web apps, built on React. There is no pre-built dashboard or theme; a developer builds the site to your exact needs, and it renders pages on the server or ahead of time for speed. Think of it as building custom, to spec. Its strength is performance, security, and total control, at the cost of needing a developer to build and change it. The core split: WordPress is a ready-made CMS optimized for easy self-editing; Next.js is a custom framework optimized for speed, security, and control. Everything below follows from that difference. The differences that actually matter for a business website Five differences decide most real business-website projects. Here is the honest version of each. Speed and SEO. Next.js wins clearly. It is built for performance, and business sites on Next.js routinely score 95 to 100 on Google's performance tests, versus 60 to 70 for a typical WordPress site. Since page speed and Core Web Vitals are confirmed Google ranking factors, this is a real, measurable SEO advantage. A well-optimized WordPress site (good caching, lean plugins, a CDN) can perform respectably, but Next.js makes fast the default, while WordPress makes fast something you work for. This ties into the broader reason server-rendered sites rank better, which our Next.js vs React guide explains. Ease of editing. WordPress wins decisively, and for many businesses this is the deciding factor. WordPress gives your team a visual dashboard to create pages, edit content, and publish, no developer needed. With Next.js, content changes and new pages often require a developer (unless you add a headless CMS). If your team updates the site frequently and has no technical help, WordPress removes real friction. Security. Next.js wins. WordPress's popularity and plugin model make it a big target: it accounts for the large majority of CMS security incidents, mostly through vulnerable plugins. Next.js has a much smaller attack surface, no database to break into by default, no login page for bots, no third-party plugins. If security and uptime matter to your business, this is a genuine advantage. Cost over time. This one is nuanced. WordPress is usually cheaper upfront (themes and plugins versus paying a developer to build custom). But over three years, the picture often evens out or flips: WordPress carries ongoing costs for premium plugins, security services, and maintenance, while a Next.js site can host for free or cheap and needs less firefighting. Cheaper to start is not always cheaper to own. Design and control. Next.js wins on flexibility. You get a unique design built to your brand, not a theme hundreds of other businesses also use, and full control over every detail. WordPress themes are faster and cheaper but can look templated. If a distinctive, custom brand experience matters, Next.js delivers it. The headless WordPress middle path Before choosing an extreme, know the hybrid that gives many businesses the best of both. Headless WordPress keeps the WordPress editor your marketing team already knows, but uses it purely as a content system behind a fast Next.js front-end. Your team edits content in the familiar WordPress dashboard; visitors get a fast, secure, modern Next.js site. It captures WordPress's editing ease and Next.js's performance in one setup. The trade-off is cost and complexity: it is more expensive to build than standard WordPress, since you are building a custom front-end, and it needs a developer to set up. But for a business that genuinely needs both easy editing and top performance, it is often the right answer, and it is a common, mature choice in 2026. This is closely related to the broader headless-versus-traditional CMS decision, which our CMS guide covers in depth. When to choose WordPress WordPress is the right call more often than the "everything should be Next.js" crowd suggests. Choose it when your team needs to edit and publish frequently without a developer, since the visual dashboard removes friction. Choose it when you are a local or small business that mainly needs a clean, findable site, hours, services, contact, where WordPress is perfectly capable. Choose it when a specific plugin ecosystem (booking, membership, a particular integration) does exactly what you need out of the box. And choose it when upfront budget is tight and you want to launch quickly on a theme. For content-driven, self-maintained business sites, WordPress is often the practical, cost-effective winner. When to choose Next.js Next.js is the stronger choice when your website is a serious business tool. Choose it when the site is conversion-critical, visitors need to find you, trust you, and act, and speed and design directly affect revenue. Choose it when you are competing for valuable Google keywords, where Next.js's technical SEO and speed advantage is hard for a WordPress competitor to match. Choose it when security and uptime are non-negotiable, because you handle customer data or cannot afford a hack. And choose it when you want a distinctive, custom brand experience, or the site needs custom features, app-like functionality, or AI integration. For a business where the website is a revenue engine, Next.js is built for that job. Ready to build the right business website? The Next.js versus WordPress choice comes down to how your website earns its keep and who maintains it: a fast, secure, conversion-focused site points to Next.js, a frequently self-edited content site points to WordPress, and headless WordPress bridges the two. Get this right early, because migrating platforms later is costly and disruptive. The Craxinno team builds business websites on both Next.js and WordPress, and will recommend the right one for your goals and your team, not a one-size-fits-all answer. See recent work in the Craxinno portfolio , explore our web development service , or email sales@craxinno.com .

LangChain vs LlamaIndex: Which for Your RAG App? LangChain vs LlamaIndex for a RAG app comes down to a clear split in 2026: if RAG is your whole project and you want a working system fast, LlamaIndex is the easier, more focused choice. If RAG is one part of a bigger system with agents and complex workflows, LangChain gives you the broader toolkit. Both are free, open source, and excellent, and the honest truth is that many production teams end up using both together. Here is the reframe most comparisons miss, and it clears up the whole decision. The old rule was "LangChain for orchestration, LlamaIndex for retrieval." By 2026 that clean split has collapsed, both frameworks now do both jobs. So the useful question is no longer "which one wins," but "which one fits what I am building, and where does each still have the edge." That is what this guide answers, without the marketing noise. We will cover what each framework is, how they really differ for RAG , where each genuinely wins, why serious teams often combine them, and a simple way to choose for your app. The quick answer If you want the decision fast, use this. Choose LlamaIndex if RAG is your main use case, document Q&A, a knowledge base, retrieval over your own data, and you want to ship a working system quickly. It is purpose-built for retrieval, needs roughly 30% to 40% less code for a standard RAG pipeline, and gives strong retrieval accuracy out of the box. Choose LangChain (with LangGraph) if RAG is one piece of a larger system that also needs agents, tools, multi-step workflows, and stateful orchestration. Its ecosystem is broader, its agent and memory tooling more mature, and its community larger. Consider both for serious production RAG. A very common 2026 pattern is LlamaIndex for ingestion and retrieval underneath, LangChain or LangGraph for orchestration on top. You are not locked into one. The honest rule: for a pure, get-it-working-fast RAG app, start with LlamaIndex; for RAG inside a bigger agent system, start with LangChain; and know that combining them is a normal, mature choice, not a compromise. What LangChain and LlamaIndex actually are A quick definition of each, because their design philosophy drives the difference. LangChain is a broad framework for building LLM applications of all kinds. It gives you composable building blocks, prompts, tools, memory, chains, and agents, that you wire together into whatever LLM-powered app you need. RAG is one of many things it can do. Think of it as a general-purpose toolkit for LLM apps, with a large ecosystem and, via LangGraph, mature support for complex, stateful agents. LlamaIndex is a framework focused specifically on connecting LLMs to your data, that is, on RAG and retrieval. It was built from the start around ingesting documents, indexing them well, and retrieving the right context, and it has deeper, more specialized primitives for exactly that. Think of it as a purpose-built RAG toolkit that does one job, retrieval over your data, especially well. The core split, then: LangChain is broad and general; LlamaIndex is focused and retrieval-first. Both are free and open source. Both, in 2026, can build a full RAG app on their own. The difference is what each makes easy. The differences that actually matter for RAG Five differences decide most real RAG projects. Here is the honest version of each. Speed to a working RAG app. LlamaIndex wins here. Because it is purpose-built for RAG, it gets you to a working retrieval system faster, with meaningfully less code, roughly 30% to 40% less for a standard pipeline. If you need a RAG system working this sprint, LlamaIndex is the quicker path. Retrieval quality out of the box. LlamaIndex has the edge. Its specialized parsers and indexing handle documents, tables, and complex layouts well by default, and it delivers strong retrieval accuracy without heavy tuning. If retrieval quality is your priority, and for RAG it usually is, this matters. Flexibility and breadth. LangChain wins. If your app goes beyond standard RAG, into agents, multiple tools, custom multi-step logic, LangChain's component approach gives you more room, and its ecosystem has integrations for almost everything. Most simple RAG apps fit standard patterns, but if yours does not, LangChain's flexibility pays off. Agents and orchestration. LangChain, via LangGraph, is more mature for building complex, stateful agents with memory and multi-step reasoning. If RAG is one capability inside a larger agent, LangChain is the stronger foundation. This connects to the broader question of which framework to use for AI agents generally. Community and ecosystem. LangChain has the larger community and more third-party resources, which means more tutorials and faster help when stuck. LlamaIndex's community is smaller but very active and focused, and often gives higher-quality answers specifically for RAG and indexing questions. Why serious teams often use both Here is the part the "versus" framing misses, and the honest answer for many production systems. You do not have to choose. The most common pattern in serious 2026 RAG systems is to use both frameworks for what each does best: LlamaIndex for the ingestion and retrieval layer, where its specialized indexing shines, and LangChain or LangGraph for the orchestration layer on top, where its agent and workflow tooling leads. LlamaIndex finds the right context; LangChain decides what to do with it. This is not a hack or a compromise, it is a mature architecture. A frequent path looks like this: a team starts on LangChain, hits a retrieval-quality ceiling as their RAG grows, and adds LlamaIndex underneath for the retrieval layer while keeping LangChain for orchestration. So if you are building something ambitious, the real answer to "which one" is often "both, each for its strength," and it helps to think about your architecture that way from the start. Getting the retrieval layer right is the single biggest driver of RAG quality, which our guide on how RAG works explains in depth. When to choose LlamaIndex LlamaIndex is the right first choice in these common situations. Choose it when RAG is your primary or only use case, document Q&A, a knowledge base, search over your own data. Choose it when you want a working RAG system fast, since it needs less code and gets you there quicker. Choose it when retrieval quality is your top priority, because its indexing and parsing are strong out of the box. And choose it when your documents are complex, tables, mixed layouts, large volumes, since its specialized parsers handle these well. For a focused, retrieval-first RAG app, LlamaIndex is usually the faster, simpler path. When to choose LangChain LangChain is the right first choice when your needs go beyond pure RAG. Choose it when RAG is one part of a bigger system that also needs agents, tools, and multi-step workflows. Choose it when you need mature, stateful agent orchestration, which LangGraph provides. Choose it when you want the largest ecosystem and community, for integrations, tutorials, and support. And choose it when your app has custom, non-standard logic that benefits from LangChain's flexible, composable components. For RAG embedded in a broader LLM application, LangChain is the stronger foundation, which is why it is a common choice when building full AI products . Ready to build your RAG app? The LangChain versus LlamaIndex choice comes down to what you are building: a focused, fast RAG app points to LlamaIndex, a broader agent system points to LangChain, and many serious production systems sensibly use both. Since both are free and open source, the real cost of choosing wrong is engineering time, so it is worth matching the framework to your actual architecture from the start. The Craxinno team builds production RAG systems on both LangChain and LlamaIndex, and will architect the right approach, including combining them, for your specific app. See recent AI work in the Craxinno portfolio , explore our AI development service , or email sales@craxinno.com .

How Much Does It Cost to Build a Food Delivery App? Building a food delivery app costs between $40,000 and $150,000 for most businesses in 2026, with a lean single-city MVP starting near $25,000 and a full multi-city platform passing $250,000. That is the honest range. This guide helps you find your number inside it, and shows you where the cost actually hides. Here is what almost every food delivery cost guide underplays. A food delivery app is not one app. It is three: a customer app to order, a restaurant app to receive and manage orders, and a driver app to accept and deliver them, all sharing one backend and all staying in sync in real time. And the surprise for most founders is which parts cost the most. It is not the pretty customer app everyone pictures. It is the unglamorous restaurant order-management panel and the driver dispatch logic, the two pieces teams most consistently underestimate. Experienced builders now recommend putting at least 30% of the front-end budget into the restaurant and driver sides, not the customer app. This guide breaks down the cost by build stage, why your business model matters more than any single feature, the hidden costs, and how to launch without overspending. The quick answer: cost by build stage If you want the number fast, here are the honest 2026 ranges, based on Indian development rates, which run 40% to 60% below US and UK firms. For a US agency, multiply by roughly two to three. Single-restaurant / MVP: $25,000 to $60,000. The core loop for one restaurant or a lean marketplace start: customers browse a menu, order, pay, and track; the restaurant receives and manages orders; a basic admin panel oversees it. 3 to 4 months. Built to validate the model in one area. Mid-level marketplace: $60,000 to $150,000. A real three-sided platform: many restaurants, a dedicated driver app with live dispatch, real-time order tracking, reviews, promo codes, driver payouts, and a proper admin dashboard, on native iOS and Android. 5 to 8 months. Where most food delivery startups land. Full / multi-city platform: $150,000 to $300,000+. Multi-city operations, AI-driven dispatch and recommendations, advanced analytics, loyalty, and infrastructure built to scale to heavy order volume. 8 to 14 months. Built to compete with the major players. The single biggest factor is how many of the three sides you build and how much real-time dispatch and payout machinery you include from day one. Your business model decides the cost more than any feature Before features, one decision shapes your whole budget: which food delivery model you are building. They carry very different costs. Single-restaurant ordering (cheapest). One restaurant or one chain, its own branded ordering app, no third-party restaurants and often no separate driver network (the restaurant handles delivery). This avoids most marketplace complexity and is by far the cheapest to build. If you run a few locations under one brand, this beats a marketplace at a fraction of the price, a point many restaurant groups miss when they assume they need a full marketplace. Marketplace aggregator (mid). Many restaurants, customers choose among them, and either the restaurants deliver or you run a driver fleet. This needs strong multi-vendor tools and restaurant onboarding, and is the model most people picture when they say "food delivery app." Logistics marketplace with your own fleet (most expensive). You provide the drivers, which means a full driver app plus dispatch, routing, and payout systems, the costliest model, because you are building a real-time logistics operation on top of the marketplace. The honest guidance: pick the simplest model that fits your business. Many founders overbuild a full logistics marketplace when a single-restaurant app or an aggregator (letting restaurants handle their own delivery) would launch faster and cost a fraction as much. If you are weighing a marketplace against other builds, our guide on the cost to build an app like Airbnb covers two-sided marketplaces, and the cost to build an app like Uber covers real-time logistics. Why a food delivery app costs what it does A crucial point, because it explains the price. You are building three connected apps, not one, plus the backend that keeps them in sync, and each app is a real product with its own screens, logic, and testing. The customer app is the easy part. Browsing menus, ordering, paying, and tracking are well understood and not where the difficulty lies. Ironically, it is what founders focus on, and it is the least of the cost. The restaurant panel is harder than it looks. Restaurants need to receive orders instantly, accept or reject them, update menus and availability, manage busy-time chaos, and print or display tickets to the kitchen. A clunky restaurant panel breaks the whole system, and this is one of the two most underestimated builds. The driver app and dispatch are the other big cost. Accepting jobs, real-time GPS navigation, live tracking for the customer, and, above all, the dispatch logic that assigns the right order to the right driver efficiently- this is genuine real-time engineering and the second consistently underestimated piece. Keeping all three in sync in real time. When a customer orders, the restaurant must know instantly, a driver must be dispatched, and the customer must see live status, all at once, reliably. That real-time coordination across three apps is where much of the real engineering lives. The features that move the price Beyond the three apps, these are the biggest budget swing factors. Real-time order tracking. Live status and driver location on a map are expected, and the streaming infrastructure behind it adds real cost. Dispatch and routing logic. Efficiently assigning and routing drivers is core to a logistics-model app and a significant, standalone build. Payments with restaurant and driver payouts. Money comes from customers and is split to restaurants and drivers minus your commission, a careful multi-party payment flow, usually on Stripe Connect or similar. Native iOS and Android. Three apps across both platforms is more to build and maintain; cross-platform (one codebase per app) is usually the right call to control cost, and is the sensible default for most food delivery launches. AI features. Personalized recommendations, smart dispatch, and demand prediction add cost; add them when they earn their place, not by default. The hidden costs most estimates skip The build price is only part of the number. Budget for these too. Third-party fees. Payment processing, maps, SMS, and push notifications all charge ongoing usage fees that scale with orders, and map costs in particular can climb at volume. Ongoing maintenance. Plan for 15% to 22% of build cost per year, three apps that must stay in sync need real upkeep as phones, menus, and rules change. Support operations. Customers, restaurants, and drivers all need support, and that operation grows with order volume. Real-time infrastructure. Live tracking and instant order sync across three apps demand serious, always-on cloud infrastructure, with a monthly bill that scales steeply with orders. The cost that dwarfs the build: filling three sides at once Here is the truth that matters more than any development number, and it is even harder for food delivery than for other marketplaces. You must fill three sides of the market, in each area, at the same time. You need enough restaurants that customers have real choice, enough customers that restaurants and drivers earn, and enough drivers that food arrives hot and fast, all in one area, all at once. Miss any one side and the whole thing stalls: no restaurants means no customers, no drivers means cold food and refunds, no customers means restaurants and drivers leave. This three-sided cold start, solved area by area, is where most food delivery startups actually fail, and where most of the real money and effort go, far beyond the app. What this means for you: budget for acquiring restaurants, customers, and drivers, per area, as seriously as, or more seriously than, the build. Start hyper-local, one city or even one neighborhood, prove all three sides work together there, then expand. Before you spend on a full build, have a concrete plan for how you will sign your first restaurants, attract your first customers, and recruit your first drivers, together. The app is the easy part. Balancing three sides of a live market is the hard part, and the part that decides whether the build was worth it. How to build a food delivery app without overspending Four moves keep the budget sane. Pick the simplest model that fits. If you are one restaurant or one chain, build a single-restaurant ordering app, not a marketplace. If you are a marketplace, consider letting restaurants handle delivery (aggregator) before building a full driver fleet. Model choice is your biggest cost lever. Start hyper-local with an MVP. One city or neighborhood, core loop only. Prove the three sides work together before adding features or areas. Scoping to an MVP is the biggest budget control available. Invest in the restaurant and driver sides, not just the customer app. Since these are the most underestimated and most likely to break the system, budget them properly; allocate a real share of the build here rather than pouring everything into the customer experience. Use proven building blocks and go cross-platform. Do not build payments, maps, or messaging from scratch; use established services and Stripe Connect. Build cross-platform to cover iOS and Android affordably. Ready to build your food delivery platform? The cost to build a food delivery app comes down to your business model and how many of the three sides you build, but the deeper truth is that the build is only half the battle, and filling three sides of a live local market is the other half. Pick the simplest model, start hyper-local, invest in the restaurant and driver sides, and budget for the market as seriously as the code. The Craxinno team builds three-sided marketplaces and real-time delivery platforms, from single-restaurant apps to full logistics marketplaces, with the ordering, dispatch, and payout systems done properly. See recent work in the Craxinno portfolio , explore our mobile app development service , or email sales@craxinno.com .

How Much Does It Cost to Build an App Like Uber? (2026) Building an app like Uber costs between $50,000 and $150,000 for a solid MVP in 2026, with full-featured platforms passing $250,000. That is the honest range. This guide helps you find your number inside it, and shows you the technical cost driver most estimates completely miss. Here is what almost every "app like Uber" guide gets wrong. Uber is not one app. It is really three: a rider app, a driver app, and an admin operations dashboard, all talking to each other in real time. And the single most expensive, most underestimated part is not the maps or the design. It is the real-time engine. Showing a driver's car moving on a rider's screen, updated every one to three seconds, requires a fundamentally different backend architecture (streaming connections, not the simple request-response most apps use). That real-time layer, plus the matching algorithm that pairs riders with the nearest driver, is where the budget actually goes, and it is why an Uber-style app costs far more than a typical app. This guide breaks down the cost by build stage, the features that move the price, the hidden costs (including the ones that dwarf the build), and how to launch without overspending. The quick answer: cost by build stage If you want the number fast, here are the honest 2026 ranges, based on Indian development rates, which run 40% to 60% below US and UK firms. For a US agency, multiply by roughly two to three. MVP (single platform): $50,000 to $120,000. The core loop across rider and driver apps: registration, ride booking, real-time GPS tracking, driver matching and dispatch, in-app payments, ratings, and an admin dashboard. One platform to start, 3 to 5 months. Built to validate demand in one city. Full app (iOS + Android): $120,000 to $250,000. Everything above, on both native platforms, plus surge/dynamic pricing, in-app chat, scheduled rides, promo codes, fraud detection, and richer analytics. 5 to 8 months. Where most funded ride-hailing startups land. Enterprise platform: $250,000 to $500,000+. Multi-city support, advanced AI routing and matching, white-label capability, deep operational tooling, and infrastructure built to scale to heavy concurrent traffic. 8 to 14 months or more. The single biggest factor is that you are building multiple connected apps plus a real-time backend, not one simple app, which sets the cost floor higher than most first-time founders expect. Why an "app like Uber" costs more than a normal app A crucial point, because it explains the price floor. A normal app is one app with one type of user, talking to a server when the user taps something. An app like Uber breaks all three of those assumptions, and each break adds cost. You are building multiple apps. A rider app and a driver app are two separate products with different screens, different logic, and different needs, plus an admin dashboard to oversee the whole operation. That alone multiplies the build compared with a single-sided app. You need a real-time backend, not a normal one. This is the big one. A normal app asks the server for data when needed. Uber must stream a driver's live location to the rider continuously, every one to three seconds, and instantly match riders to drivers as both move around a city. That requires streaming infrastructure (WebSocket or similar) and is a fundamentally different, more demanding architecture. Budgeting for a normal backend and discovering you need a real-time one is a classic, expensive surprise. You need a matching algorithm. Deciding which driver gets which rider, based on distance, availability, direction, and more, in real time, across a whole city, is a genuine engineering problem, not a simple lookup. It is one of the defining, and pricier, parts of the build. If you are comparing against a simpler product, our guide on the cost to build a mobile app covers standard single-sided apps, and for a booking-marketplace comparison, see the cost to build an app like Airbnb . The features that actually move the price Beyond the core real-time machinery, these are the biggest budget swing factors. Real-time GPS tracking and the backend behind it. The feature users see is the moving car; the cost is the streaming infrastructure behind it. This is consistently one of the most expensive modules, and the one founders most underestimate. The dispatch and matching engine. Pairing riders and drivers efficiently in real time is core to the experience and a significant, standalone build. Payments with driver payouts. Like any marketplace, money comes from riders and is paid out to drivers minus your commission, usually via Stripe Connect or similar. This split-payout flow is careful, high-stakes work. Surge and dynamic pricing. An engine that raises prices when demand outstrips supply is valuable but adds real cost, often $25,000 to $50,000, so add it when it earns its place. Native iOS and Android . A rider and driver app on both platforms is more to build and maintain than a single-platform start, but push notifications for ride status make native worthwhile for this category. Admin and operations dashboard. Someone must monitor rides, resolve disputes, manage drivers, and watch the numbers. This is a substantial, non-optional part of the build, easy to underestimate. The hidden costs most estimates skip The build price is only part of the number. Budget for these, because they surprise ride-hailing founders in particular. Real-time infrastructure is expensive to run. This is the standout hidden cost for an Uber-style app. Streaming live locations for many users at once generates enormous data and demands serious, always-on cloud infrastructure. The monthly server bill for a busy ride-hailing app is far higher than for a normal app, and it scales steeply with usage. Third-party fees. Maps (Google Maps or similar), SMS, payment processing, and push services all charge ongoing usage fees, and map API costs in particular can climb fast at scale. Legal, licensing, and insurance. Ride-hailing is heavily regulated, and it varies by city and country. Licensing, driver background checks, and insurance are real, ongoing costs and a genuine barrier, not an afterthought. This is often the hardest non-technical part of the whole venture. Maintenance and support. Plan for 15% to 20% of build cost per year for maintenance, plus a support operation for riders and drivers that grows with volume. The cost that dwarfs the build: the two-sided cold start Here is the truth that matters more than any development number. The hardest, most expensive part of an app like Uber is not building it. It is filling it, in each city, with both drivers and riders at the same time. A ride-hailing app with no drivers is useless to riders, and with no riders it is useless to drivers, and this must be solved city by city. You cannot launch nationwide; you launch one city at a time, and in each you have to acquire enough drivers that riders get quick pickups, and enough riders that drivers keep earning. This "cold start" is where most ride-hailing startups actually fail, and where most of the real money and effort go, far beyond the app itself. What this means for you: budget for driver and rider acquisition, per city, as seriously as, or more seriously than, the build. And add the legal and insurance cost of operating in each city on top. Before you spend $80,000 on an MVP, have a concrete, funded plan for how you will get drivers and riders onto the platform in your first city. The app is the easy part. Launching a live two-sided market in a real city is the hard part, and the part that decides whether the build was worth it. How to build an app like Uber without overspending Four moves keep a ride-hailing build sane. Start with one city and one service. Do not build a multi-city, multi-service platform on day one. Uber started with black cars in one city. Prove the real-time loop and the unit economics in a single city first, then expand. This is the biggest cost-and-risk control available. Build the MVP, not the full Uber. Your first version needs only the core loop: book, match, track, pay, rate, across rider and driver apps with an admin panel. Surge pricing, AI routing, and multi-city can wait for version two. Scoping to an MVP is the biggest lever on your budget. Use proven building blocks. Do not build maps, real-time messaging, or payments from scratch. Established mapping services, real-time platforms, and Stripe Connect save enormous time and are more reliable than a first custom version. Solve one city before you scale. Nail driver and rider acquisition, and the legal setup, in a single city before spending on features or expansion. A working app in one live city beats a feature-rich app with no drivers. Ready to build your ride-hailing app? The cost to build an app like Uber comes down to the multiple connected apps and the real-time engine behind them, but the deeper truth is that the build is only half the challenge, and launching a live, two-sided market city by city is the other half. Scope tight, start with one city, and budget for the market and the legal reality as seriously as the code. The Craxinno team builds real-time, location-based apps and two-sided marketplaces, from MVP to scale, with the tracking, matching, and payment systems done properly. See recent work in the Craxinno portfolio , explore our mobile app development service , or email sales@craxinno.com .