INCNXT
NanokingfisherAn online US company-formation service: data-driven pricing by state and package, a transactional checkout that creates the account on the way, a formation status flow, and an admin panel built from scratch.
About this project
INCNXT helps people start a US company online. You pick an entity type and a state, choose a package, add any extra services, and the team files the paperwork while you follow its progress.
It has three parts: a Next.js marketing site and order flow, an Express and Sequelize API on MySQL, and a React admin panel for the team that does the filing. I joined when the site design was mostly in place but nothing behind it was connected yet. Over about two weeks I built the admin panel from scratch and wrote most of the API and frontend code that turned a set of static pages into a working ordering system.
Selling a service is mostly about what happens after the customer pays.
Packages, states, and what things cost
The price of a formation depends on three things: the state's filing fee, a base package, and any extra services. Packages and services are data in the database, managed from the admin panel. A package lists the services it includes, and each of those can be marked optional, so the pricing page lets customers switch parts of a package on or off and see the total update live. Services can also be sold on their own, without a package, and a service is only offered while it's active. Each state's fee comes from the states table, so when a state changes its fee, someone edits one row.
One checkout, with or without an account
Most customers order before they have an account. The create-business endpoint does everything inside one database transaction. It finds or creates the user (and sends a generated password if it's new), checks the state, saves the business details, and opens an invoice for the total. If any step fails, none of it is saved. Customers who are already logged in skip the account step and the business is linked to their existing profile. Emails on a block list can't create accounts or companies.
Following an order through
I replaced a loose status field with a defined status flow. A new business starts as pending name verification, moves to pending verification, and ends as fully operational. Along the way there are rejection states for the name and for the filing, plus states for suspended accounts and overdue payments. Customers can suggest other names when they order, and the dashboard shows whether the name was approved or rejected, with colour-coded progress. On the admin side, the team moves each company through those statuses, uploads the filed documents for the customer to download, and manages invoices, marking them paid or overdue. I also redesigned the invoice into something customers can download.
The admin panel and content
The admin panel covers companies, invoices, packages, services, states, users, and blog posts, all with server-side pagination and search. The blog gets articles onto the marketing site without a deploy. Posts have a status and a featured flag, the site filters on both, and the home page sections pull their content from the API. The contact form was the last piece connected before handover.
At a glance
- — Data-driven pricing: state fees, packages, add-ons
- — Optional package services with live totals
- — Transactional checkout that creates the account on the way
- — Formation status flow with name verification
- — Document delivery from admin to customer
- — Invoices with paid and overdue handling
- — Admin panel built from scratch with search and paging
- — Blog CMS feeding the marketing site
Two weeks across three codebases taught me to settle the data model first. Once statuses, packages, and invoices had a fixed shape, the API, the site, and the admin panel could be built against it at the same time.