Manish Gaud

— CASE STUDY / OPERATIONS PLATFORM

A pet care platform, for the operations team behind the dogs.

Soul Konect is a dog daycare and pet onboarding platform built admin-first — three platforms (Laravel API, React admin, Expo mobile) shipped in named milestones, designed single-tenant for the launch facility and architected to support multiple daycare brands without a rewrite.

Solution architect & lead engineer · 2026–present · Beta · Pre-launch

— Section B

Context

Most dog daycare operations run on spreadsheets, WhatsApp threads, and folders of paperwork. Vaccination certificates live in a shared drive. Bookings live in a calendar. Payments live in a separate ledger. Check-in and check-out happen on whiteboards. The operations team carries the whole picture in their heads — and the picture falls apart the first time someone takes a day off.

Soul Konect is the operations system that daycare needs. Pet parents onboard from a mobile app: profile, pet details, vaccinations, behavior, consent. Admin reviews the submission against a checklist and either approves, defers, or requests changes. Once a pet is approved, bookings, meet-and-greet sessions, check-ins, payments, and invoices all live against the same record. Most pet products in the market are consumer-led; this one was designed from the staff side first.

It runs single-tenant for the launch facility but the architecture treats SaaS as a structural boundary, not a future migration. Every business table has a nullable tenant_id from the first migration. Media storage paths are shaped tenants/{tenant_key}/... even though only one tenant exists today. Brand identity stays in configuration, not domain logic. When the second daycare wants to onboard, the work is well-defined.

The operations team carries the whole picture in their heads. Soul Konect carries it for them.

— Section C

My role

I’m the solution architect and lead engineer. I designed the data model, the milestone-by-milestone rollout, the cross-platform shape (Laravel API, React admin, Expo mobile), the SaaS-ready boundaries, and the deployment plan. I used modern AI coding tools — Cursor, Claude — under my direction to accelerate implementation. Every milestone has a written PROJECT_RULES scope before code starts; every line that ships, I review and own.

— Section D

The hard parts

Five architectural decisions worth surfacing. Each one is the kind of choice people regret not making earlier.

D1

SaaS-ready single-tenant

Most products that promise “multi-tenant later” end up rewriting from scratch when later arrives. Tenancy is rarely a feature you can add — it touches identity, data, storage, configuration, billing, and reporting all at once. The cheapest way to keep the option open is to design the seams in from day one.

Soul Konect’s business tables have a nullable tenant_id from the first migration. Media storage keys are shaped tenants/{tenant_key}/... even though only one tenant exists today. Brand identity stays in configuration, not domain logic. Queue payloads will carry tenant context the day they need to. When the second daycare onboards, the work is a column flip and a tenant fixture — not a quarter of refactoring. The product stays single-tenant in behaviour and multi-tenant in shape.

D2

Milestone discipline as a forcing function

Soul Konect was built in named, contracted milestones. Milestone 1 (auth, parent register/login, pet profile CRUD). Milestone 2 (pet onboarding details, vaccinations, vet info, care profile). Milestone 3 (booking and check-in/check-out). Milestone 4 (invoicing). Milestone 5 (payments). Each milestone had a written scope inside PROJECT_RULES.md and a list of things explicitly NOT to build yet. The next milestone didn’t start until the previous one was tested, reviewed, and stable.

The list of forbidden work — Razorpay live integration, payment webhooks, separate admin mobile app, video transcoding, push delivery, advanced offline sync, ratings, recipe comments — is as load-bearing as the work itself. Scope creep is the failure mode of every product that ships late. Written scope is the cheapest insurance against it, and a written rulebook gives every contributor (including AI coding agents) the same picture of where the boundary is.

D3

One Expo app, two roles

The lazy path when adding admin-on-mobile is to spin up a second Expo project — admin app for staff, parent app for owners. Two codebases. Two App Store listings. Two release cadences. Two design systems that drift apart by month three.

Soul Konect rejected that path. The current active milestone is explicit: “one mobile app with role-based experiences instead of a separate admin mobile codebase.” Parents and admins share the same Expo Router, the same component library, the same release pipeline. Role-based routing decides which screens render. Half the surface area, full the value, and the design system stays consistent because there is only one of it.

D4

Domain-divided services, queue-first side effects

The Laravel API is organized into nine domain modules: Identity and Access, Owners and Pets, Documents and Vaccines, Meet and Greet, Bookings and Capacity, Check-in/Check-out, Payments and Invoices, Notifications, and Admin Reporting. Each module has its own controllers, FormRequests, services, models, policies, and tests. Controllers are deliberately thin — validation in FormRequests, business logic in services, persistence in models, authorization in policies.

Everything that doesn’t have to be synchronous goes through a Redis-backed Laravel queue: push notifications, invoice generation, payment webhook reconciliation, document processing, operational reminders. The result is a request lifecycle that stays predictable for the user and a side-effect lifecycle that’s restartable when something fails. The dispatcher is the same whether the side effect is a notification or an invoice.

D5

Media architecture for sensitive documents

Vaccine certificates, consent forms, and pet incident records are not generic file uploads. They’re regulated records that need access control closer to financial data than to user avatars. A single overshare here costs trust in a way a missed booking never would.

Soul Konect routes media through a three-service architecture: MediaUploadService handles the upload contract and validation, MediaPathService computes tenant-shaped storage paths (tenants/{tenant_key}/pets/{pet_id}/...), and MediaAccessService issues signed Cloudflare R2 URLs scoped to authenticated, authorized requests. The implementation enforces tenant isolation at the storage layer even before the database row-level scope catches it. The default state is safe: a developer cannot expose another tenant’s documents without explicitly forging both an auth context and a tenant key.

— Section E

Architecture

CLIENTS Expo Mobile parent + admin (one codebase) React Admin staff operations portal Public Website marketing + onboarding API Laravel API 9 domain modules � Redis queues � JWT auth � REST SERVICES PostgreSQL primary data store Redis queues � jobs Cloudflare R2 media � signed URLs Firebase push notifications Razorpay payments � invoices
Expo mobile, React admin, and the public website all talk to the same Laravel API. Postgres for state, Redis for queues, Cloudflare R2 for media, Razorpay for payments, Firebase for push.
  • Identity & Access

  • Owners & Pets

  • Documents & Vaccines

  • Meet & Greet

  • Bookings & Capacity

  • Check-in / Check-out

  • Payments & Invoices

    first candidate for extraction

  • Notifications

  • Admin Reporting

Nine domain modules with their own controllers, services, models, and policies. Payments carries the largest external dependency surface.

— Section F

Stack

Backend
Laravel (API-only) · PHP · PostgreSQL · Redis · Laravel Sanctum · Laravel queues · API Resources
Admin
React · TypeScript · Vite · React Router · TanStack Query · Axios · Tailwind CSS
Mobile
Expo · React Native · Expo Router · React Hook Form · Zod
Infrastructure
AWS EC2 (Ubuntu) · Nginx · Cloudflare R2 (media) · Firebase Cloud Messaging (push) · Razorpay (payments)

— Section G

What shipped

Pre-launch, with the full operational backbone built and tested across all three platforms.

  • — Backend milestones 1–5 complete: auth, pet onboarding (profile, vaccinations, vet, care profile, admin info requests, onboarding summary), bookings and check-in/check-out foundation, invoicing foundation, payment foundation.
  • — Mobile parent milestones 1–3 complete: foundation, parent UX hardening for real-device testing, enterprise UX redesign.
  • — Admin portal milestones 1–2 complete: portal foundation, admin UX hardening.
  • — Public website foundation complete.
  • — Currently shipping: shared mobile access for parent and admin users via role-based routing — one Expo codebase, two roles.
  • — Domain coverage: identity, owners and pets, documents and vaccines, meet and greet, bookings and capacity, check-in/check-out, invoices, payments, media (R2), notifications, admin reporting.
  • — SaaS readiness: nullable tenant_id on business tables, tenant-shaped storage keys, brand identity in configuration not in domain logic.

Not yet shipped (explicitly out of scope per PROJECT_RULES.md): Razorpay live integration, payment webhooks, separate admin mobile app, CMS-driven public website, push notification delivery, advanced offline sync, video transcoding, recipe comments and ratings, booking checkout. Each one is a sequencing decision, not an unsolved problem.

Building an operations platform with this shape — multi-platform, milestone-disciplined, SaaS-ready, with a written rulebook?

Let’s talk.

Book a call →