Skip to main content

Deployment Guide

Complete guide for deploying your application with Resonance SDK integration to production.


Overview​

This guide covers deploying your application (not Resonance infrastructure) to popular platforms. Resonance services are already deployed and managed by us - you just need to integrate the SDK into your app.

What You're Deploying:

  • Your website/application with Resonance SDK integrated
  • No Resonance infrastructure setup required
  • No Privy account needed (handled by Resonance)
  • Just add the SDK script tag and configure your Brand ID

Supported Platforms:

  • ✅ Vercel (Recommended for React/Next.js)
  • ✅ Netlify (Recommended for static sites)
  • ✅ AWS (EC2, Lambda, Amplify)
  • ✅ Digital Ocean
  • ✅ Heroku
  • ✅ Docker/Kubernetes
  • ✅ Any platform that serves HTML/JavaScript

Pre-Deployment Checklist​

Before deploying, ensure:

  • ✅ Brand ID obtained from Partner Portal
  • ✅ SDK script tag added to your HTML
  • ✅ Brand ID configured (environment variable or hardcoded)
  • ✅ SDK tested locally
  • ✅ Event tracking tested
  • ✅ Events configured in Partner Portal → Automation
  • ✅ Production domain added (if using DNS-based detection)

Environment Variables​

Required Variables​

Only one variable is required:

# Your Resonance Brand ID (get from Partner Portal)
RESONANCE_BRAND_ID=your_brand_id

Or use framework-specific prefixes:

# React (Create React App)
REACT_APP_RESONANCE_BRAND_ID=your_brand_id

# Vite/Next.js
VITE_RESONANCE_BRAND_ID=your_brand_id
NEXT_PUBLIC_RESONANCE_BRAND_ID=your_brand_id

Optional Variables​

# Override default API URL (usually not needed)
RESONANCE_API_URL=https://api.rsnc.network

# Override gas relayer URL (usually not needed)
RESONANCE_GAS_RELAYER_URL=https://relayer.rsnc.network

Note: Privy, Supabase, and blockchain configuration are handled by Resonance - you don't need to configure these.


Vercel Deployment​

For React/Next.js Apps​

1. Install Vercel CLI:

npm install -g vercel

2. Create vercel.json (optional):

{
"buildCommand": "npm run build",
"outputDirectory": "dist"
}

Note: Environment variables are set in Vercel Dashboard, not in vercel.json (for security).

3. Set Environment Variables:

# Via CLI
vercel env add REACT_APP_RESONANCE_BRAND_ID
# Enter your Brand ID when prompted

# Or via Vercel Dashboard
# Project Settings → Environment Variables
# Add: REACT_APP_RESONANCE_BRAND_ID = your_brand_id

4. Deploy:

# Preview deployment
vercel

# Production deployment
vercel --prod

5. Custom Domain:

# Add domain
vercel domains add yourdomain.com

# Configure DNS
# Add CNAME record: www → cname.vercel-dns.com
# Add A record: @ → 76.76.21.21

For Next.js API Routes​

Optional: Backend API Route for Manual Event Tracking

If you need to track events from your backend (server-side), create an API route:

pages/api/track-event.js:

export default async function handler(req, res) {
if (req.method !== 'POST') {
return res.status(405).json({ error: 'Method not allowed' });
}

const { eventType, userEmail, metadata } = req.body;

try {
const response = await fetch(
'https://api.rsnc.network/resonance-api/manual-event',
{
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
brandId: process.env.NEXT_PUBLIC_RESONANCE_BRAND_ID,
eventType,
userEmail,
metadata
})
}
);

const data = await response.json();
res.status(200).json(data);
} catch (error) {
res.status(500).json({ error: error.message });
}
}

Note: Most developers use the SDK directly in the browser - backend API routes are optional.


Netlify Deployment​

For Static Sites​

1. Create netlify.toml:

[build]
command = "npm run build"
publish = "dist"

[build.environment]
REACT_APP_RESONANCE_BRAND_ID = "your_brand_id"

[[redirects]]
from = "/*"
to = "/index.html"
status = 200

2. Set Environment Variables:

# Via Netlify CLI
netlify env:set REACT_APP_RESONANCE_BRAND_ID your_brand_id

# Or via Netlify Dashboard
# Site Settings → Build & Deploy → Environment

3. Deploy:

# Install Netlify CLI
npm install -g netlify-cli

# Deploy
netlify deploy --prod

4. Netlify Functions (Serverless):

netlify/functions/track-event.js:

exports.handler = async (event, context) => {
if (event.httpMethod !== 'POST') {
return {
statusCode: 405,
body: JSON.stringify({ error: 'Method not allowed' })
};
}

const { eventType, userEmail } = JSON.parse(event.body);

try {
const response = await fetch(
`${process.env.RESONANCE_API_URL}/resonance-api/manual-event`,
{
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
brandId: process.env.RESONANCE_BRAND_ID,
eventType,
userEmail
})
}
);

const data = await response.json();

return {
statusCode: 200,
body: JSON.stringify(data)
};
} catch (error) {
return {
statusCode: 500,
body: JSON.stringify({ error: error.message })
};
}
};

AWS Deployment​

AWS Amplify (Frontend)​

1. Install Amplify CLI:

npm install -g @aws-amplify/cli
amplify configure

2. Initialize Amplify:

amplify init

3. Add Environment Variables:

# amplify/backend/amplify-meta.json
{
"providers": {
"awscloudformation": {
"AuthRoleName": "amplify-...",
"Region": "us-east-1"
}
},
"env": {
"REACT_APP_BRAND_ID": "your_brand_id",
"REACT_APP_PRIVY_APP_ID": "your_privy_app_id"
}
}

4. Deploy:

amplify publish

AWS Lambda (Backend)​

handler.js:

exports.trackEvent = async (event) => {
const body = JSON.parse(event.body);
const { eventType, userEmail } = body;

try {
const response = await fetch(
`${process.env.RESONANCE_API_URL}/resonance-api/manual-event`,
{
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
brandId: process.env.RESONANCE_BRAND_ID,
eventType,
userEmail
})
}
);

const data = await response.json();

return {
statusCode: 200,
headers: {
'Access-Control-Allow-Origin': '*',
'Content-Type': 'application/json'
},
body: JSON.stringify(data)
};
} catch (error) {
return {
statusCode: 500,
body: JSON.stringify({ error: error.message })
};
}
};

Deploy with Serverless Framework:

# Install Serverless
npm install -g serverless

# serverless.yml
service: resonance-integration

provider:
name: aws
runtime: nodejs18.x
region: us-east-1
environment:
RESONANCE_BRAND_ID: ${env:RESONANCE_BRAND_ID}
RESONANCE_API_URL: https://api.rsnc.network

functions:
trackEvent:
handler: handler.trackEvent
events:
- http:
path: track-event
method: post
cors: true

# Deploy
serverless deploy

AWS EC2 (Node.js App)​

1. Launch EC2 Instance:

  • Amazon Linux 2 or Ubuntu
  • t2.micro (Free tier eligible)
  • Open ports: 80, 443

2. Install Node.js:

# SSH into EC2
ssh -i your-key.pem ec2-user@your-instance-ip

# Install Node.js
curl -fsSL https://rpm.nodesource.com/setup_18.x | sudo bash -
sudo yum install -y nodejs

# Install PM2
sudo npm install -g pm2

3. Deploy Application:

# Clone your repo
git clone https://github.com/your-username/your-app.git
cd your-app

# Install dependencies
npm install

# Set environment variables
export RESONANCE_BRAND_ID="your_brand_id"
export RESONANCE_API_URL="https://api.rsnc.network"

# Start with PM2
pm2 start server.js --name resonance-app

# Auto-restart on reboot
pm2 startup
pm2 save

4. Configure Nginx:

# Install Nginx
sudo yum install -y nginx

# Configure reverse proxy
sudo nano /etc/nginx/conf.d/app.conf

/etc/nginx/conf.d/app.conf:

server {
listen 80;
server_name yourdomain.com;

location / {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
# Start Nginx
sudo systemctl start nginx
sudo systemctl enable nginx

5. SSL with Let's Encrypt:

# Install Certbot
sudo yum install -y certbot python3-certbot-nginx

# Get certificate
sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com

# Auto-renew
sudo crontab -e
# Add: 0 12 * * * /usr/bin/certbot renew --quiet

Digital Ocean Deployment​

App Platform​

1. Create app.yaml:

name: resonance-app
region: nyc
services:
- name: web
github:
repo: your-username/your-repo
branch: main
build_command: npm run build
run_command: npm start
environment_slug: node-js
envs:
- key: RESONANCE_BRAND_ID
value: your_brand_id
http_port: 3000

2. Deploy:

# Install doctl
brew install doctl # macOS

# Authenticate
doctl auth init

# Create app
doctl apps create --spec app.yaml

# Monitor deployment
doctl apps list

Droplet (VPS)​

Same as AWS EC2 - follow Node.js deployment steps above


Heroku Deployment​

1. Create Procfile:

web: npm start

2. Create package.json scripts:

{
"scripts": {
"start": "node server.js",
"build": "npm run build:client"
}
}

3. Deploy:

# Install Heroku CLI
npm install -g heroku

# Login
heroku login

# Create app
heroku create your-app-name

# Set environment variables
heroku config:set RESONANCE_BRAND_ID=your_brand_id

# Deploy
git push heroku main

# Open app
heroku open

Docker Deployment​

Dockerfile:

FROM node:18-alpine

WORKDIR /app

# Copy package files
COPY package*.json ./

# Install dependencies
RUN npm ci --only=production

# Copy application files
COPY . .

# Build application
RUN npm run build

# Expose port
EXPOSE 3000

# Start application
CMD ["npm", "start"]

docker-compose.yml:

version: '3.8'

services:
app:
build: .
ports:
- "3000:3000"
environment:
- RESONANCE_BRAND_ID=your_brand_id
- NODE_ENV=production
restart: unless-stopped

Deploy:

# Build image
docker build -t resonance-app .

# Run container
docker run -d \
-p 3000:3000 \
-e RESONANCE_BRAND_ID=your_brand_id \
--name resonance-app \
resonance-app

# With docker-compose
docker-compose up -d

Kubernetes Deployment​

deployment.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
name: resonance-app
spec:
replicas: 3
selector:
matchLabels:
app: resonance
template:
metadata:
labels:
app: resonance
spec:
containers:
- name: app
image: your-registry/resonance-app:latest
ports:
- containerPort: 3000
env:
- name: RESONANCE_BRAND_ID
valueFrom:
secretKeyRef:
name: resonance-secrets
key: brand-id
---
apiVersion: v1
kind: Service
metadata:
name: resonance-service
spec:
selector:
app: resonance
ports:
- port: 80
targetPort: 3000
type: LoadBalancer

secrets.yaml:

apiVersion: v1
kind: Secret
metadata:
name: resonance-secrets
type: Opaque
data:
brand-id: base64_encoded_brand_id

Deploy:

# Create secrets
kubectl create secret generic resonance-secrets \
--from-literal=brand-id=your_brand_id

# Apply deployment
kubectl apply -f deployment.yaml

# Check status
kubectl get pods
kubectl get services

Post-Deployment​

1. Verify SDK Integration​

Check Browser Console:

// Open browser console on your deployed site
console.log('Resonance SDK loaded:', typeof ResonanceAutomation !== 'undefined');
// Should output: true

// Check initialization
ResonanceAutomation.init('YOUR_BRAND_ID');

Test Event Tracking:

// In browser console
ResonanceAutomation.track('test_event', {
userEmail: 'test@example.com',
metadata: { source: 'deployment_test' }
});

// Check Partner Portal → Analytics to verify event was received

Verify in Partner Portal:

  1. Go to Partner Portal → Analytics
  2. Look for your test event
  3. Verify event data is correct

2. Monitor Logs​

Vercel:

vercel logs

Netlify:

netlify logs

AWS:

aws logs tail /aws/lambda/your-function --follow

Heroku:

heroku logs --tail

3. Set Up Alerts​

Sentry (Error Tracking):

npm install @sentry/node

# Initialize
Sentry.init({
dsn: process.env.SENTRY_DSN,
environment: process.env.NODE_ENV
});

Datadog (Monitoring):

npm install dd-trace

# Initialize
require('dd-trace').init({
analytics: true
});

SSL/HTTPS​

All platforms automatically provide SSL certificates:

  • ✅ Vercel: Automatic SSL
  • ✅ Netlify: Automatic SSL
  • ✅ AWS Amplify: Automatic SSL
  • ✅ Heroku: Automatic SSL
  • ⚠️ EC2/Droplet: Manual (use Let's Encrypt)

Custom Domains​

Vercel​

vercel domains add yourdomain.com

DNS Configuration:

Type: CNAME
Name: www
Value: cname.vercel-dns.com

Type: A
Name: @
Value: 76.76.21.21

Netlify​

DNS Configuration:

Type: CNAME
Name: www
Value: your-site.netlify.app

Type: A
Name: @
Value: 75.2.60.5

Troubleshooting​

Build Failures​

Check:

  1. Node version matches local
  2. All dependencies in package.json
  3. Build command is correct
  4. Environment variables are set

Environment Variables Not Working​

Check:

  1. Prefix matches framework (REACT_APP_, VITE_, NEXT_PUBLIC_, etc.)
  2. Variables are set in deployment platform dashboard
  3. Rebuild/redeploy after adding variables (most common issue)
  4. Variable names match exactly (case-sensitive)
  5. For client-side: Use public prefix (REACT_APP_, VITE_, NEXT_PUBLIC_)
  6. Check browser console for undefined values

CORS Errors​

Solution:

// Add CORS middleware
app.use((req, res, next) => {
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization');
next();
});

Production Checklist​

Resonance Integration:

  • ✅ Brand ID configured as environment variable
  • ✅ SDK script tag added to HTML
  • ✅ SDK initialization tested
  • ✅ Event tracking tested
  • ✅ Automation enabled in Partner Portal
  • ✅ Production domain added (if using DNS detection)

Your Application:

  • ✅ HTTPS enabled
  • ✅ Custom domain configured
  • ✅ Error tracking set up (optional)
  • ✅ Monitoring enabled (optional)
  • ✅ Tested in production


Need Help? Join our Discord or email support@rsnc.network