Tips > Data, APIs & Webhooks

Set Up a Development Instance with Mock Data

Never test against production APIs when you can avoid it.

TipIntermediate2 min read

Never test against production APIs when you can avoid it. Run a separate n8n development instance that uses mock data, test credentials, and sandbox API endpoints. This eliminates accidental production side effects and keeps test costs at zero.

Real-world example: Your team builds workflows that interact with Stripe, SendGrid, and Salesforce. Testing against production risks sending real emails, charging real cards, and polluting CRM data.


# docker-compose.dev.yml -- Development n8n instance

version: '3.8'
services:
  n8n-dev:
    image: n8nio/n8n:latest
    ports:
      - "5679:5678"    # Different port from production

    environment:
      - N8N_HOST=localhost
      - N8N_PORT=5678
      - N8N_PROTOCOL=http
      - WEBHOOK_URL=http://localhost:5679/
      - NODE_ENV=development
      # Use sandbox/test API keys

      - STRIPE_API_KEY=sk_test_xxxxxxxxxxxx
      - SENDGRID_API_KEY=SG.test_xxxxxxxxxxxx
    volumes:
      - n8n_dev_data:/home/node/.n8n
```text
Create mock API endpoints using a simple n8n workflow on the dev instance:

```javascript
// Code node in a "Mock API" workflow
// Webhook path: mock/stripe/charges
const mockResponses = {
  'charges': {
    id: 'ch_mock_' + Date.now(),
    amount: 2000,
    currency: 'usd',
    status: 'succeeded',
    created: Math.floor(Date.now() / 1000)
  },
  'customers': {
    id: 'cus_mock_' + Date.now(),
    email: 'test@example.com',
    name: 'Test Customer'
  }
};

const resource = $input.first().json.params.resource || 'charges';
return [{
  json: mockResponses[resource] || { error: 'Unknown resource' }
}];
```text
```yaml
Credential management strategy:
  Production instance:
    - Real API keys stored in n8n credentials
    - Workflows activated and processing live data

  Development instance:
    - Test/sandbox API keys only
    - Mock workflows for services without sandboxes
    - All workflows default to inactive
    - Pinned test data for common scenarios
```text
> **Tip: Use n8n's environment variable credentials**
>
> Store API keys as environment variables (`STRIPE_API_KEY`, etc.) and reference them in credentials. Switching between dev and prod is then just a matter of which environment file is loaded -- the workflows themselves do not change.

This prevents the "I accidentally emailed 10,000 customers from my test workflow" disaster.

**Related:** [Use Structured Output (JSON Mode) for Parseable Responses](../ai-and-llm-integration/01-use-structured-output-json-mode-for-parseable-responses.md) | [Configure Payload Size and Binary Data Mode for Large Files](../performance-and-large-files/01-configure-payload-size-and-binary-data-mode-for-large-files.md)

Want this running in your stack?

I build production n8n and Cloudflare automation for teams — the same engineering behind HarperFlow. Fixed-price, escrow-protected, US-based.