Custom Domains
Send emails from your own domain with Keplars Mail Service
Overview
Custom domains allow you to send emails from your own domain (e.g., [email protected]) instead of using a shared sending domain. This improves deliverability, builds trust with recipients, and maintains your brand identity.
Custom domains are available on ORBIT, LAUNCH, CUSTOM, and ENTERPRISE plans.
Benefits
- Better Deliverability: Email providers trust verified custom domains more than shared domains
- Brand Consistency: All emails come from your domain
- Professional Appearance: Recipients see your brand in the sender address
- DMARC Compliance: Implement proper email authentication policies
Setup Process
Step 1: Add Your Domain
Navigate to Settings → Custom Domains in your workspace and click Add Domain.
Enter your domain name (e.g., yourdomain.com).
Step 2: Add DNS Records
After adding your domain, you'll receive DNS records to configure:
SPF Record (TXT):
Type: TXT
Name: @
Value: v=spf1 include:_spf.keplarsmail.com ~allDKIM Record (TXT):
Type: TXT
Name: keplars._domainkey
Value: [Your unique DKIM key will be provided]DMARC Record (TXT):
Type: TXT
Name: _dmarc
Value: v=DMARC1; p=none; rua=mailto:[email protected]Step 3: Verify Domain
Once DNS records are added, click Verify Domain in the dashboard.
Verification may take up to 48 hours for DNS propagation, but typically completes within a few hours.
Sending From Custom Domain
Once your domain is verified, you can send emails using your custom domain in the from field:
curl --request POST \
--url https://api.keplars.com/api/v1/send-email/instant \
--header 'Authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"to": ["[email protected]"],
"from": "[email protected]",
"from_name": "Your Company",
"subject": "Welcome to our service",
"html": "<h1>Hello from your custom domain!</h1>"
}'const response = await fetch('https://api.keplars.com/api/v1/send-email/instant', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
to: ['[email protected]'],
from: '[email protected]',
from_name: 'Your Company',
subject: 'Welcome to our service',
html: '<h1>Hello from your custom domain!</h1>'
})
});
const result = await response.json();
console.log(result);import requests
response = requests.post(
'https://api.keplars.com/api/v1/send-email/instant',
headers={
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
},
json={
'to': ['[email protected]'],
'from': '[email protected]',
'fromName': 'Your Company',
'subject': 'Welcome to our service',
'html': '<h1>Hello from your custom domain!</h1>'
}
)
print(response.json())package main
import (
"bytes"
"encoding/json"
"net/http"
)
func main() {
payload := map[string]interface{}{
"to": []string{"[email protected]"},
"from": "[email protected]",
"from_name": "Your Company",
"subject": "Welcome to our service",
"html": "<h1>Hello from your custom domain!</h1>",
}
jsonData, _ := json.Marshal(payload)
req, _ := http.NewRequest("POST", "https://api.keplars.com/api/v1/send-email/instant", bytes.NewBuffer(jsonData))
req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, _ := client.Do(req)
defer resp.Body.Close()
}Using Templates with Custom Domains
You can combine custom domains with email templates for branded, personalized emails:
curl --request POST \
--url https://api.keplars.com/api/v1/send-email/instant \
--header 'Authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"to": ["[email protected]"],
"from": "[email protected]",
"from_name": "Your Company",
"template_id": "YOUR_TEMPLATE_ID",
"params": {
"user_name": "John Doe",
"current_year": "2026"
}
}'const response = await fetch('https://api.keplars.com/api/v1/send-email/instant', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
to: ['[email protected]'],
from: '[email protected]',
from_name: 'Your Company',
template_id: 'YOUR_TEMPLATE_ID',
params: {
user_name: 'John Doe',
current_year: '2026'
}
})
});
const result = await response.json();
console.log(result);import requests
response = requests.post(
'https://api.keplars.com/api/v1/send-email/instant',
headers={
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
},
json={
'to': ['[email protected]'],
'from': '[email protected]',
'fromName': 'Your Company',
'template_id': 'YOUR_TEMPLATE_ID',
'params': {
'user_name': 'John Doe',
'current_year': '2026'
}
}
)
print(response.json())package main
import (
"bytes"
"encoding/json"
"net/http"
)
func main() {
payload := map[string]interface{}{
"to": []string{"[email protected]"},
"from": "[email protected]",
"from_name": "Your Company",
"template_id": "YOUR_TEMPLATE_ID",
"params": map[string]string{
"user_name": "John Doe",
"current_year": "2026",
},
}
jsonData, _ := json.Marshal(payload)
req, _ := http.NewRequest("POST", "https://api.keplars.com/api/v1/send-email/instant", bytes.NewBuffer(jsonData))
req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, _ := client.Do(req)
defer resp.Body.Close()
}Templates automatically populate dynamic content using the params object. The from field must use your verified custom domain.
DNS Configuration Examples
Cloudflare
- Go to DNS → Records
- Add each TXT record with the provided values
- Set Proxy status to DNS only (grey cloud)
GoDaddy
- Go to DNS Management
- Add TXT records in the Records section
- Use
@for the root domain
Namecheap
- Navigate to Advanced DNS
- Add TXT records under Host Records
- Use
@for the root domain name
Squarespace
- Go to DNS → Custom records
- Add TXT records with the provided values
- Save changes
Verification Status
Check your domain verification status in Settings → Custom Domains:
- Pending: DNS records not yet configured or propagated
- Verifying: DNS records detected, verification in progress
- Verified: Domain is ready to use for sending emails
- Failed: DNS records are incorrect or missing
Best Practices
Use Subdomain for Sending
Instead of sending from your root domain, use a subdomain like mail.yourdomain.com or send.yourdomain.com:
from: [email protected]This protects your main domain's reputation.
Set Up DMARC Monitoring
Configure DMARC with a reporting email to monitor authentication:
v=DMARC1; p=quarantine; rua=mailto:[email protected]Warm Up Your Domain
When sending from a new domain:
- Start with low volume (100-200 emails/day)
- Gradually increase over 2-4 weeks
- Monitor bounce rates and spam complaints
Use Consistent From Addresses
Stick to 1-2 sender addresses to build domain reputation:
Troubleshooting
Domain Not Verifying
Issue: DNS records added but domain still shows "Pending"
Solutions:
- Wait 24-48 hours for DNS propagation
- Verify DNS records using
digornslookup:dig TXT yourdomain.com dig TXT keplars._domainkey.yourdomain.com dig TXT _dmarc.yourdomain.com - Check for typos in DNS records
- Ensure there are no conflicting SPF records
SPF Record Conflicts
Issue: Existing SPF record for other email services
Solution: Merge SPF records:
v=spf1 include:_spf.keplarsmail.com include:_spf.google.com ~allOnly one SPF record is allowed per domain. Merge all includes into a single record.
Emails Marked as Spam
Issue: Emails from custom domain going to spam
Solutions:
- Verify all DNS records (SPF, DKIM, DMARC) are correct
- Check domain reputation using MXToolbox
- Ensure domain is not on any blacklists
- Warm up domain gradually with legitimate emails
- Monitor bounce and complaint rates
DKIM Verification Fails
Issue: DKIM signature verification fails
Solutions:
- Verify DKIM record is exactly as provided (no spaces or line breaks)
- Check DNS TTL has expired (wait for propagation)
- Test DKIM using email authentication checkers
- Contact support if issue persists
Next Steps
- Send Emails - Learn about sending emails
- Email Templates - Create reusable templates
- Webhooks - Track email delivery events