"It started with a sale that should never have been lost."
Inspiration
Luis Reyes, owner of a custom software development company and a cloud specialist. Gian Castro, engineer, analyst and data scientist. Johan Burgos, a developer with more than seven years of building technology. Three people with jobs, with commitments, with lives that don't pause. And all three with the same question: why not us?
The initial answer wasn't "let's transform the textile industry." It was something more honest: we want to enter a real competition, try to win, and learn what you only learn by competing. Trama started as a bet, not a master plan.
Then Fibrax happened.
Fibrax is a textile distributor based in Barranquilla, Colombia, with commercial presence across the country and roughly 300 active clients. When we sat down with them to understand their operation, what we found wasn't the generic problem of a company that "needs to digitize." It was something far more concrete, more urgent, and more painful.
Fibrax has sales representatives spread across Colombia. When a rep is standing in front of a client, he offers fabrics from memory: the designs he remembers seeing, the colors he believes still exist, the meters he assumes are left. Not because he's careless, but because there was no fast way to know, in real time, what was actually available in the warehouse. The rep sells on assumptions.
The order reaches the office. The administrative team checks it against real inventory — recorded in a platform so old that replacing it had become a declared emergency — and discovers that one, several, or all of the designs aren't available. Then someone has to call the client. Explain. Offer a partial sale. And in the worst case, the client doesn't come back. Or worse: they find another supplier who sells them everything, complete, in a single call.
With 300 clients at stake, losing sales for lack of visibility isn't a minor operational issue. It's a silent business leak that happens every single day.
And there was a second problem, quieter and more expensive: every fabric roll arrives with a nominal length on the invoice (50m), but almost never measures exactly that. Across thousands of rolls a year, the difference accumulates into inventory that exists on paper but not in the warehouse — inventory that Colombia's tax authority (DIAN) expects Fibrax to pay taxes on. Our estimate with them: on the order of COP 100 million a year in phantom tax exposure.
That was the moment the hackathon bet turned into something else. This was a real problem that goes beyond Fibrax — it exists in every textile distributor in the country. That's where Trama became a serious project.
What it does
Trama is a multi-tenant B2B SaaS platform built specifically for textile distributors in Latin America. It replaces the fragmented combination of obsolete systems, WhatsApp groups and manual processes that most distributors run on today.
At its core, Trama manages the complete lifecycle of a fabric roll: from the moment it leaves a supplier's warehouse to the moment it's sold and dispatched.
- Pre-Arrival — When a container is in transit, AI automatically reconciles the supplier's packing list against the commercial invoice. Every discrepancy surfaces before the container is opened. This module directly attacks the phantom-inventory problem.
- Warehouse Control — Every roll is inspected, graded by quality (A or B) and labeled with a unique code. From that moment on, each roll has a digital identity.
- Stock & Rolls — Real-time visibility for the entire sales team, wherever they are in the country. No phone calls. No assumptions.
- Reservations & Dispatch — A rep reserves a roll, the warehouse confirms it exists, and dispatch is recorded with full traceability.
- WhatsApp Agent — Running on Gemini 2.5 Flash Lite, the agent understands natural-language queries — "how many meters of Roma Plus do we have available?" — and answers with live inventory data, directly inside the chat the team already uses. A rep can create a full reservation over WhatsApp without ever opening the platform.
Every decision the agent makes is written to a table called agent_log, creating a complete audit trail of AI-executed actions in production.
How we built it
We started with Python. Then we threw it out.
But before the stack, the team.
Luis, Gian and Johan were the three technical co-founders. They had the skills. What they didn't have was someone keeping the chaos organized while everyone ran in parallel with their day jobs. That's when Najem Nabhan joined: technology enthusiast, product-minded, and willing to take on the challenge not as a distant PM but as a fourth builder who understands every decision the team makes.
Four people. Four day jobs. One product to build at night.
Since June 2026, the team met on a fixed schedule: Saturdays, 9pm to 5am. Snacks on the desk, screens on, Linear open, team chat live. During the week, two late-night hours — 10pm to midnight — were the baseline rhythm.
Validation sessions with Fibrax happened on weekday afternoons, 1pm to 4pm — exactly when every team member had commitments to their employers. Gian ended up attending his own work meetings virtually while physically standing in Fibrax's offices. Not as an exception: as a constant.
On the technical side, the most important decision wasn't choosing the stack — it was abandoning the first one. For the first weeks the backend ran on FastAPI and Python. But the complexity of the domain made it clear that a unified team needed a single language across the entire monorepo.
Decision D-001 in our formal architecture record: migrate to NestJS and TypeScript end to end. It cost a sprint. It saved months.
The stack in production today: Next.js · NestJS · TypeScript · Drizzle ORM · PostgreSQL on Google Cloud SQL · Google Cloud Storage · Google Cloud Run across three environments (Dev, QA, Production) with CI/CD automated by semantic tag, Docker images in Artifact Registry, and Workload Identity so the pipeline authenticates to GCP without static credentials.
AI is integrated into two real flows: WhatsApp intent classification (Gemini determines whether the rep is asking about stock, creating a reservation, or making a general query) and structured extraction from supplier PDFs (Gemini reads packing lists and invoices, extracts data roll by roll, and feeds the Pre-Arrival reconciliation engine).
The data model has 29 tables across 9 architectural layers. Every decision from D-001 to D-012 is documented in the team's knowledge base.
Challenges we ran into
The hardest problems were never the ones we anticipated.
We almost died from the wrong prices. One of the team's first real crises wasn't technical — it was financial. Our initial cost estimates for the Fibrax deployment didn't sustain the operation. We had to recalculate the cost structure from scratch and redefine the model before there was a signed agreement.
Fibrax had no way to pay on foreign platforms. Getting the client able to pay us through Stripe turned out to be an unexpected obstacle. Solving the collection logistics took weeks and required creativity.
The PDF problem. Supplier invoices are frequently scanned documents — images disguised as PDFs. We had to build a preprocessing layer to detect document quality and handle extraction failures without breaking a reconciliation the warehouse team was waiting on.
Gemini quota limits in production. Concurrent requests while reconciling a full container hit rate limits we hadn't projected. We redesigned the pipeline to process in controlled batches with exponential backoff.
FIFO with fabric. The same design can carry three different purchase prices across three different containers, each with rolls of different lengths. FIFO valuation in this context forced us to redesign the costing layer twice before it matched what the accountant expected.
Building with a real client, on their real time. Angie, the key Fibrax user in the warehouse, doesn't have scheduled hours to test software: she has containers to open and orders to dispatch. Every validation session had to count.
Accomplishments that we're proud of
We shipped a product. A real one.
Not a demo. Not a staging environment with synthetic data. Fibrax is using Trama in production: real inventory, real rolls, real sales team. A Colombian textile distributor replaced its obsolete system with a platform that gives its nationwide sales force real-time inventory visibility, and a WhatsApp agent its team actually uses.
The Pre-Arrival module is processing real containers and catching real discrepancies. The tax exposure that started this whole project is being resolved, roll by roll.
We went from zero to a production-ready multi-tenant SaaS in under three months, with a team that never stopped holding day jobs, that built at night and on Saturdays, and that found a way through every obstacle without pausing.
- The architecture is documented in 12 formal decision records
- The AI agent logs every decision it makes
- The deployment pipeline runs automatically on every versioned release
- Gemini is at the center — not as a feature bolted on at the end to qualify for a prize, but as the operating brain of two flows the product cannot function without
What we learned
We learned that the domain always wins.
You can have the best architecture, the cleanest code, the most powerful AI model — and none of it matters if you don't deeply understand the physical reality of a fabric roll moving through a warehouse. We spent more time on the floor of Fibrax's warehouse, watching Angie open boxes and stick labels, than reading documentation. That time was not wasted.
We learned that TypeScript monorepos and multi-tenancy don't forgive shortcuts. Every assumption about data isolation, role boundaries and permission inheritance eventually showed up as a production bug. Our RBAC architecture went through three major revisions before it correctly reflected how a textile business actually operates.
We learned what Gemini is genuinely good at — and where it needs help. Structured extraction from clean PDFs: exceptional. Ambiguous natural language in Colombian Spanish with textile slang: surprisingly good. Scanned documents with inconsistent quality: needs a preprocessor, not more prompting.
We learned that business models get calculated twice: once before talking to the client, and once after reality corrects them. The first version almost cost us the project.
And we learned that building for Latin American SMBs means building for people who will never read a user manual. Every interaction — from the warehouse label to the WhatsApp reply — had to be obvious on first contact.
What's next for Trama
Fibrax's problem is not exclusive to Fibrax.
Across Latin America, thousands of textile distributors run their operations on obsolete systems, WhatsApp threads and institutional memory. The sales force sells without knowing what's in stock. Compliance risk stays invisible until it isn't.
Trama's next step is a second client — already in preliminary conversation — to prove the multi-tenant architecture works not just technically, but commercially.
Beyond client growth, the roadmap is driven by what Fibrax itself told us they still need:
- Electronic invoicing integrated with the DIAN regulatory framework
- Role-based reporting — the warehouse lead, the commercial director and the sales rep need completely different views of the same data
- Receivables management to close the loop between sales and collections
The goal isn't to build another ERP. The goal is to build the operating system a Latin American textile distributor actually uses — one that adapts to how they already work, talks to them where they already are, and makes the invisible visible.
Ecosystem & tooling
Trama isn't only the product the client sees. Behind it is an ecosystem of tools, infrastructure and process that lets four people operate with the discipline of a much larger team.
The anchor is tramai.io. The domain is managed in Cloudflare and is the root identity connecting every tool: GitHub, Google Workspace, Notion, Linear, Slack, Stripe, GCP, Cloudflare and Vercel all authenticate under it. If the domain goes down, everything goes down — so it has an explicit owner and proactive renewal monitoring.
Code — GitHub. The Trama-AI-C-Corp organization hosts the main monorepo under decision D-008. A single private repository holds all three product services: apps/web (Next.js), apps/api (NestJS) and apps/whatsapp-agent. Strategy is trunk-based: one main branch, no long-lived branches. Deploys are driven by semantic tags — *-rc triggers QA, vX.Y.Z triggers Production.
Infrastructure — Google Cloud Platform. All production infrastructure runs on GCP, managed as code through the deploy.yml pipeline in GitHub Actions. Choosing Cloud Run over VMs or Kubernetes was deliberate (D-002): serverless, scale to zero, no infra management — the right model for an early-stage startup.
- Cloud Run — three independent services (api, web, whatsapp-agent) with separate instances per environment
- Cloud SQL — PostgreSQL, dedicated instance per environment. ACID transactions are required for FIFO, concurrent reservations and multi-tenant isolation
- Cloud Storage — supplier PDFs (packing lists, commercial invoices) that the AI pipeline processes roll by roll
- Artifact Registry — Docker image registry feeding every Cloud Run deploy
- Workload Identity — CI/CD authenticates to GCP without static credentials. The Drizzle migration job runs automatically on every deploy before traffic is served
Documentation — Notion. Notion is Trama's documentary brain, under one non-negotiable rule: if it isn't documented here, it doesn't exist as a process. The workspace spans Company DNA, Operations, People & Onboarding, Product, Engineering, Marketing, Go-to-Market, Legal & Finance, and Strategy & OKRs — including every architecture decision from D-001 to D-012, and notes from every team and client meeting.
Engineering management — Linear. User stories, bugs and spikes live in Linear under the TRA- identifier. At the close of this submission sprint the backlog is past TRA-340. Team rule: every story must exist in Linear (operational) and in Notion (documentary).
Communication — Google Workspace + Slack. Team email runs on Google Workspace under tramai.io. Slack is the daily channel — the workspace where everything from the first bet to the first production deploy was coordinated.
Payments and legal entity — Stripe + Stripe Atlas. Trama AI, Corp. is a Delaware C-Corporation, incorporated on June 4, 2026 through Stripe Atlas. The same platform that formed the entity processes the product's payments — Stripe handles B2B subscriptions across three active plans (Starter $299/mo, Grow $599/mo, Scale $1,199/mo) plus custom Enterprise. The billing webhook runs at api.tramai.io/api/v1/billing/webhook and every Stripe event updates subscription state in real time in the subscriptions table.
WhatsApp agent — Meta Business API. The WhatsApp integration runs through the Meta WhatsApp Business API. Inbound webhooks are registered at api.tramai.io/api/v1/whatsapp/webhook and every incoming message is verified with HMAC-SHA256 before processing. The wa_channels table resolves workspaceId from phone_number_id — the mechanism that makes multi-tenant architecture possible over a single WhatsApp number per environment.
Finance — Xero. Business accounting runs in Xero as the financial source of truth for the legal entity.
Files and context — Google Drive. Drive holds working documents and reference files: real Fibrax invoices and packing lists used to validate the reconciliation engine, CTO technical review reports, the tech stack evaluation, session templates and presentations. Those Fibrax PDFs were the primary source for validating the Gemini pipeline before taking it to production.
To scale this, Trama is open to conversations with investors who see what we see: that Fibrax's problem isn't Colombian or Latin American — it's the same problem hundreds of thousands of distributors face in emerging markets worldwide. The right capital accelerates the path, but the direction is already set.
Trama started as a bet between three people. It became a real product because the problem was real. And it will keep going because an entire industry still operates as if time had stopped.
Built With
- artifact-registry
- docker
- drizzle-orm
- gemini
- gemini-2.5-flash-lite
- github-actions
- google-cloud
- google-cloud-run
- google-cloud-sql
- nestjs
- nextjs
- postgresql
- stripe
- typescript
- whatsapp-business-api


Log in or sign up for Devpost to join the conversation.