All Posts
App Development 15 min read

Architecture Decisions That Make or Break a Base44 App Build: Lessons from 15 Live Products

After shipping 15+ production apps on Base44, we've learned exactly which architecture decisions in the first 48 hours define the quality ceiling of the final product. Entity design, RLS, backend function structure, and frontend patterns — here's what we've learned.

Lloyd Collingham·15 May 2026
Architecture Decisions That Make or Break a Base44 App Build: Lessons from 15 Live Products

The 14-Day Constraint Forces Good Engineering

When you commit to a 14-day build cycle, you can't afford architectural debt. Every shortcut taken in the first 48 hours costs double in days 10–14. Here's what we've learned building 15+ live products on Base44.

1. Entity Design Is Everything

Weak entity design is the #1 cause of failed builds. Get it wrong and you'll be fighting your own data model for the remainder of the project.

Rules We Follow:

Separate concerns ruthlessly. A

User
entity should not carry both authentication data and business-logic state. Create a
UserProfile
or domain-specific entity.

Use enums aggressively. Status fields, category fields, type fields — always enumerate valid values in the schema. This prevents invalid data at the source and makes filtering trivially safe.

Think about RLS (Row-Level Security) from day one. Every entity should have an explicit read/write policy. Default to admin-only for sensitive data, then open up as needed. Retrofitting RLS is painful.

{
  "rls": {
    "read": {
      "$or": [
        { "created_by_id": "{{user.id}}" },
        { "user_condition": { "role": "admin" } }
      ]
    }
  }
}

Avoid deeply nested objects in entity fields. Flat or one-level-deep structures are queryable. Deeply nested JSON is not. Use relationships (separate entities) for complex data.

2. Backend Function Patterns

Every backend function we write follows the same structure:

Deno.serve(async (req) => {
  try {
    const base44 = createClientFromRequest(req);
    const user = await base44.auth.me();
    if (!user) return Response.json({ error: 'Unauthorized' }, { status: 401 });
    
    // business logic here
    
    return Response.json({ success: true, data: result });
  } catch (error) {
    console.error('[functionName]', error.message);
    return Response.json({ error: error.message }, { status: 500 });
  }
});

Key rules:

  • Always log errors with the function name prefix
  • Always validate auth before any data access
  • Use
    base44.asServiceRole
    only when user-scoped access is genuinely insufficient
  • Never store secrets in function code — always use
    Deno.env.get('SECRET_NAME')

3. Frontend Performance Patterns

Use TanStack Query for all entity data. Manual

useState
+
useEffect
patterns don't cache, don't deduplicate requests, and don't handle loading/error states cleanly. TanStack Query does all three.

Component size limit: 200 lines. If a component exceeds this, it's doing too much. Break it down. A

Dashboard
page should be 5–10 small components, not 400 lines of JSX.

Lazy load heavy pages. Any page not on the critical path should be

React.lazy()
loaded. This keeps initial bundle size small.

4. The Staging Discipline

We run every build with a dev/prod data separation discipline:

  • Dev entities for sample/test data
  • Production entities only populated when features are complete
  • No testing against live data during build sprint

5. What Kills a Build in the Final Days

  1. Scope creep after day 7. The brief is locked after the architecture call. Additional features go on a post-launch backlog.
  2. Missing RLS discovered late. An admin dashboard feature that accidentally exposes user data to all users.
  3. Integration credentials not provided. If you need an API key from the client, get it by day 2.
  4. Design system inconsistency. Starting with ad-hoc Tailwind classes instead of a design token system means the UI looks inconsistent in the final third.

The Result

Following these disciplines, we've maintained a 100% on-time delivery rate across 15 builds, with zero post-launch critical bugs in the first 30 days.

Base44App ArchitectureEntity DesignRLSBackend FunctionsEngineering

RELATED WORK

Case Studies