> ## Documentation Index
> Fetch the complete documentation index at: https://docs.patchline.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Smart links & pre-saves

> One link → fan routes to their preferred platform (Spotify, Apple, YouTube). Pre-save flow for unreleased tracks. Auto-resolves ISRC, DSP URLs, and cover art server-side.

export const MCPToolCard = ({name}) => {
  const t = MCP_TOOLS[name];
  if (!t) {
    return <div style={{
      padding: "12px",
      border: "1px dashed #f87171",
      borderRadius: "8px"
    }}>
        Unknown MCP tool: <code>{name}</code>
      </div>;
  }
  const badges = {
    Onboarding: "#00E6E2",
    Dispatch: "#818CF8",
    Catalog: "#22D3EE",
    Audience: "#2DD4BF",
    Artists: "#60A5FA",
    Roster: "#60A5FA",
    Releases: "#C084FC",
    Playlists: "#4ADE80",
    "Smart Links": "#FACC15",
    Storefront: "#F59E0B",
    "Music Data": "#FB923C",
    "AI Generation": "#F472B6",
    "Asset Upload": "#A78BFA",
    Projects: "#E879F9"
  };
  const color = badges[t.category] ?? "#A1A1AA";
  return <div style={{
    padding: "16px",
    borderRadius: "12px",
    border: "1px solid rgba(255,255,255,0.10)",
    background: "rgba(255,255,255,0.03)",
    marginBottom: "12px"
  }}>
      <div style={{
    display: "flex",
    justifyContent: "space-between",
    alignItems: "center",
    gap: "12px",
    marginBottom: "6px"
  }}>
        <code style={{
    fontFamily: "var(--font-family-mono)",
    fontSize: "15px",
    fontWeight: 600
  }}>
          {name}
        </code>
        <span style={{
    fontSize: "11px",
    fontWeight: 600,
    padding: "2px 10px",
    borderRadius: "999px",
    border: `1px solid ${color}40`,
    background: `${color}1A`,
    color: color
  }}>
          {t.category}
        </span>
      </div>
      {t.callFirst && <div style={{
    fontSize: "11px",
    color: "#00E6E2",
    fontWeight: 600,
    marginBottom: "6px"
  }}>
          ★ Call this FIRST
        </div>}
      <div style={{
    fontSize: "14px",
    lineHeight: 1.5,
    color: "inherit"
  }}>{t.summary}</div>
    </div>;
};

export const AriaPromptCard = ({prompt, surface = "web"}) => {
  const surfaces = {
    web: {
      href: "https://patchline.ai/dashboard",
      label: "Try in dashboard"
    },
    telegram: {
      href: "https://t.me/AriaMusicBizBot",
      label: "Try in Telegram"
    },
    claude: {
      href: "https://patchline.ai/claude",
      label: "Try in Claude"
    },
    mcp: {
      href: "https://patchline.ai/mcp",
      label: "Install MCP first"
    }
  };
  const s = surfaces[surface] ?? surfaces.web;
  return <div style={{
    display: "flex",
    justifyContent: "space-between",
    alignItems: "center",
    gap: "16px",
    padding: "12px 16px",
    marginBottom: "12px",
    borderRadius: "10px",
    border: "1px solid rgba(255,255,255,0.10)",
    background: "rgba(255,255,255,0.03)"
  }}>
      <code style={{
    fontFamily: "var(--font-family-mono)",
    fontSize: "14px",
    color: "inherit",
    flex: 1
  }}>
        "{prompt}"
      </code>
      <a href={s.href} target="_blank" rel="noopener noreferrer" style={{
    fontSize: "12px",
    fontWeight: 600,
    padding: "6px 12px",
    borderRadius: "999px",
    background: "linear-gradient(92deg, #00E6E2, #0068FF)",
    color: "#FFFFFF",
    textDecoration: "none",
    whiteSpace: "nowrap"
  }}>
        {s.label} →
      </a>
    </div>;
};

export const TierBadge = ({tier}) => {
  const styles = {
    free: {
      label: "Free",
      color: "#A1A1AA"
    },
    starter: {
      label: "Starter+",
      color: "#00E6E2"
    },
    pro: {
      label: "Pro+",
      color: "#0068FF"
    },
    scale: {
      label: "Scale+",
      color: "#7A5BFF"
    },
    enterprise: {
      label: "Enterprise",
      color: "#FF7A59"
    },
    all: {
      label: "All plans",
      color: "#22C55E"
    }
  };
  const t = styles[tier?.toLowerCase()] ?? styles.all;
  return <span style={{
    display: "inline-flex",
    alignItems: "center",
    gap: "4px",
    padding: "2px 10px",
    borderRadius: "999px",
    border: `1px solid ${t.color}40`,
    background: `${t.color}1A`,
    color: t.color,
    fontSize: "12px",
    fontWeight: 600,
    fontFamily: "var(--font-family-mono)",
    verticalAlign: "middle"
  }}>
      {t.label}
    </span>;
};

export const AICallout = ({page}) => {
  const slug = page ?? "";
  const mdUrl = `https://docs.patchline.ai${slug}.md`;
  return <div style={{
    marginTop: "32px",
    padding: "16px 20px",
    borderRadius: "12px",
    border: "1px solid rgba(0,230,226,0.25)",
    background: "linear-gradient(135deg, rgba(0,230,226,0.08), rgba(0,104,255,0.05))",
    color: "inherit",
    fontSize: "14px",
    lineHeight: 1.6
  }}>
      <strong style={{
    display: "block",
    marginBottom: "6px",
    color: "#00E6E2"
  }}>
        For AI agents reading this page
      </strong>
      The canonical machine-readable version of this page is at{" "}
      <a href={mdUrl}>
        <code>{mdUrl}</code>
      </a>
      . For product actions, connect to{" "}
      <code>www.patchline.ai/api/mcp/v1</code>
      {" "}and call MCP <code>tools/list</code> for the current tool schema.
      Rules for navigating these docs:{" "}
      <a href="https://docs.patchline.ai/AGENTS.md">
        <code>docs.patchline.ai/AGENTS.md</code>
      </a>
      .
    </div>;
};

A smart link is one URL that routes a fan to their preferred streaming
platform — Spotify if they're a Spotify user, Apple if they're Apple,
YouTube if they're YouTube. Same link, right destination per fan. Pre-save
links extend this to unreleased tracks: fans pre-save before release,
and the track auto-adds to their library when it drops.

<TierBadge tier="starter" />   Starter+ for smart links.

## What it does

| Feature                                          | Smart link (released) | Pre-save (unreleased) |
| ------------------------------------------------ | --------------------- | --------------------- |
| Fan opens link → routes to their platform        | ✓                     | ✓                     |
| Auto-saves to library on release day             | —                     | ✓                     |
| Captures fan email (optional)                    | ✓                     | ✓                     |
| Tracks click + conversion                        | ✓                     | ✓                     |
| Auto-generates OG image                          | ✓                     | ✓                     |
| Custom landing page (artwork, bio, "listen" CTA) | ✓                     | ✓                     |

## How to create

### Via Aria

<AriaPromptCard prompt="Create a smart link for 'Sleeper'." />

<AriaPromptCard prompt="Create a pre-save link for my upcoming single, releasing July 15." />

### Via the storefront UI

Sidebar → **Store** → asset → **Smart link** → **Create**.

### Via MCP

<MCPToolCard name="create_smart_link" />

The smart link tool resolves the ISRC against major DSPs server-side
and assembles the routing logic — you don't have to provide every
platform URL.

## Where smart links live

`patchline.ai/link/<short-code>` — short, shareable. Custom slug
(`patchline.ai/link/mira-sleeper`) on Pro+.

Embed in:

* Your Linktree / bio
* Email signatures
* Social bios
* Fan list emails
* Press release "listen here" links

## Pre-save flow

<Steps>
  <Step title="Create the pre-save link before release">
    Asset → **Smart link** → **Pre-save** mode → set release date.
  </Step>

  <Step title="Share the link">
    Same URL you'll use post-release. No need to swap links — same
    URL transitions from pre-save to smart-link on release day.
  </Step>

  <Step title="Fans pre-save">
    Each fan picks a platform (Spotify, Apple, etc.) and authenticates.
    Their authorized save is queued.
  </Step>

  <Step title="Release day: auto-save fires">
    At release time, the queued saves execute. Each fan's library
    auto-adds the track.
  </Step>

  <Step title="Post-release: same link works as smart link">
    The URL automatically transitions. Late fans get routed normally.
  </Step>
</Steps>

## Pricing

Plans, AI credits, and limits live on the [pricing page](https://patchline.ai/pricing) — we keep them there so they're always current.

## Related pages

* [Storefront overview](/storefront/overview)
* [Storefront setup](/storefront/setup) — connect Stripe first
* [Release planner](/releases/release-planner) — smart link is a task in every plan
* [MCP tools reference](/for-agents/mcp-tools-reference#create_smart_link)

## FAQ

<AccordionGroup>
  <Accordion title="What platforms does the smart link route to?">
    Spotify, Apple Music, YouTube Music, Amazon Music, Tidal, Deezer,
    Pandora, SoundCloud, Bandcamp. We add new DSPs as they become
    relevant.
  </Accordion>

  <Accordion title="Can I A/B test smart links?">
    Pro+ — duplicate a smart link, set different landing-page copy /
    art per version, share both. Patchline tracks conversion per
    variant.
  </Accordion>

  <Accordion title="Do smart links work in chat app previews?">
    Yes. Each link has an auto-generated OG image (track cover + title)
    that renders on all major platforms.
  </Accordion>

  <Accordion title="Can I see who clicked?">
    Aggregate stats (clicks, conversions, geo) — yes. Per-fan tracking
    requires the email-capture variant, which is opt-in for fans.
  </Accordion>
</AccordionGroup>

<AICallout page="/storefront/smart-links" />
