diff --git a/alert/alert.go b/alert/alert.go
index 4841efb815496b7a9de5d9550f91a56df2523aed..b748b0418565ccf4333d210d415e5eff74372b7f 100644
--- a/alert/alert.go
+++ b/alert/alert.go
@@ -8,6 +8,8 @@ import (
 	"log/slog"
 	"log/syslog"
 	"net/http"
+	"reflect"
+	"strings"
 	"time"
 )
 
@@ -107,6 +109,38 @@ func PostSlackHook(message string) {
 	log.Printf("Slack Response StatusCode: %d", resp.StatusCode)
 }
 
+// Format the canary alert message
+func formatSlackMessage(canary interface{}) string {
+	v := reflect.ValueOf(canary)
+	t := v.Type()
+
+	var message strings.Builder
+	message.WriteString("*Canary Alert*\n\n")
+
+	for i := 0; i < v.NumField(); i++ {
+		field := v.Field(i)
+		typeField := t.Field(i)
+		if typeField.Name == "Canary" {
+			for j := 0; j < field.NumField(); j++ {
+				subField := field.Field(j)
+				subTypeField := field.Type().Field(j)
+				message.WriteString(fmt.Sprintf("*%s*: `%v`\n", subTypeField.Name, subField.Interface()))
+			}
+		} else {
+			message.WriteString(fmt.Sprintf("*%s*: `%v`\n", typeField.Name, field.Interface()))
+		}
+	}
+	return message.String()
+}
+
+func (h HTTPCanary) FormatSlackMessage() string {
+	return formatSlackMessage(h)
+}
+
+func (d DNSCanary) FormatSlackMessage() string {
+	return formatSlackMessage(d)
+}
+
 // Handler for HTTP canary alerts
 func HTTPAlert(canaryinfo HTTPCanary, alertType string) {
 	if alertType == "log" || alertType == "all" {
@@ -131,7 +165,10 @@ func HTTPAlert(canaryinfo HTTPCanary, alertType string) {
 
 	if alertType == "slack" || alertType == "all" {
 		//Slack alert if configured
-		PostSlackHook(fmt.Sprintf("``` %+v ```", canaryinfo))
+		// PostSlackHook(fmt.Sprintf("``` %+v ```", canaryinfo))
+		
+		// Slack alert if configured
+		PostSlackHook(canaryinfo.FormatSlackMessage())
 	}
 }
 
@@ -156,7 +193,9 @@ func DNSAlert(canaryinfo DNSCanary, alertType string) {
 
 	if alertType == "slack" || alertType == "all" {
 		//Slack alert if configured
-		PostSlackHook(fmt.Sprintf("``` %+v ```", canaryinfo))
+		// PostSlackHook(fmt.Sprintf("``` %+v ```", canaryinfo))
+		// Slack alert if configured
+		PostSlackHook(canaryinfo.FormatSlackMessage())
 	}
 
 }
diff --git a/go.mod b/go.mod
index 80a1edbff2abda9373232321c84f763a8398d85b..db76f4774073954db53dbb4e89f2d5e77f29b8ab 100644
--- a/go.mod
+++ b/go.mod
@@ -17,8 +17,10 @@ require (
 	github.com/fsnotify/fsnotify v1.7.0 // indirect
 	github.com/hashicorp/hcl v1.0.0 // indirect
 	github.com/inconshreveable/mousetrap v1.1.0 // indirect
+	github.com/ipinfo/go/v2 v2.10.0 // indirect
 	github.com/magiconair/properties v1.8.7 // indirect
 	github.com/mitchellh/mapstructure v1.5.0 // indirect
+	github.com/patrickmn/go-cache v2.1.0+incompatible // indirect
 	github.com/pelletier/go-toml/v2 v2.1.0 // indirect
 	github.com/sagikazarmark/locafero v0.4.0 // indirect
 	github.com/sagikazarmark/slog-shim v0.1.0 // indirect
@@ -31,6 +33,7 @@ require (
 	golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect
 	golang.org/x/mod v0.16.0 // indirect
 	golang.org/x/net v0.22.0 // indirect
+	golang.org/x/sync v0.6.0 // indirect
 	golang.org/x/sys v0.18.0 // indirect
 	golang.org/x/text v0.14.0 // indirect
 	golang.org/x/tools v0.19.0 // indirect
diff --git a/go.sum b/go.sum
index f5b9ced89755f9d936cd087789c5e719627a4817..0a301052b51f3f4bcb71cf137250a15e80811b4f 100644
--- a/go.sum
+++ b/go.sum
@@ -10,6 +10,8 @@ github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
 github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
 github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
 github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
+github.com/ipinfo/go/v2 v2.10.0 h1:v9sFjaxnVVD+JVgpWpjgwols18Tuu4SgBDaHHaw0IXo=
+github.com/ipinfo/go/v2 v2.10.0/go.mod h1:tRDkYfM20b1XzNqorn1Q1O6Xtg7uzw3Wn3I2R0SyJh4=
 github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
 github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
 github.com/landlock-lsm/go-landlock v0.0.0-20240216195629-efb66220540a h1:dz+a1MiMQksVhejeZwqJuzPawYQBwug74J8PPtkLl9U=
@@ -20,6 +22,8 @@ github.com/miekg/dns v1.1.59 h1:C9EXc/UToRwKLhK5wKU/I4QVsBUc8kE6MkHBkeypWZs=
 github.com/miekg/dns v1.1.59/go.mod h1:nZpewl5p6IvctfgrckopVx2OlSEHPRO/U4SYkRklrEk=
 github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
 github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
+github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc=
+github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ=
 github.com/pelletier/go-toml/v2 v2.1.0 h1:FnwAJ4oYMvbT/34k9zzHuZNrhlz48GB3/s6at6/MHO4=
 github.com/pelletier/go-toml/v2 v2.1.0/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc=
 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
@@ -66,7 +70,9 @@ golang.org/x/mod v0.16.0 h1:QX4fJ0Rr5cPQCF7O9lh9Se4pmwfwskqZfq5moyldzic=
 golang.org/x/mod v0.16.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
 golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc=
 golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
+golang.org/x/sync v0.0.0-20220513210516-0976fa681c29/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ=
+golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
 golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4=
 golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=