콜투액션이 존재하지만 여전히 막다른 골목에 있을 수 있습니다. URL뿐만 아니라 클릭 가능 여부를 감사합니다.

작성자

카테고리:

← 피드로
DEV Community · Penloom Studio · 2026-08-04 개발(SW)

Penloom Studio

I run an automated content pipeline. It checks, among other things, that every published video description contains a call-to-action — a link to the offer. For weeks that check was green. Conversions were still zero.

The check was lying to me, and the reason is worth thirty seconds of your attention if you automate any content.

The bug

My audit did roughly this:

// ❌ looks reasonable, is wrong
const hasCTA = description.includes("penloomstudio.com");

Enter fullscreen mode Exit fullscreen mode

Every description that mentioned the store passed. But a few of them said things like:

Get the pack → [penloomstudio.com/fix](https://penloomstudio.com/fix)

Enter fullscreen mode Exit fullscreen mode

That is a bare domain in prose. YouTube — like most platforms — does not linkify a bare URL in a description. No http://, no auto-link. So the viewer sees grey, unclickable text. The CTA was present and useless at the same time. My audit only knew how to check the first thing.

The fix

Audit for a clickable link, not for the domain string:

// ✅ requires a real scheme so the platform will linkify it
const hasClickableCTA = /https?:\/\/\S*penloomstudio\.com/i.test(description);

Enter fullscreen mode Exit fullscreen mode

One character of intent — the https?:// — is the entire difference between “we mentioned the offer” and “a human can reach the offer.”

The part that actually generalizes

The same failure showed up in a second channel weeks later: cross-posting articles where I’d written [penloomstudio.com/x](https://penloomstudio.com/x) in the body. Same dead-end, same cause. So the durable fix wasn’t a smarter audit — it was a single chokepoint every outbound post flows through, that upgrades bare domains to real links before anything ships:

// idempotent: leaves existing markdown links and full URLs untouched,
// only promotes a bare domain to a clickable one
// (swap example.com for your own domain)
function linkify(body) {
  return body.replace(
    /\[[^\]]*\]\([^)]*\)|https?:\/\/\S+|(?<![\w@/.])(example\.com\/[^\s)*`\]]+)/g,
    (m, bare) => (bare ? `[${bare}](https://${bare})` : m)
  );
}

Enter fullscreen mode Exit fullscreen mode

The alternation matters: it consumes any already-linked URL whole first, so the bare-domain branch can never partial-match text that’s already inside a link. (That was the second bug — the naive version nested and truncated links that were already fine.)

The lesson, one line

An automated check that tests for the presence of a thing, when what you needed was the usability of that thing, is worse than no check — because it’s green.

“Is the link there?” and “can a human click it?” are different questions. If your funnel is quietly converting nobody, go look at whether your own tooling is answering the easier one.

I write these up as I hit them, building a small studio’s content system in public. Notes and the tools live at penloomstudio.com.

원문에서 계속 ↗

코멘트

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다