Guides

The DNS records a domain needs, and what each one actually does

A domain's own DNS mostly comes down to five record types: TXT, MX, CNAME, CAA, and the NS/SOA pair every zone carries. This guide explains what each one does, with a live checker for every claim.

The short answer

A domain needs five kinds of DNS record in practice: TXT for SPF, DKIM and verification strings; MX to route mail; CNAME to alias one name to another, except at the zone's own root, where RFC 1034 §3.6.2 forbids it; CAA to say which certificate authorities may issue for it, with no CAA record meaning any publicly trusted CA may; and the NS and SOA pair every zone carries, which handles delegation and the timers secondary nameservers run on. A record's TTL governs how long a resolver may keep answering with the old value after any of this changes.

A domain's DNS mostly comes down to five kinds of record. TXT holds SPF, DKIM and verification strings. MX routes mail. CNAME aliases one name to another, everywhere except the zone's own root. CAA says which certificate authorities may issue for the domain, and having none published is itself a choice, just not a restrictive one. NS and SOA are the pair every zone carries, handling delegation and the timers a secondary nameserver runs on. Underneath all of them, a record's TTL decides how long a resolver can keep answering with an old value after you change anything.

Cloudflare's and Wikipedia's own glossary pages already define each of these types well, and this guide does not try to out-write them as plain definitions. What follows pairs each explanation with a live tool: a checker that reads a domain's actual records, or a generator that writes the exact values a mail or hosting provider documents today. Read the explanation, then check it against a real domain.

What is a TXT record, and why does it carry SPF, DKIM, domain verification and more?

A TXT record is a slot for free-form text. RFC 1035 §3.3 defines it as one or more character-strings concatenated together, and DNS itself does not interpret what is inside - that is entirely up to whatever program goes looking for it.

That lack of built-in meaning is exactly why TXT ended up carrying so much. SPF needed somewhere to publish which servers may send mail for a domain. DKIM needed somewhere to publish a public signing key. Domain-verification schemes - a hosting platform, a search console, an analytics tool - each needed somewhere to publish a one-time token proving control of the domain. None of these needed a new record type invented for it; each just published a TXT value starting with its own prefix (v=spf1, v=DKIM1, or a provider's own string) so a reader can tell at a glance which scheme a given TXT value belongs to.

The one hard limit on a TXT record is RFC 1035 §3.3's character-string length: at most 255 bytes per string, with the record allowed to carry several strings concatenated together for anything longer. A 2048-bit DKIM key or a long SPF record with several includes routinely runs past 255 bytes, which is why it has to be split into more than one string to be published at all - and why splitting on characters instead of bytes, or forgetting to escape a literal quote, is the most common way to publish one wrong.

  • DNS record type explainer - plain-word definitions for all nine everyday record types, each with a live lookup for any domain you type in.
  • TXT record splitter - paste a long SPF or DKIM value and get it split into properly quoted, correctly escaped 255-byte strings.

If your TXT records specifically are SPF, DKIM and DMARC for cold email or mailbox licensing, our email authentication report reads all three for a domain in one pass.

What is an MX record, and what has to go with it?

An MX record names which server accepts mail for a domain, and in what order. RFC 1035 pairs a hostname with a numeric priority, and a sending server tries the lowest number first, moving to the next only if that host refuses the connection. A domain with no MX record published is not meant to receive mail by SMTP at all.

MX alone gets mail routed; it does not get it authenticated. Every mailbox provider below documents a fixed SPF value that has to sit alongside MX, and some add more:

ProviderMX recordsSPF includeOther fixed recordsSource (read 2026-10-12)
Google WorkspaceOne: smtp.google.com, priority 1 (older domains may still have "aspmx" values, still supported)include:_spf.google.comDKIM and the domain-verification token are minted per account in the Admin Console; no fixed value existsMX setup, SPF setup
Microsoft 365Issued per tenant inside the admin center; no fixed valueinclude:spf.protection.outlook.comA Teams federation SRV record and two Intune CNAMEs are fixed; MX, Autodiscover CNAME, DKIM and the verification token are tenant-specificConnect your domain
Zoho MailThree, by priority: mx.zoho.com (10), mx2.zoho.com (20), mx3.zoho.com (50)include:zohomail.comDKIM is minted per account in the admin consoleConfigure email delivery, SPF
FastmailTwo, by priority: in1-smtp.messagingengine.com (10), in2-smtp.messagingengine.com (20)include:spf.messagingengine.comThree DKIM CNAMEs and a DMARC TXT record, both account-specific in valueManual DNS configuration

Two things worth noticing in that table. First, Zoho's three MX records are not a backup to add later - all three are how it routes around a busy or unreachable primary server, so a domain missing the second and third loses that fallback from the start. Second, every provider warns against publishing a second SPF TXT record: a domain is allowed only one, and a new provider's include has to be merged into the existing record as another term, not published alongside it.

If you're deciding which suite to resell rather than which records to publish, Google Workspace vs Microsoft 365 for resellers compares the two programmes directly.

What is a CNAME record, and why can't it sit at a domain's own root?

A CNAME record makes one name an alias for another. RFC 1035 has a resolver treat a query for the alias as a query for whatever it points at instead, following the chain until it lands on a name with a real record to answer - a CDN, a hosted app platform, or any host someone else runs, without you having to track that host's own address every time it changes.

The one rule that trips people up is the apex rule: a CNAME cannot sit at a zone's own root. RFC 1034 §3.6.2 says a name carrying a CNAME record can carry no other record at that same name, and a zone's apex already needs an SOA record and at least one NS record there - so a CNAME at the root would have to coexist with records the protocol requires, which it cannot. Most DNS hosts simply refuse to save one. This is the entire reason www.example.com is routinely set up as a CNAME while example.com itself never is.

It is also the entire reason every website platform below hands you an A record for the bare domain and a CNAME for www, rather than a CNAME for both - and why some offer an ALIAS or ANAME record as a panel-level workaround: a feature the provider built on top of a real A record, that behaves like a CNAME from the outside while technically publishing an address underneath it.

PlatformApex (root) recordwww recordSource (read 2026-10-12)
ShopifyA record, Shopify's published IPv4 addressCNAME to shops.myshopify.comConnect a domain manually
GitHub PagesFour A records to GitHub's published IP addressesCNAME to <user>.github.ioManaging a custom domain
SquarespaceFour A records to Squarespace's published IP addressesCNAME to ext-cust.squarespace.comDNS records for third-party domains
NetlifyALIAS/ANAME where supported, or a fallback A record to Netlify's load balancerCNAME to your own *.netlify.app subdomainConfigure external DNS

A chain is also a cost, not just a convenience. Each hop a CNAME points through is one more lookup a resolver has to make before it gets an answer, and a chain that ends in a name with no record at all - a dangling CNAME - resolves to nothing rather than failing loudly at the point where it actually breaks.

What is a CAA record, and what does having none actually permit?

A CAA record names which certificate authorities are allowed to issue a certificate for a domain at all. RFC 8659 defines three tags: issue for ordinary certificates, issuewild for wildcards, and iodef for where a CA should report a request it had to refuse. Every public certificate authority checks for a CAA record before issuing anything, which makes this the one record that decides who is allowed to get a certificate for a domain, not just who happens to have one today.

The detail that catches people out is what "no CAA record" means. It is not an error state and it is not "nothing has been decided yet." Per RFC 8659 and Let's Encrypt's own CAA documentation, a domain that publishes no CAA record at all has made no restriction - any publicly trusted certificate authority may issue for it, which is simply the default the web has run on since before CAA existed. Publishing a CAA record is what narrows that down, and the record that actually causes trouble is a narrow one: naming only the CA in use today, so that a later move to a different host or CDN - which often means a different CA issuing the renewal - gets refused outright rather than slowly, because the new CA was never named.

  • CAA checker - reads a domain's CAA records (climbing to the nearest parent that has one, per RFC 8659 §3, when the domain itself has none) and tells you plainly whether that is a restriction or the open default.
  • CAA generator - builds a correctly formatted CAA record for the certificate authorities you actually use.

What are NS and SOA records, and what do the SOA's timers actually control?

An NS record names one of the nameservers authoritative for a zone. RFC 9499 calls the mechanism delegation: a parent zone publishes NS records pointing at a child zone's nameservers, and the child repeats the same names at its own apex. Resolving any other record for a domain starts here - a resolver follows a name's NS records first to find out which servers to even ask about everything else. RFC 2182 covers the operational side: why a zone should run more than one nameserver, and where those servers should sit relative to each other, so that one outage does not take the whole zone offline.

An SOA record marks a zone's own apex and carries a primary nameserver, an admin mailbox, a serial number, and four timers most people never read. Those four timers are what a secondary nameserver uses to decide when to recheck the primary and how long to keep answering if it cannot:

TimerWhat it controls
RefreshHow often a secondary checks the primary for a new serial number
RetryThe shorter wait a secondary uses after a failed check, before trying again
ExpireHow long a secondary keeps answering with its last known copy if it cannot reach the primary at all
MinimumHow long a resolver caches a negative answer - "no such name" - for anything under this zone

RFC 1035 §3.3.13 defines all seven SOA fields, but not all of them still mean what it says: minimum's own entry there described it as a floor under every record's TTL in the zone, a meaning RFC 2308 §4 deprecated outright and redefined to the negative-caching TTL in the table above - the other three timers kept their original RFC 1035 meaning. The serial number that precedes them is not just a version counter to glance at - RFC 1982 defines the arithmetic a secondary uses to tell whether a new serial is actually newer, since the number wraps around rather than counting forever, and a secondary compares serials with that wraparound in mind rather than by simple greater-than.

A zone that nobody has touched in years usually has nothing wrong with any of these timers; they just sit unread until a migration or an edit makes them matter. Editing a zone without the serial actually changing afterwards is the most common way they bite: a secondary that already cached the old serial has no reason to recheck until its own refresh timer forces it, which can be hours away.

  • Nameserver and DNS host checker - compares what the registry has on file against what the zone itself answers for NS, and flags a delegation that is only half finished.
  • SOA record checker - reads a zone's SOA record as seven plain-English values and flags a timer that will cause real trouble, like a retry longer than its own refresh.

What does a TTL actually control?

A TTL - time to live - is the number of seconds a resolver is allowed to keep answering with a record's current value before it has to ask again. It sits on every record, not just one type, and it is set by whoever manages the zone.

This is why "did my DNS change take effect?" is almost always the wrong question. The record was very likely saved correctly the moment you clicked save. What takes time is every resolver that had already cached the old value letting that cache expire on its own TTL, which is counted from when each resolver fetched the record, not from when you changed it. A resolver with a one-hour TTL cached five minutes before your change can correctly keep serving the old value for most of the next hour - that is caching working exactly as designed, not a failure to propagate. The real question is "has the old TTL expired yet," and the answer to that is visible, not something to guess at by refreshing a page.

  • DNS change verifier - enter the value you just set, and get a plain pass, partial, or fail from two public resolvers compared against that exact value.
  • DNS propagation checker - see any record type and its TTL from two resolvers side by side, so a change that has reached one but not the other is something you can see rather than something you have to guess at.

Where this leaves a domain's DNS

Five record types cover almost everything a domain needs to publish: TXT for anything machine-readable that doesn't need its own type, MX to route mail, CNAME for anything aliased except the root, CAA to say who may issue certificates, and the NS/SOA pair underneath all of it. TTL decides how quickly any change to any of them actually shows up everywhere. Every claim above has a checker next to it for a reason - a domain's own records are the only authority on what that domain is actually publishing right now, not a glossary page, including this one.

Questions

  • A TXT record holds free-form text that DNS itself does not interpret - RFC 1035 §3.3 defines it as one or more character-strings, with no required format for what is inside them. SPF, DKIM key publishing and a provider's domain-verification token all needed somewhere to put a short machine-readable statement, and rather than each inventing its own record type, all three reused TXT and agreed on their own prefix (v=spf1, v=DKIM1, or a provider's own verification string) so a reader knows which scheme it is looking at.
  • At minimum, one MX record naming the mail server and a priority, so a sending server knows where to deliver. In practice a working setup also needs an SPF TXT record naming who is allowed to send as the domain, and usually DKIM and DMARC TXT records too, since the provider doing the receiving increasingly expects all three before it treats the domain as trustworthy.
  • RFC 1034 §3.6.2 says a name with a CNAME record can have no other records at that same name. A zone's root, or apex, already has to carry an SOA record and at least one NS record, so a CNAME cannot coexist there - most DNS hosts simply refuse to save one. This is why a CNAME is used for www.example.com but not example.com itself.
  • It means no restriction has been published. RFC 8659 and Let's Encrypt's own documentation both describe the same default: a domain that publishes no CAA record at all has not limited who may issue a certificate for it, so any publicly trusted certificate authority is free to do so. Publishing a CAA record naming specific authorities is what narrows that down.
  • Refresh is how often a secondary nameserver checks the primary for a new serial number. Retry is the shorter wait it uses after a failed check, before trying again. Expire is how long a secondary keeps answering with its last known copy if it cannot reach the primary at all. Minimum was redefined by RFC 2308 §4 to govern how long a resolver caches a negative answer - 'no such name' - not the TTL of any record that does exist; RFC 1035 §3.3.13's original meaning for it, a floor under every record's own TTL, was deprecated by that same section.
  • Probably not. A resolver that already cached the old value under its TTL keeps answering with it until that TTL runs out, which is a property of caching, not a sign the new record failed to save. The real question is almost never 'did my change take effect' but 'has the old TTL expired yet' - checking the record's TTL tells you how much longer to wait before treating a mismatch as a real problem.

Sources

  1. RFC 1035: Domain Names - Implementation and Specification rfc-editor.org
  2. RFC 1035 §3.3 - character-string rfc-editor.org
  3. RFC 1034: Domain Names - Concepts and Facilities rfc-editor.org
  4. RFC 8659: DNS Certification Authority Authorization (CAA) Resource Record rfc-editor.org
  5. Let's Encrypt: Certificate Authority Authorization (CAA) letsencrypt.org
  6. RFC 1982: Serial Number Arithmetic rfc-editor.org
  7. RFC 2308: Negative Caching of DNS Queries rfc-editor.org
  8. RFC 9499: DNS Terminology rfc-editor.org
  9. RFC 2182: Selection and Operation of Secondary DNS Servers rfc-editor.org
  10. Google: Set up MX records for Google Workspace knowledge.workspace.google.com
  11. Google: Set up SPF knowledge.workspace.google.com
  12. Microsoft: Connect your domain by adding DNS records learn.microsoft.com
  13. Zoho: Configure Email Delivery zoho.com
  14. Zoho: SPF - Sender Policy Framework zoho.com
  15. Fastmail: Manual DNS Configuration fastmail.help
  16. Shopify: Connect your third-party domain to Shopify manually help.shopify.com
  17. GitHub: Managing a custom domain for your GitHub Pages site docs.github.com
  18. Squarespace: DNS records for connecting third-party domains support.squarespace.com
  19. Netlify: Configure external DNS for a custom domain docs.netlify.com

Keep reading

More on selling under your own name

Start selling under your own brand

  1. Sign up with an email, no call needed1 minute
  2. Get test keys and $5,000 of pretend moneyInstantly
  3. Take order #0001 under your own nameToday