Configuration
Complete reference for all widget configuration options.
Required Options
| Option | Type | Description |
|---|---|---|
target | string | CSS selector for the container element |
apiEndpoint | string | Your backend proxy endpoint URL |
serverId | number | VanityCert server ID where certificates will be installed |
userId | string | Unique identifier for the current user (for state persistence) |
Example
VanityCert.init({
target: '#ssl-widget',
apiEndpoint: '/api/vanitycert-proxy',
serverId: 123,
userId: 'user-abc123'
});
Optional Options
| Option | Type | Default | Description |
|---|---|---|---|
theme | object | {} | Custom theme colors (see Theming) |
callbacks | object | {} | Event callbacks (see Callbacks) |
pollInterval | number | 5000 | Status polling interval in milliseconds (certificate issuance) |
dnsPollInterval | number | 10000 | DNS validation polling interval in milliseconds |
Example with All Options
VanityCert.init({
// Required
target: '#ssl-widget',
apiEndpoint: '/api/vanitycert-proxy',
serverId: 123,
userId: currentUser.id,
// Optional: Theming
theme: {
primaryColor: '#10243f',
secondaryColor: '#1867a0',
successColor: '#28a745',
fontFamily: '"Helvetica Neue", Arial, sans-serif'
},
// Optional: Polling
pollInterval: 3000, // Check certificate status every 3s
dnsPollInterval: 15000, // Check DNS every 15s
// Optional: Callbacks
callbacks: {
onDomainCreated: function(domain) {
console.log('Domain created:', domain);
},
onDnsValidated: function(domain) {
console.log('DNS validated:', domain);
},
onCertificateIssued: function(domain) {
console.log('Certificate issued:', domain);
},
onValidationFailed: function(domain, reason) {
console.error('Validation failed:', reason);
},
onError: function(error) {
console.error('Error:', error);
},
onComplete: function(domain) {
console.log('Setup complete:', domain);
}
}
});
Callbacks
The widget provides callbacks for all major events in the certificate provisioning lifecycle.
onDomainCreated
Called when a domain is successfully created in VanityCert.
callbacks: {
onDomainCreated: function(domain) {
// domain = { id, url, dns_status, ssl_status, created_at }
console.log('Domain created:', domain.url);
// Example: Track in analytics
analytics.track('SSL Setup Started', {
domain: domain.url,
domain_id: domain.id
});
}
}
Parameters:
domain(object) - Domain object withid,url,dns_status,ssl_status,created_at
onDnsValidated
Called when DNS validation succeeds.
callbacks: {
onDnsValidated: function(domain) {
console.log('DNS validated for:', domain.url);
// Example: Show notification
showNotification('DNS configured correctly!', 'success');
}
}
Parameters:
domain(object) - Updated domain object
onCertificateIssued
Called when the SSL certificate is issued and active.
callbacks: {
onCertificateIssued: function(domain) {
console.log('Certificate issued for:', domain.url);
// Example: Update UI
document.getElementById('ssl-status').textContent = 'Active';
// Example: Send notification email
fetch('/api/notify-user', {
method: 'POST',
body: JSON.stringify({
userId: currentUser.id,
message: `SSL certificate ready for ${domain.url}`
})
});
}
}
Parameters:
domain(object) - Domain withssl_status: 'active'
onValidationFailed
Called when DNS validation fails after 24 hours.
Important: Use this callback to email your users about DNS configuration issues.
callbacks: {
onValidationFailed: function(domain, reason) {
console.error('Validation failed:', reason);
// Example: Send email to user
fetch('/api/send-dns-failure-email', {
method: 'POST',
body: JSON.stringify({
userId: currentUser.id,
domain: domain.url,
reason: reason
})
});
// Example: Create support ticket
createSupportTicket({
user: currentUser,
subject: `DNS validation failed for ${domain.url}`,
description: reason
});
}
}
Parameters:
domain(object) - Failed domain objectreason(string) - Failure reason (e.g., "DNS validation timeout (24 hours)")
onError
Called when any error occurs (network issues, API errors, etc).
callbacks: {
onError: function(error) {
// error = { code, message, details }
console.error('Widget error:', error.message);
// Example: Log to error tracking service
Sentry.captureException(new Error(error.message), {
extra: {
code: error.code,
details: error.details
}
});
// Example: Show user-friendly message
showNotification('Something went wrong. Please try again.', 'error');
}
}
Parameters:
error(object) - Error object withcode,message,details
onComplete
Called when the user clicks "Done" on the final success screen.
callbacks: {
onComplete: function(domain) {
console.log('Setup complete:', domain);
// Example: Redirect to dashboard
window.location.href = '/dashboard';
// Example: Close modal
closeModal();
// Example: Refresh data
refreshDomainList();
}
}
Parameters:
domain(object) - Completed domain object
API Methods
VanityCert.init(config)
Initialize a new widget instance.
const widget = VanityCert.init({
target: '#ssl-widget',
apiEndpoint: '/api/proxy',
serverId: 123,
userId: 'user-123'
});
Returns: VanityCertWidget instance
VanityCert.getInstance(target)
Get an existing widget instance.
const widget = VanityCert.getInstance('#ssl-widget');
if (widget) {
console.log('Widget exists');
}
Returns: VanityCertWidget instance or null
VanityCert.destroy(target)
Destroy a widget instance and clean up.
VanityCert.destroy('#ssl-widget');
Widget Instance Methods
Once you have a widget instance, you can call these methods:
widget.handleRetry()
Retry domain setup after validation failure.
const widget = VanityCert.getInstance('#ssl-widget');
widget.handleRetry();
widget.handleCancel()
Cancel domain setup and reset widget.
const widget = VanityCert.getInstance('#ssl-widget');
widget.handleCancel();
widget.handleDone()
Complete the setup process (called automatically on success screen).
const widget = VanityCert.getInstance('#ssl-widget');
widget.handleDone();
State Management
The widget automatically persists state to LocalStorage using the key vanitycert_${userId}.
Stored State
{
step: 2,
domainId: 456,
domainUrl: 'app.example.com',
dnsStatus: 'pending',
sslStatus: 'pending',
createdAt: '2025-01-01T12:00:00Z'
}
State Lifecycle
State is saved when:
- Domain is created
- Status is updated
- User navigates between steps
State is cleared when:
- User clicks "Done" on success screen
- User clicks "Cancel" during setup
widget.handleDone()orwidget.handleCancel()is called
Manual State Management
// Get current state
const widget = VanityCert.getInstance('#ssl-widget');
const state = widget.state;
// Clear state manually
widget.clearState();
// Load state
widget.loadState();
Complete Configuration Example
VanityCert.init({
// Required
target: '#ssl-widget',
apiEndpoint: '/api/vanitycert-proxy',
serverId: 123,
userId: 'user-' + currentUser.id,
// Theming
theme: {
primaryColor: '#10243f',
secondaryColor: '#1867a0',
tertiaryColor: '#92c2e9',
successColor: '#28a745',
errorColor: '#dc3545',
fontFamily: '"Helvetica Neue", Arial, sans-serif',
fontSize: '16px',
borderRadius: '8px'
},
// Polling intervals
pollInterval: 5000,
dnsPollInterval: 10000,
// Callbacks
callbacks: {
onDomainCreated: (domain) => {
analytics.track('SSL_Setup_Started', { domain: domain.url });
},
onDnsValidated: (domain) => {
analytics.track('DNS_Validated', { domain: domain.url });
},
onCertificateIssued: (domain) => {
analytics.track('Certificate_Issued', { domain: domain.url });
showNotification('Your SSL certificate is ready!', 'success');
},
onValidationFailed: (domain, reason) => {
fetch('/api/notify-dns-issue', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
userId: currentUser.id,
domain: domain.url,
reason: reason
})
});
},
onError: (error) => {
Sentry.captureException(new Error(error.message));
showNotification('An error occurred. Please try again.', 'error');
},
onComplete: (domain) => {
window.location.href = '/dashboard?ssl=success';
}
}
});
Next Steps
- Backend Proxy - Set up secure API integration
- Theming - Customize the widget appearance
- Troubleshooting - Common issues and solutions