Skip to main content

🔌 Duda Integration

🎯 Overview

The Duda integration provides comprehensive website builder capabilities through Duda's REST API. This integration enables DashClicks users to create, manage, and publish professional websites using Duda's platform.

Provider: Duda (https://www.duda.co)
API Version: Multiscreen API
Integration Type: REST API with Basic Authentication
Use Case: Website building and management for agencies and clients

📁 Directory Structure

Documentation Structure:

duda/
├── 📄 index.md - Integration overview (this file)
├── 📄 sites.md - Site CRUD, publishing, analytics
├── 📄 accounts.md - Account management and SSO
├── 📄 content.md - Content operations and uploads
└── 📄 webhooks.md - Webhook event handling

Source Code Location:

  • Base Path: external/Integrations/Duda/
  • Services: services/
  • Controllers: controllers/
  • Utils: utils/

🗄️ MongoDB Collections

📚 Detailed Schema: See Database Collections Documentation

config

  • Purpose: Store Duda API credentials (username/password)
  • Model: external/models/config.js
  • Primary Use: Authentication for Duda API calls

agency-website

  • Purpose: Store DashClicks agency website data
  • Model: external/models/agency-website.js
  • Primary Use: Track published Duda sites, sync status

instasite

  • Purpose: Store Instasite (instant website) data
  • Model: external/models/instasite.js
  • Primary Use: Quick-start website templates

user-config

  • Purpose: User notification preferences
  • Model: external/models/user-config.js
  • Primary Use: Webhook notification settings

🔐 Authentication & Configuration

Authentication Method: Basic Authentication (username:password Base64-encoded)

Required Environment Variables:

VariableDescriptionRequired
DUDA_SITES_DOMAINDuda API base URL
DUDA_TOKENDefault Duda config ID
GOOGLE_CLOUD_PROJECT_IDFor thumbnail generation

Credential Storage:

  • API credentials stored in config collection
  • Retrieved by config ID (dudaHeader parameter)
  • Encoded to Base64 before each API call

Authentication Flow:

// 1. Fetch credentials from database
const query = await Config.findById(dudaHeader);

// 2. Encode to Base64
const access_token = utils.base64(query); // Encodes username:password

// 3. Add to request header
headers: {
authorization: `Basic ${access_token}`;
}

🏗️ Architecture Overview

Key Responsibilities:

  • Create and manage Duda websites for client accounts
  • Publish/unpublish sites with thumbnail generation
  • Manage site content and uploaded resources
  • Handle SSO (Single Sign-On) for Duda editor access
  • Process Duda webhooks for publish/unpublish events
  • Sync site status with DashClicks database

API Communication Pattern:

  • RESTful HTTP/HTTPS API
  • Synchronous request/response
  • Webhook-based event notifications

Rate Limiting:

  • Duda enforces rate limits (varies by plan)
  • No explicit rate limiting in integration code

🔗 Features & Capabilities

Core Features

🔄 Integration Data Flow

Typical Site Creation Flow

sequenceDiagram
participant DC as DashClicks
participant DudaService as Duda Service
participant ConfigDB as Config DB
participant DudaAPI as Duda API

DC->>DudaService: Create site request
DudaService->>ConfigDB: Fetch API credentials
ConfigDB-->>DudaService: Return username/password

DudaService->>DudaService: Encode to Base64
DudaService->>DudaAPI: POST /sites/multiscreen/create
Note over DudaService,DudaAPI: Authorization: Basic {token}

DudaAPI-->>DudaService: Site created
DudaService-->>DC: Return site details

Webhook Event Processing

sequenceDiagram
participant Duda as Duda Platform
participant WebhookService as Webhook Service
participant DB as Database
participant PubSub as Google PubSub
participant FCM as Notifications

Duda->>WebhookService: Webhook: site.published
WebhookService->>DB: Find site by builder_id
WebhookService->>Duda: Fetch updated site details
Duda-->>WebhookService: Site + content data

WebhookService->>DB: Update site status
WebhookService->>DB: Delete old thumbnails
WebhookService->>PubSub: Trigger thumbnail generation
PubSub-->>WebhookService: Job queued

WebhookService-->>Duda: 200 OK

Note over Duda,FCM: For unpublish events
WebhookService->>FCM: Send notification to user

🚨 Error Handling

Common Error Scenarios:

  • 404 Not Found: API credentials not in Config collection
  • 400 Bad Request: Invalid request body or missing required fields
  • 401 Unauthorized: Invalid Duda credentials (wrong username/password)
  • 404 Duda Site Not Found: Site doesn't exist in Duda system
  • 500 Server Error: Duda API downtime or internal errors

Error Handling Pattern:

try {
const response = await axios(options);
return response.data;
} catch (error) {
// Axios automatically throws for 4xx/5xx
if (error.response?.data) {
throw badRequest(error.response.data.message);
}
throw error;
}

📊 Monitoring & Logging

Webhook Processing:

  • Logs webhook events with logger utility
  • Tracks thumbnail generation failures
  • Monitors notification delivery failures

Error Logging:

logger.error({
initiator: 'external/Integrations/Duda',
error: err,
message: 'Failed to send site unpublished notification.',
});

🔗 Submodules

Service Files

📘 Sites Service

File: services/sites.service.js
Functions: 11 functions for site management

Core capabilities:

  • getSites() - List sites by account
  • getSite() - Get single site details
  • createSite() - Create new website
  • deleteSites() - Delete site
  • updateSites() - Update site config
  • publishSites() - Publish site live
  • unpublishSites() - Take site offline
  • getTemplate() - Get template info
  • getAnalytics() - Retrieve site analytics
  • getFormData() - Get form submissions
  • setSitesPlan() - Update site plan

📖 Full Documentation


📗 Accounts Service

File: services/accounts.service.js
Functions: 3 functions for account management

Core capabilities:

  • createAccount() - Create Duda sub-account
  • grantSiteAccess() - Grant site permissions to account
  • getSSOLink() - Generate SSO link for editor access

📖 Full Documentation


📙 Content Service

File: services/content.service.js
Functions: 4 functions for content operations

Core capabilities:

  • getContent() - Retrieve site content
  • updateContent() - Update site content
  • publishContent() - Publish content changes
  • uploadedResources() - Upload images/files

📖 Full Documentation


📕 Webhook Service

File: services/webhook.service.js
Functions: 2 functions for webhook processing

Core capabilities:

  • publish() - Handle site.published event
  • unpublish() - Handle site.unpublished event

📖 Full Documentation

🔐 Security Considerations

  1. Credential Storage: Duda credentials stored encrypted in Config collection
  2. Basic Auth: Always use HTTPS to protect Base64-encoded credentials
  3. Webhook Verification: Consider adding webhook signature verification
  4. External UID: DashClicks account_id tracked in Duda's external_uid field
  5. SSO Links: SSO links are time-limited (check Duda documentation)

🚀 Quick Start

Creating a Website

const sitesService = require('./services/sites.service');

// 1. Create site
const site = await sitesService.createSite(
dudaConfigId,
{
template_id: 'template_123',
default_domain_prefix: 'mybusiness',
site_data: {
site_business_info: {
business_name: 'My Business',
phone: '555-0100',
},
},
},
accountId,
);

// 2. Update content
await contentService.updateContent(
dudaConfigId,
{
location_data: {
phones: [{ phoneNumber: '555-0100' }],
emails: ['contact@mybusiness.com'],
},
},
site.site_name,
);

// 3. Publish site
await sitesService.publishSites(dudaConfigId, site.site_name);

Setting Up SSO

const accountsService = require('./services/accounts.service');

// 1. Create Duda account
await accountsService.createAccount(dudaConfigId, 'client-account-name');

// 2. Grant site access
await accountsService.grantSiteAccess(dudaConfigId, {
siteName: 'site_123',
accountName: 'client-account-name',
permissions: ['EDIT', 'PUBLISH'],
});

// 3. Generate SSO link
const ssoData = await accountsService.getSSOLink(dudaConfigId, 'client-account-name', {
target: 'EDITOR',
site_name: 'site_123',
});

// Redirect user to ssoData.url

⚠️ Important Notes

  1. External UID Tracking: Always set external_uid in site_data to track ownership
  2. Base64 Encoding: Credentials must be Base64-encoded username:password for each request
  3. Webhook Processing: Publish webhooks trigger thumbnail generation via Google PubSub
  4. Site Status Sync: Webhooks keep DashClicks database in sync with Duda site status
  5. Thumbnail Management: Old thumbnails deleted from Wasabi when site republished
  6. Notification Preferences: Unpublish events respect user notification settings
  7. Site Types: Integration handles both agency-websites and instasites
  8. Content Publishing: Content changes require explicit publish call
  9. Analytics Date Range: Analytics API requires from and to date parameters
  10. Plan Management: Site plans affect available features and functionality
💬

Documentation Assistant

Ask me anything about the docs

Hi! I'm your documentation assistant. Ask me anything about the docs!

I can help you with:
- Code examples
- Configuration details
- Troubleshooting
- Best practices

Try asking: How do I configure the API?
09:30 AM