Tenant Demos

Pre-generated demo environments for customer presentations, sales demos, and training

What are Tenant Demos?

Tenant Demos are isolated demo environments with pre-generated AI data that provide instant, consistent responses without consuming AI tokens during presentations. Perfect for customer demos, sales calls, trade shows, and training where stable, realistic data is required.

Key Features

  • Pre-Generated Data - AI generates all data before your demo starts
  • Zero Token Usage - No AI tokens consumed during presentations
  • Instant Responses - Sub-100ms response times, always
  • Custom Instructions - Customer-specific, localized, or industry-specific data
  • Isolated Environments - Each demo has its own independent data
  • Full CRUD Support - Collections support create, update, delete operations
  • Dedicated API Key - Simple SDK configuration with sym_demo_xxx key

Why Use Tenant Demos?

Traditional Mock Data Problems

  • 🔴 Data regenerates on each request (inconsistent)
  • 🔴 Uses AI tokens during live demos
  • 🔴 2-10 second latency from real-time generation
  • 🔴 Same generic data for all customers
  • 🔴 Risk of generation failures during presentation
  • 🔴 Cannot rehearse with exact same data

Tenant Demos Solution

  • ✅ Pre-generated, consistent data
  • ✅ Zero AI tokens during demos
  • ✅ Instant response times (<100ms)
  • ✅ Custom data per customer/demo
  • ✅ Production-realistic experience
  • ✅ Rehearse with exact data you'll present

Creating a Tenant Demo

Tenant demos are created and managed via the Platform UI at platform.symulate.dev/dashboard/demos.

No CLI Commands

Tenant demos are created and managed exclusively through the Platform UI. There are no CLI commands for demo management.

Step-by-Step Guide

1

Navigate to Platform UI

2

Configure Demo Details

  • Name: e.g., "Customer Demo - ACME Corp"
  • Description: Optional context about the demo
  • General Instruction: Custom instruction that applies to all data (optional)
  • Expiration Date: Optional auto-deletion date for time-limited demos
3

Select Collections & Endpoints

  • • Check collections to include (e.g., products, users, orders)
  • • Check endpoints to include (e.g., GET /api/stats, GET /api/dashboard)
  • • Add collection-specific custom instructions (optional)
  • • Add endpoint-specific custom instructions (optional)
4

Generate Data

  • • Click "Generate Data" to start background job
  • • Monitor progress in the Jobs tab
  • • Receive email notification when complete
  • • Generation typically takes 2-10 minutes depending on data volume
5

Get Demo API Key

  • • Click "View API Key" button on your demo
  • • Copy the demo API key (format: sym_demo_xxx)
  • • Key never expires unless demo is deleted

Using Demos in Your SDK

Once you have a demo API key, configure your SDK to use the pre-generated demo data:

import { configureSymulate } from '@symulate/sdk';

// Configure SDK with demo API key
configureSymulate({
  demoApiKey: 'sym_demo_abc123xyz789def456ghi', // From Platform UI
  projectId: 'proj_xxx', // Still required for routing
});

// All calls now use pre-generated demo data
const products = await getProducts();       // ✓ Instant response, pre-generated
const users = await userCollection.list();  // ✓ Pre-generated users
const stats = await getStats();            // ✓ Zero tokens consumed

Demo API Key Behavior

When demoApiKey is configured:

Collections:

  • list() - Returns pre-generated items
  • get(id) - Fetches from demo data
  • create() - Adds to demo data
  • update() - Modifies demo data
  • delete() - Removes from demo data

Endpoints:

  • • All calls return pre-generated responses
  • • No real-time AI generation
  • • No network calls to backend
  • • Instant responses (<100ms)

Switching Between Development and Demo Mode

You can easily switch between development and demo modes using environment variables:

// Use environment variables for dynamic switching
const isDemoMode = process.env.DEMO_MODE === 'true';

configureSymulate(
  isDemoMode
    ? {
        // Demo mode - use pre-generated data
        demoApiKey: process.env.DEMO_API_KEY,
        projectId: process.env.PROJECT_ID,
      }
    : {
        // Development mode - generate data on-demand
        symulateApiKey: process.env.SYMULATE_API_KEY,
        projectId: process.env.PROJECT_ID,
        environment: 'development',
      }
);

Custom Instructions Hierarchy

Tenant demos support a three-level custom instruction hierarchy for maximum flexibility in generating customer-specific, localized, or industry-specific data.

1

General Instruction (Demo-Wide)

Applies to ALL collections and endpoints in the demo. Set when creating the demo.

Example:

"German automotive industry, luxury vehicles, Munich headquarters, engineering focus"

Effect: All data (products, users, orders, endpoints) uses this context unless overridden

2

Collection-Specific Instruction

Overrides general instruction for a specific collection. Set via Platform UI.

Example for "products" collection:

General: "German automotive industry, luxury vehicles"

Override: "Premium German car parts: BMWs, Mercedes, Audis, high-end accessories, OEM quality"

Effect: Products collection uses specific instruction, while users/orders still use general

3

Endpoint-Specific Instruction

Overrides both general and collection instructions for a specific endpoint. Set via Platform UI.

Example for GET /api/dashboard/stats:

Collection: "Premium German car parts"

Override: "Show exceptional Q4 2024 sales growth: 45% YoY, 500+ new enterprise customers, record revenue"

Effect: Only this endpoint shows exceptional growth narrative, others use their respective instructions

Instruction Priority

More specific instructions always override less specific ones:

Endpoint-Specific > Collection-Specific > General

Managing Demos

All demo management is done through the Platform UI at platform.symulate.dev/dashboard/demos:

View Demos

Dashboard → Demos to see all your demo environments

View API Key

Click "View API Key" button to see and copy your demo API key

Regenerate Data

Click refresh icon to trigger re-generation with updated instructions

Delete Demo

Click delete icon to permanently remove demo (cannot be undone)

Monitor Jobs

Dashboard → Demos → Jobs tab to see generation progress and status

Edit Configuration

Update name, description, instructions, and selected collections/endpoints

Data Replacement Warning

Re-generation replaces ALL existing demo data. This operation cannot be undone. Any manual changes or CRUD operations performed in the demo will be lost.

Use Cases

Customer Demos

Create customer-specific demos with their industry data, branding, and use cases.

// Demo for automotive client
configureSymulate({
  demoApiKey: 'sym_demo_automotive_xyz',
});
// Shows automotive-specific data

Sales Presentations

Different data for each prospect, tailored to their business context.

// Demo A: E-commerce retailer
configureSymulate({
  demoApiKey: 'sym_demo_retailer_abc'
});

// Demo B: Healthcare provider
configureSymulate({
  demoApiKey: 'sym_demo_healthcare_def'
});

Trade Shows

Pre-loaded demos that work reliably even without stable internet.

// Pre-loaded demo for CES 2025
configureSymulate({
  demoApiKey: 'sym_demo_tradeshow_2025',
  // All data pre-generated
});

Training & Onboarding

Safe environment for new users to practice without affecting real data.

// Training environment
configureSymulate({
  demoApiKey: 'sym_demo_training_env',
  // Users can CRUD freely
});

Best Practices

✅ Do This

  • Use descriptive names - "ACME Corp Demo - Q1 2024" instead of "Demo 1"
  • Be specific with instructions - "German automotive industry, BMW dealership, Munich location, luxury car parts" instead of "automotive data"
  • Test before presentation - Verify all data looks correct before the actual demo
  • Create separate demos per customer - Don't reuse the same demo for different customers
  • Set expiration dates - For time-limited demos (conferences, temporary trials)
  • Rehearse with exact data - Use the demo environment for practice runs
  • Monitor generation jobs - Check status before your presentation to ensure data is ready

❌ Avoid This

  • Don't use vague instructions - "Generate some data" won't create compelling demos
  • Don't regenerate right before presentations - Give yourself time to review the new data
  • Don't share demo API keys publicly - Treat them like production credentials
  • Don't rely on CRUD changes persisting - Re-generation will wipe all manual changes
  • Don't expect real-time updates - Demo data is static until manually regenerated
  • Don't use for actual development - Demos are for presentation only

Complete Examples

Example 1: Customer-Specific B2B Demo

1. Create Demo in Platform UI

  • • Name: "Demo - Toyota Germany"
  • • Description: "B2B demo for Toyota dealership network in Germany"
  • • General Instruction: "German automotive industry, Toyota vehicles and parts, dealership network in Germany, B2B customers"
  • • Collections: products ✓, users ✓, orders ✓
  • • Endpoints: GET /api/dashboard ✓, GET /api/stats ✓

2. Configure Custom Instructions (Optional)

  • • Products collection: "Toyota OEM parts and accessories, genuine parts focus"
  • • GET /api/stats: "Show strong Q4 2024 performance, 30% growth in parts sales"

3. Generate Data & Get API Key

After generation completes, copy: sym_demo_toyota_germany_xxx

4. Use in Your Application

// Configure SDK
configureSymulate({
  demoApiKey: 'sym_demo_toyota_germany_xxx',
  projectId: 'proj_xxx',
});

// Define your collections/endpoints
const products = defineCollection({
  name: 'products',
  basePath: '/api/products',
  schema: m.object({
    id: m.uuid(),
    name: m.string(),
    price: m.number(),
    manufacturer: m.string(),
  }),
});

const getStats = defineEndpoint({
  path: '/api/stats',
  method: 'GET',
  schema: m.object({
    revenue: m.number(),
    orders: m.number(),
    growth: m.number(),
  }),
});

// Use in your demo
async function runDemo() {
  // All data is pre-generated and Toyota-specific
  const { data: productList } = await products.list();
  console.log(`Products: ${productList.length} Toyota parts`);

  const stats = await getStats();
  console.log(`Q4 Growth: ${stats.growth}%`);

  // CRUD operations work in isolated demo
  await products.create({
    name: "Demo Part",
    price: 99.99,
    manufacturer: "Toyota"
  });
}

Example 2: Multi-Region Demos

// Create separate demos for different regions via Platform UI:
// 1. "Demo - APAC Region" with instruction: "Japanese and Chinese customers, Tokyo/Beijing"
// 2. "Demo - EMEA Region" with instruction: "European customers, German/French, Berlin/Paris"
// 3. "Demo - NA Region" with instruction: "North American customers, US/Canada, New York/Toronto"

// Switch between regions dynamically
const region = process.env.DEMO_REGION || 'NA';

const apiKeys = {
  APAC: 'sym_demo_apac_xxx',
  EMEA: 'sym_demo_emea_xxx',
  NA: 'sym_demo_na_xxx',
};

configureSymulate({
  demoApiKey: apiKeys[region],
  projectId: 'proj_xxx',
});

// Now all data is region-specific
const users = await userCollection.list(); // Returns region-appropriate names/addresses