Skip to main content

Overview

The orders collection stores all customer orders from web purchases, including payment details, shipping information, and order status tracking.

Collection Path

orders/{orderId}

Document Schema

Order Document
object

Example Document

{
  "source": "TIENDA_WEB",
  "createdAt": "2026-03-05T14:30:00Z",
  "updatedAt": "2026-03-05T16:45:00Z",
  
  "userId": "firebase-user-uid-123",
  "userEmail": "[email protected]",
  "userName": "Juan Pérez",
  "phone": "3001234567",
  "clientDoc": "1234567890",
  
  "shippingData": {
    "address": "Calle 123 #45-67 Apto 301",
    "city": "Bogotá",
    "department": "Cundinamarca",
    "phone": "3001234567"
  },
  
  "billingData": null,
  "requiresInvoice": false,
  
  "items": [
    {
      "id": "prod-abc123",
      "name": "iPhone 14 Pro",
      "price": 4500000,
      "quantity": 1,
      "color": "negro",
      "capacity": "256GB",
      "mainImage": "https://storage.googleapis.com/pixeltech/iphone14pro.jpg"
    }
  ],
  
  "subtotal": 4500000,
  "shippingCost": 15000,
  "total": 4515000,
  
  "status": "PAGADO",
  "statusDetail": null,
  
  "paymentMethod": "MERCADOPAGO",
  "paymentStatus": "PAID",
  "paymentId": "mp-123456789",
  "paymentAccountId": "acc-xyz789",
  "paymentMethodName": "MercadoPago",
  
  "isStockDeducted": true,
  
  "carrier": "Servientrega",
  "trackingNumber": "1234567890",
  
  "confirmationEmailSent": true,
  "dispatchEmailSent": true,
  
  "notes": "Entregar en recepción"
}

Queries

Get User’s Orders

const snapshot = await db.collection('orders')
    .where('userId', '==', userId)
    .orderBy('createdAt', 'desc')
    .get();

Get Pending Fulfillment Orders

const snapshot = await db.collection('orders')
    .where('status', '==', 'PAGADO')
    .orderBy('createdAt', 'asc')
    .get();

Get Orders Awaiting Payment

const snapshot = await db.collection('orders')
    .where('status', '==', 'PENDIENTE_PAGO')
    .where('createdAt', '>', thirtyMinutesAgo)
    .get();

Get Shipped Orders

const snapshot = await db.collection('orders')
    .where('status', 'in', ['DESPACHADO', 'EN_RUTA'])
    .where('trackingNumber', '!=', null)
    .get();

Get Orders by Payment Method

const snapshot = await db.collection('orders')
    .where('paymentMethod', '==', 'MERCADOPAGO')
    .where('paymentStatus', '==', 'PAID')
    .get();

Get Revenue by Date Range

const snapshot = await db.collection('orders')
    .where('paymentStatus', '==', 'PAID')
    .where('createdAt', '>=', startDate)
    .where('createdAt', '<=', endDate)
    .get();

const totalRevenue = snapshot.docs.reduce((sum, doc) => 
    sum + (doc.data().total || 0), 0
);

Order Lifecycle

Online Payment Flow

1

Order Created

Status: PENDIENTE_PAGO, isStockDeducted: false
2

Payment Confirmed (Webhook)

Status: PAGADO, inventory deducted, remission created
3

Order Shipped

Status: DESPACHADO, tracking number added
4

Order Delivered

Status: ENTREGADO

Cash on Delivery Flow

1

Order Created

Status: PENDIENTE, inventory deducted immediately
2

Payment Confirmed Manually

Admin marks as PAGADO
3

Order Shipped

Status: DESPACHADO
4

Order Delivered

Status: ENTREGADO

Security Rules

Recommended Firestore security rules:
match /orders/{orderId} {
  // Users can read their own orders
  allow read: if request.auth != null && 
              resource.data.userId == request.auth.uid;
  
  // Only admins can update orders
  allow update: if request.auth != null &&
                get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == 'admin';
  
  // Orders created via Cloud Functions only
  allow create: if false;
  allow delete: if false;
}

Indexes

Required composite indexes:
// User orders sorted by date
orders: [userId ASC, createdAt DESC]

// Pending orders
orders: [status ASC, createdAt ASC]

// Payment tracking
orders: [paymentMethod ASC, paymentStatus ASC, createdAt DESC]

// Old order cleanup
orders: [status ASC, createdAt ASC]

// Abandoned payment detection
orders: [status ASC, createdAt ASC, paymentStatus ASC]

Build docs developers (and LLMs) love