🌐 Domain Set Up — Mockups

1. Domains Grid (with Init / Set Completed buttons)

NameTypeInstanceGoDaddyGSuite/HMailCreatedActionRetention
example-outreach.comGSuiteSoPro GSuiteACTIVEVerified2026-06-01
client-mail.netOutlookOutlook ProdACTIVENot set2026-07-10
send-postal.ioPostalPostal Server 1Not setNot set2026-07-14
Action column logic: Not initialised → Init button. Initialised but not completed → Set Completed button. Completed → no action button (email account icon shown instead).

2. Create / Edit Domain Modal

Used by both Domains/EditDomain.cshtml and DomainFlow/_InitDomain.cshtml. Nearly identical except Hmail is hidden in Domains grid.

3. Init Domain — Processing Flow

1 DNS Propagation Check
NS lookup via DnsClient. Aborts if no NS records found.
2 Check GoDaddy
Is domain registered on GoDaddy?
3 Type-Specific Setup
GSuite/Outlook/Postal/Hmail → DNS + verification
4 Mark Initialised
Domain.Initialised = true

Setup Type vs GoDaddy Decision

ScenarioWhat Happens
Domain IS on GoDaddy→ Add GoDaddy infra (emails CNAME, DMARC, redirect, BrandSSL) → type-specific setup (GSuiteSetup/OutlookSetup/PostalSetup/HMailSetup)
Domain NOT on GoDaddy + NameServerChange (1)→ Add to CloudFlare + InsertDomain in provider
Domain NOT on GoDaddy + DNSRecord (2)→ BrandSSL + generate DNS HTML + SendDomainDnsRecords email to client
Domain NOT on GoDaddy + SMTPDetails (3)→ BrandSSL + tracking CNAME only + InsertDomain in provider
Domain NOT on GoDaddy + SubdomainNsRecord (4)→ Amazon Route53 hosted zone + nameservers email + BrandSSL + InsertDomain

4. GSuite Setup Flow

4a. GoDaddy-owned domain — GSuiteSetup()

StepActionAPI / Service
1Add 5 Google MX records + SPF TXT to GoDaddyIGoDaddyAPIService.AddDnsRecords
2Register domain in local GSuiteDomain tableIGSuiteDomainService.AddOrUpdate
3Get GSuite verification codeIGoogleGSuiteAdminService.GetVerificationCode
4Add verification TXT record to GoDaddyIGoDaddyAPIService.AddDnsRecords
5Wait 80 seconds for DNS propagationSleepAndMessage(80)
6Verify domain with GoogleIGoogleGSuiteAdminService.Verify

4b. GSuite DNS Records (for manual DNSRecord setup)

RecordTypeNameValue
MX 1MX@aspmx.l.google.com (priority 1)
MX 2MX@alt1.aspmx.l.google.com (priority 5)
MX 3MX@alt2.aspmx.l.google.com (priority 5)
MX 4MX@alt3.aspmx.l.google.com (priority 10)
MX 5MX@alt4.aspmx.l.google.com (priority 10)
SPFTXT@v=spf1 include:_spf.google.com ~all
TrackingCNAMEemails{TrackingDomain}
DMARCTXT_dmarcv=DMARC1; p=quarantine;
VerificationTXT@Google verification code

5. Outlook Setup Flow

5a. GoDaddy-owned domain — OutlookSetup()

StepActionRetries
1Add domain to Azure AD
2Get service config DNS records from Graph API5 × 60s wait
3Get verification TXT record from Graph API
4Deduplicate + Push DNS records to GoDaddy
5Verify domain in Azure AD5 × 60s wait
6Get DKIM signing config from Exchange Online5 × 60s wait
7Delete old DKIM CNAMEs + Add selector1/selector2 CNAMEs
8Wait 80s → Enable DKIM signing5 × 60s wait
9Update DomainRecords table

5b. Outlook DNS Records (from Graph API)

RecordTypeNameValue
MXMX@From Graph API or {domain}.mail.protection.outlook.com
SPFTXT@v=spf1 include:spf.protection.outlook.com -all
AutodiscoverCNAMEautodiscoverautodiscover.outlook.com
DKIM s1CNAMEselector1._domainkeyTenant-specific from Graph
DKIM s2CNAMEselector2._domainkeyTenant-specific from Graph
TrackingCNAMEemails{TrackingDomain}
DMARCTXT_dmarcv=DMARC1; p=quarantine;
VerificationTXT@Microsoft verification code

6. Postal Setup Flow

6a. GoDaddy-owned domain — PostalSetup()

StepAction
1Register domain in Postal: IPostalService.AddDomain
2Read GeneralSettings for SPF, MX, ReturnPath records
3Read PostalDomains for DKIM keys (identifier + public key)
4Push SPF TXT, DKIM TXT, MX, Return Path CNAME to GoDaddy

6b. Postal DNS Records

RecordTypeNameValue
MXMX@{PostalMxRecord} (pri 10)
SPFTXT@{PostalSpfRecord}
DKIMTXTpostal-{id}._domainkeyv=DKIM1; t=s; h=sha256; p={key}
Return PathCNAMEpsrp{PostalReturnPath}
TrackingCNAMEemails{TrackingDomain}
DMARCTXT_dmarcv=DMARC1; p=quarantine;

7. Hmail / Other Setup Flow

7a. GoDaddy-owned domain — HMailSetup()

StepAction
1Add domain to HMail server: IHMailServerService.AddNewDomain
2Read HMailServerDomain for SPF parameter + DKIM public key
3Push SPF TXT, DKIM TXT (k=rsa), MX to GoDaddy

7b. Hmail DNS Records

RecordTypeNameValue
MXMX@mx.soproserver.co.uk
SPFTXT@From Logins.Parameters2
DKIMTXT@v=DKIM1; t=s; k=rsa; p={key}
DMARCTXT_dmarcv=DMARC1; p=quarantine; (base flow)

7c. Other type

No type-specific Init handling for "Other": Only gets GoDaddy infra (emails CNAME, DMARC, redirect, BrandSSL). No DNS records pushed. At Set Complete, OtherSendingMechanism from CampaignDomain is used for DomainRecords population.

8. Set Complete — Post-Init Actions

StupidMethod Flow

1 Find Campaign
Match by EmailDomain or CampaignDomain join
2 Notify Ops
DomainCompleted notification
3 Populate DNS
AddDomainsToDomainRecords
4 Mark Complete
Completed=true, Status=OK

What DomainRecords gets populated:

FieldGSuiteOutlookPostalHmail
MX5 Google ASPMXGraph API or fallbackGeneralSettingsmx.soproserver.co.uk
SPFinclude:_spf.google.cominclude:spf.protection.outlook.comGeneralSettingsHMail params
DKIMgoogle._domainkeyselector1/selector2 CNAMEsRSA-SHA256 TXTRSA TXT
DMARCp=quarantinep=quarantinep=quarantinep=quarantine
CNAMETracking domainTracking domainTracking domain
CNAME2-5autodiscover, DKIM s1/s2Return path
Completed✅ true✅ true✅ true✅ true

9. Complete Domain Lifecycle

Created
Actions:
• Fill EditDomain/InitDomain modal
• Select Sending Mechanism
• Select Instance/Setup Type
• Save → InUse=true
Initialised
Actions (Hangfire job):
• DNS propagation check
• GoDaddy check
• Type-specific DNS setup
• External API calls
• DomainRecords skeleton
Completed
Actions:
• Find campaign
• Notify Ops Owner
• Populate DomainRecords
• Completed=true
• (GSuite) DKIM check
Ready
Can now:
• Add email accounts
• Create email profiles
• Start sending