Try five live demosdemo.gravixar.com

Work

A digital agency portal that onboards clients in about 10 minutes

New clients go from first inquiry to a live project in about 10 minutes. By email it used to take two to three days.
schematic12 fixed stepsEvery inquiry takes the same path to a live project, and every step is logged.

At a glance

Digital agencySince early 2026

Audit retention
7y contract / 1y operational
On this page

What was going wrong

The agency was running on a patchwork: Notion for some things, Slack threads for others, email for proposals, a shared Drive for files, and handoffs between admin and project managers done by hand. New inquiries got lost between "admin has it" and "the project manager owns it".

The scope agreed on the discovery call drifted before the contract, because nobody held the one true copy. When something went wrong there was no record, so disputes came down to whose memory won. They needed one place for a client's whole path, from first inquiry to final sign-off, with AI only where it actually saved time.

What I did

I built one portal where every inquiry moves through 12 fixed steps, so its status is never a guess or a note someone typed. Every change is logged, and cancelling a project keeps the record and issues a credit instead of wiping it.

AI helps in three places. It picks the next intake question and drafts a brand brief from the client's website, so the project manager walks into the first call already briefed. A daily check reads the activity log for warning signs, like a burst of deletions or an inquiry stuck too long, and emails the admin. And it writes a short brief for each task, so a designer can start without reading the whole project.

AI never publishes, never approves, and never messages a client without a person checking first.

What changed

Live in production. A new client goes from first inquiry to an active project in about 10 minutes. By email, that took two to three days.

It is bigger than it looks: a July 2026 recount found 84 data models and 9 scheduled jobs.

Every digital agency I work with now starts from this build, and I cut or extend it to fit.

The long version

What I built

The portal handles four distinct surfaces in one codebase: public marketing and the signup wizard, a client's view of their own work, the operations console for project managers and admins, and internal HR and presence tools. Each has its own permissions, its own dashboard, and its own record of who changed what.

Every named unit, from sign-in at the base to the daily security check at the top, is catalogued in the repository with a map of what depends on what. That catalogue is the recipe. When I build a portal for the next client, I work down the list and decide unit by unit what to keep, drop, or change. A plain task tracker needs a fraction of it. An internal HR tool needs less than that.

The piece I'm proudest of is the review flow on tasks. Every deliverable moves through five fixed steps:

Draft → sent for internal review → approved internally → sent to the client → approved by the client.

A revision request from the client sends it back into the loop. Each step does one job: it sends its emails and notifications and writes a line to the audit log. No step is implied. No admin can flip a task to "approved" by editing a free-text field.

Decisions I'd defend

The fixed steps are non-negotiable. Free-text status fields are how "almost works" turns into "definitely doesn't." Every step has explicit conditions and side effects, and every one writes an audit row. That discipline pays for itself the first time a client says a deliverable was never approved.

Records are kept on two clocks. Anything financial or contractual is kept for 7 years. Everyday changes are kept for 1 year. The rule for each kind of record is written into the code, and arguments about what to keep stop once it is.

When the AI fails, the work carries on. Every AI step, the brand brief, the daily warning check, the intake question writer, has a fallback. If the AI cannot be reached or takes too long, that part is skipped and everything else goes ahead. I will not ship a system where the core work waits on someone else's model.

Only some changes can be undone in one click. The activity log has a Restore button on changed rows, but only for fields on a short approved list. Status, money amounts and who owns a task are never on it. Those need a human decision, and the list is where that line is drawn.

Every finding has to survive an attempt to disprove it. On 29 July 2026, 14 agents working in parallel hunted for problems in the code, then a second pass tried to knock every finding down. All 63 findings survived, and 11 came back with a corrected severity. Two rounds of fixes followed. They closed all 63, plus older issues they pulled in along the way, 87 in total, and every test passed afterwards, 252 of 252. The second pass is the part that matters: it keeps an audit from becoming a list of things that merely sounded bad.

What broke

Activation was slow on big retainers. When a project manager activates a heavy retainer, the portal creates milestones, tasks, and an AI brief for each task. Picking the right person for each task by skill and workload takes about 5 database lookups. On a 30-deliverable retainer that's 150 lookups in a row before activation finishes. The first version timed out. The fix was to run activation in the background and show its progress on screen. Meanwhile the button reads "Activating… (spinning up tasks)" and stays disabled, so nobody double-clicks during the 70 seconds.

The skip-payment coupon was supposed to be temporary. I added a coupon that skips payment, to cover the demo period before live Stripe payments were switched on. It's still there, and it will probably stay as a way to give free access and run demos. Some temporary hacks earn their keep.

Getting "Lock scope" right took two rounds. Project managers submitted call notes with a "Mark as Call Done" button, which then locked the scope. Users pushed back: the words didn't match the action. They were locking a scope, not just closing a call. I renamed it "Lock Scope" and added "Unlock & re-scope" for the assigned project manager. Sounds trivial. It meant a lot of email-template editing, because the lock sets off a notification, a dashboard banner, and a chain of emails.

The first cancellation deleted everything. Wrong. Cancelling needs to keep the record, remove the tasks, put the inquiry back where it can be re-scoped, and issue a credit. That took a rebuild. Credits are now records of their own, and the planned finance module will treat them that way.

What's next

The healthcare platform that was next when I wrote this is live: a separate build for a different problem, running on its own domain since June 2026. Written up here.

For this portal, a finance module that follows the cancellation pattern: its own screens, emails, and audit hooks, covering expenses, salaried payroll, and monthly reports. It is the last open item on the roadmap.

The same kind of build, on sample data

The client's screens stay private, so Lattice on demo.gravixar.com is a separate build of the same pattern, under its own brand. No signup.

Open Lattice

Bring me a real operations problem. I will show you the system running before you sign anything.

The Ops Leak Audit is the fixed-price first step: I count the hours your tools cost your team, then price the fix. Rather talk first? Book a 30-minute call. If it is not a fit, you still leave with notes you can use.

Portrait of Qamar
Qamar, the person you would work with