Last updated: September 2026

Why isn't my link clickable when Make.com posts to Bluesky?

Because the post carries no link facet. Bluesky only makes a URL clickable when the post record includes a facet pointing at it; it does not detect links in plain text. Make's Bluesky module sends your text field as plain text, so the URL shows up as dead characters. Fix it by adding the facet, or by posting through an API that adds it for you.

You are not the first to hit this. Below: what the Make Community thread on it actually found, what a facet is, and two fixes you can build today.

What the Make Community thread found

The thread is "BlueSky new module unable to create post with link" on community.make.com, opened on 19 February 2025. The original poster described it exactly: with the native Bluesky module you can include a URL in your post, "but it will be displayed as a non-clickable text." Using the module's Link post option instead failed with [400] InvalidRequest Error: uris/0 must be a valid at-uri.

Other users confirmed the same result, one adding that links in the text neither became hyperlinks nor generated cards. The poster opened a support ticket, and Make support replied that the Link option refers to the app.bsky.embed.external schema, that Make has no module for creating that embed, and that the Make an API call module is needed. Their summary: "Bluesky module does not support posting a link at the moment."

The workaround accepted as the answer came on 6 March 2025: use the module's facet option, choose a keyword in the post, and attach the actual URL to that keyword. The thread was closed automatically on 18 March 2025. Module behaviour can change after a thread closes, so check the current module before relying on either detail.

Two different things people call a link

A facet makes a span of text clickable. A link card is an app.bsky.embed.external embed with a title, description and thumbnail under the post. The thread's error came from the card route; the non-clickable URL is the facet problem. This page fixes the facet.

What a facet looks like

A facet sits next to the text in the post record. It names a byte range inside the text and what that range is: a link, a mention or a hashtag. For the URL to be clickable, the record Make sends has to look like this:

app.bsky.feed.post
{
  "text": "Release notes are up: https://example.com/changelog",
  "facets": [
    {
      "index": { "byteStart": 22, "byteEnd": 51 },
      "features": [
        { "$type": "app.bsky.richtext.facet#link", "uri": "https://example.com/changelog" }
      ]
    }
  ]
}

The offsets are UTF-8 bytes, not characters. That is why building facets by hand in a no-code tool is fragile: one emoji or accented letter before the URL shifts every byte count after it, and the link lands on the wrong text or fails validation.

Fix 1: build the facet yourself

Two ways, both staying inside Make and both free on the Bluesky side:

  • The module facet option. The workaround from the thread: pick a keyword in your post and attach the URL to it. Good when the post text is fixed enough that you know which word to link.
  • Raw atproto over HTTP. Create a session with your handle and an App Password, then create the post record with a facets array like the one above. You compute the byte offsets in the scenario, which is where it usually breaks, and the App Password lives in your Make connection.

Fix 2: one HTTP module calling OpenTweet

Replace the Bluesky module with a single HTTP module. OpenTweet finds the URLs and @mentions in your text and adds the facets before posting, so you map a title and a URL into the text and they arrive clickable. Connect Bluesky to OpenTweet once in the dashboard over atproto OAuth; no App Password goes into Make.

Field
Value
Module
HTTP > Make a request
URL
https://opentweet.io/api/v1/posts
Method
POST
Headers
Name: Authorization, Value: Bearer ot_your_key
Body content type
application/json
Body input method
JSON string, with the body below
Parse response
Yes, so results can be mapped in later modules

The JSON body, with module 1 as your trigger (an RSS item, a sheet row, a webhook):

Request body
{
  "text": "{{1.title}} {{1.url}}",
  "platforms": ["bluesky"],
  "publish_now": true
}

To send the same post to X and LinkedIn and schedule it instead of posting now, change platforms and swap publish_now for a date:

Request body
{
  "text": "{{1.title}} {{1.url}}",
  "platforms": ["bluesky", "x", "linkedin"],
  "scheduled_date": "2026-09-21T09:00:00Z"
}

Quotes in mapped text break a JSON string

If a mapped title can contain a double quote, the JSON string body becomes invalid. Build the body with the Data structure input method instead, or escape the value before mapping it.

The response has a results array with one entry per network. A published Bluesky entry carries the url of the post, so a later module can log it or send it to Slack. Full field list in the cross-posting docs.

What this fix does not do

As of September 2026 OpenTweet adds link facets, not link cards, and does not shorten links. A post over 300 graphemes is skipped on Bluesky with a reason rather than split, so keep mapped titles short. Check a sample with the Bluesky character counter.

7-day free trial. Cancel anytime.

Frequently asked questions

Why isn't my link clickable when Make.com posts to Bluesky?

Because the post has no link facet. Bluesky does not scan text for URLs when it displays a post; a link is clickable only when the record includes a facet giving the byte range of the URL and its target. When Make sends your text through the Bluesky module text field, the URL arrives as plain characters.

What does "uris/0 must be a valid at-uri" mean in Make?

It is the error users in the Make Community thread got from the Bluesky module Link post option. Make support replied that the Link option refers to the app.bsky.embed.external schema, that there is no Make module for creating that embed, and that the Make an API call module is needed. Their summary: the Bluesky module does not support posting a link at the moment.

Can I fix it inside the native Make Bluesky module?

According to the accepted workaround in the Make Community thread, yes: use the module facet option, choose a keyword in your post text, and attach the actual URL to that keyword. The keyword becomes the clickable text instead of the raw URL.

Will fixing the facet also give me a link card?

No. A facet makes text clickable. A link card is a separate embed (app.bsky.embed.external) with a title, description and optional thumbnail. A post can have a clickable link and no card, which is what the facet fix and OpenTweet both produce.

How do I post a clickable Bluesky link from Make without computing facets?

Replace the Bluesky module with one HTTP Make a request module that calls OpenTweet at https://opentweet.io/api/v1/posts with your API key and platforms set to ["bluesky"]. OpenTweet detects URLs and @mentions and adds the facets, so the link in your text arrives clickable. You connect Bluesky to OpenTweet once over atproto OAuth, so Make never holds a Bluesky password.

Does OpenTweet shorten links or add link cards for Bluesky?

No, not as of September 2026. It adds link and mention facets only. It also does not split long text: a post over 300 graphemes is skipped on Bluesky with a reason in the response.

Clickable Bluesky links from one Make module

Connect Bluesky over OAuth once, then one HTTP call posts to Bluesky, X and LinkedIn with the facets built for you. From $11.99 a month, Bluesky on every plan.

7-day free trial. Cancel anytime.