The Case of the Missing Unfurl
Published Feb 22, 2026
5 min read
Unfurling Links
When you send a link to a friend on iMessage, a nice preview appears, with normally a description, a title, and a header image. This is done generally through the Open Graph Protocol. The premise of it is really simple: add og meta tags to your head in your HTML page, and these links will magically become these super nice previews.
My Journey
To start, I knew I would want to add these to this personal website, so I looked up the protocol, and added the needed tags. I worked with ChatGPT to come up with a fun concept for the header, and used Carbon to make it. I sent it to a friend on iMessage as a test and it worked. I immediately spammed a few more friends just to be sure. From there, I wrote my first blog post and was so excited to share it. I sent it to a Slack I was in and … no unfurl.
What Happened
One of the most frustrating things I have found when working on my website is that some things that are supposed to be simple don’t work 100% correctly. For example, while getting tailwind set up was super simple, it took about an hour to figure out how to add dark mode, even when the docs made it seem simple.
This was the case for link unfurling. While I added the correct tags, Slack still didn’t work. To start to debug, I started to look up if there were any specifics to how Slack unfurls links. I found this article, which explicitly stated which fields we needed, and I had all of them. From there, I started to see if ChatGPT had any ideas.
Where ChatGPT Led Me
ChatGPT gave me 5 options:
- Slack Can’t Reach Your URL
- Missing or Incorrect Open Graph (OG) Metadata
- Metadata Is Rendered Client-Side (JavaScript)
- Content-Type or Response Headers Are Wrong
- Slack Workspace or User Settings Disable Unfurls
From these options, there were a few that I could rule out right away.
Option 3: I use Astro to render the site, and know that my whole head is rendered on the server with no client side rendering.
Option 4: I did a basic curl command to my website, and the Content-Type was text/html.
Option 5: I have seen many links unfurled in the slack workspace.
Could It Be The Open Graph Metadata?
This was the first direction I tried. I found a website that I knew would unfurl in slack (since it had in the same Slack channel) and looked at their head. I first noticed that my og:url tag was incorrect. It should point to the current url, but I had it point to my domain. ChatGPT was convinced this was the reason, so I made the change, deployed the website and … still no unfurl.
The other big difference was that the other website had an og:image:secure_url which pointed to the same url as the og:image. I was pretty convinced that would not be the reason since I had not seen this tag on the Open Graph website, but I thought I would give it a shot. I tried again and … still no unfurl.
Deep Research
At this point, I decided to add a new datapoint to see if the unfurling was a Slack-specific issue. I sent myself a link to the blog post in WhatsApp and the link unfurled! Now that I realized that it seemed to be fully Slack-specific, I started to focus on whether I could find a website that I could simulate how the Slackbot would crawl my website. First, I found this helpful website, but when I put my website in, it looked perfect. I found many different websites that explicitly claimed that Slack did not offer their own way to check how Slackbot would render your links. I took that at face value and then started to think through other options.
I asked ChatGPT if this was a known issue with people using Cloudflare to host their websites. It explained that it is common that Cloudflare blocked Slack due to its Bot Fight Mode. It then sent me this website from Slack to view unfurled links (you need to sign in to a Slack workspace to use that tool). I finally was able to see what was happening, and once I found this tool, it was pretty obvious what was wrong. My website was returning a 403 (Forbidden) status code! Now that I was able to test quickly, I turned off Bot Fight Mode and the website worked instantly.
Conclusion
While this was a frustrating excursion for me through understanding the ins and outs of crawling the web and the Open Graph protocol, it did teach me one super important lesson. Break your own assumptions and focus on each layer of the problem. I overlooked Cloudflare due to it being a well-tested technology. I assumed it couldn’t be the problem and I had to be doing something wrong with my og tags or rendering. Once I started to break this assumption, I was able to find the problem really quickly.