Skip to main content
Deliverability is the ability to get your emails into recipients’ inboxes rather than spam folders. Good deliverability requires proper authentication, quality content, and maintaining a good sender reputation.

Key Factors

1. Authentication

Email authentication proves you’re authorized to send from your domain.
ProtocolPurpose
SPFSpecifies which IPs can send for your domain
DKIMCryptographically signs emails to verify origin
DMARCTells receivers how to handle failed authentication

Domain Setup

Configure all authentication records

2. Sender Reputation

Email providers track your sending patterns and recipient engagement: Positive signals:
  • High open rates
  • Clicks and replies
  • Recipients adding you to contacts
Negative signals:
  • High bounce rates
  • Spam complaints
  • Low engagement
  • Sudden volume spikes

3. Content Quality

Poor content triggers spam filters:
  • Excessive use of “FREE”, “URGENT”, all caps
  • Too many images, not enough text
  • Suspicious links or attachments
  • No unsubscribe option
  • Deceptive subject lines

Reputation Best Practices

Maintain Clean Lists

import ark
from ark import Ark

client = Ark()

def send_to_valid_recipients(recipients, content):
    valid = []

    for recipient in recipients:
        try:
            client.suppressions.retrieve(recipient)
            # Email is suppressed, skip it
        except ark.NotFoundError:
            # Not suppressed, safe to send
            valid.append(recipient)

    if valid:
        return client.emails.send_batch(
            emails=[{**content, "to": [r]} for r in valid]
        )
Never purchase email lists. They contain invalid addresses and uninterested recipients that will damage your reputation.

Warm Up New Domains

When starting with a new domain, gradually increase volume:
WeekDaily VolumeNotes
150-100Send to most engaged users
2200-500Expand to recent openers
31,000-2,000Include broader audience
4+Double weeklyMonitor bounce rates

Monitor Metrics

Track these metrics to catch issues early:
MetricHealthy RangeAction if Outside
Bounce rate< 2%Clean your list
Complaint rate< 0.1%Review content, add unsubscribe
Open rate> 15%Improve subject lines

Content Guidelines

Subject Lines

Do:
  • Keep under 50 characters
  • Be specific and relevant
  • Personalize when possible
Don’t:
  • Use ALL CAPS
  • Add RE: or FW: falsely
  • Use excessive punctuation!!!
  • Make false promises

Email Body

Do:
  • Include both HTML and plain text
  • Use a readable text-to-image ratio (80% text)
  • Include your physical address
  • Add clear unsubscribe link
Don’t:
  • Use URL shorteners
  • Include attachments without context
  • Use hidden text or tiny fonts
  • Embed forms in email
Do:
  • Use your own domain for links
  • Link to HTTPS pages
  • Use custom tracking domains
Don’t:
  • Use multiple redirects
  • Link to blacklisted domains
  • Include IP addresses in links

Technical Setup

Proper Headers

Ark handles most headers automatically, but ensure:
client.emails.send(
    from_='"Your Company" <[email protected]>',  # Friendly name
    to=["[email protected]"],
    reply_to="[email protected]",  # Valid reply address
    subject="Hello",
    html="<p>Hello!</p>"
)

List-Unsubscribe Header

For marketing emails, include an unsubscribe header:
client.emails.send(
    from_="[email protected]",
    to=["[email protected]"],
    subject="Weekly Newsletter",
    html=content,
    headers={
        "List-Unsubscribe": "<mailto:[email protected]>, <https://yourdomain.com/unsubscribe>",
        "List-Unsubscribe-Post": "List-Unsubscribe=One-Click"
    }
)

Handling Issues

High Bounce Rates

A bounce rate above 2% signals list quality issues and will harm your sender reputation. Hard bounces (immediate permanent failures) are automatically suppressed by Ark on first occurrence. If you’re seeing high hard bounce rates:
  1. Identify the source: Are bounces from specific domains or your entire list?
  2. Check for typos: Common typos like gmial.com instead of gmail.com
  3. Verify at signup: Use double opt-in for new subscribers
  4. Clean old lists: Remove addresses that haven’t engaged in 6+ months
  5. Validate before import: Use email validation services before importing bulk lists
Soft bounces (temporary failures) are retried automatically up to 18 times. If many soft bounces convert to hard fails:
  1. Check send volume: You may be hitting rate limits at receiving servers
  2. Review message size: Large attachments can cause rejections
  3. Spread sends over time: Avoid sending to one domain in large bursts
Ark protects your reputation automatically. Hard bounces trigger immediate suppression, preventing repeated delivery attempts to invalid addresses. This keeps your bounce rate low and your sender reputation healthy.

Spam Complaints

  1. Make unsubscribe easy: One click, no login required
  2. Set expectations: Confirm what they’ll receive when signing up
  3. Honor preferences: Send only what users asked for
  4. Remove complainers: Never email someone who complained

Low Open Rates

  1. Check deliverability: Are emails reaching spam?
  2. Improve subject lines: A/B test different approaches
  3. Optimize send time: Test different times of day
  4. Segment your list: Send relevant content to each group

Testing Deliverability

Before launching campaigns:
  1. Send test emails to major providers (Gmail, Outlook, Yahoo)
  2. Check spam folders on each provider
  3. Use seed lists to monitor placement
  4. Review email headers for authentication results
# Check SPF/DKIM/DMARC in email headers
# Look for: Authentication-Results header
# Should show: spf=pass, dkim=pass, dmarc=pass

Monitoring Tools

  • Postmaster Tools: Google, Microsoft, Yahoo offer insights
  • Feedback loops: Sign up with major ISPs
  • Ark webhooks: Monitor bounces and complaints in real-time
@app.post("/webhooks/ark")
async def handle_webhook(request: Request):
    event = await request.json()

    if event["event"] == "MessageBounced":
        alert_ops(f"Bounce detected: {event['payload']}")

    if event["event"] == "MessageComplained":
        alert_ops(f"Spam complaint from: {event['payload']['message']['to']}")

    return {"status": "ok"}