Keplars

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 ~all

DKIM 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

  1. Go to DNS → Records
  2. Add each TXT record with the provided values
  3. Set Proxy status to DNS only (grey cloud)

GoDaddy

  1. Go to DNS Management
  2. Add TXT records in the Records section
  3. Use @ for the root domain

Namecheap

  1. Navigate to Advanced DNS
  2. Add TXT records under Host Records
  3. Use @ for the root domain name

Squarespace

  1. Go to DNS → Custom records
  2. Add TXT records with the provided values
  3. 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:

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:

  1. Start with low volume (100-200 emails/day)
  2. Gradually increase over 2-4 weeks
  3. 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 dig or nslookup:
    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 ~all

Only 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

On this page