Skip to main content

TL;DR

slideless share-email <shareId> --to alice@example.com
This emails the recipient a branded message with a unique tracked link to the presentation at <shareId>. Run slideless share first if you don’t have a shareId yet.

What this does

  • Sends a nicely branded email (via Resend, from noreply@mail.slideless.ai) to 1–20 recipients
  • By default, mints a unique named token per recipient so per-recipient open analytics come for free (via accessCount / lastAccessedAt on each token)
  • Records every send in the audit log, one entry per recipient, visible in the dashboard
If you’d rather send the same link to everyone (shared view count, one Revoke click kills all of them), pass --token-id <existing-id> to reuse an existing token instead of minting new ones.

Prerequisites

From the CLI

Single recipient, no message

slideless share-email 01a3b2c4d5e6f7 --to alice@example.com

Multiple recipients with a personal note

slideless share-email 01a3b2c4d5e6f7 \
  --to alice@example.com \
  --to bob@example.com \
  --to carol@example.com \
  --message "Here's the Q2 deck we talked about — would love your thoughts before Friday." \
  --json
If you already have a token (e.g. one named "Newsletter subscribers"), you can send that one to everyone instead of minting per-recipient tokens:
slideless share-email 01a3b2c4d5e6f7 \
  --to alice@example.com \
  --token-id 01a3c9d8e7f6g5 \
  --subject "Q2 pitch — Acme Inc" \
  --json
Tradeoff: you lose per-recipient tracking (all views roll up into one counter), but you can revoke the whole thing with a single Revoke click in the dashboard.

From the plugin (Claude Code / Cursor)

Invoke the share-presentation-email skill after share-presentation. Give it the share_id, an emails array, and an optional message:
> /slideless:share-presentation-email
  share_id: 01a3b2c4d5e6f7
  emails: ["alice@example.com", "bob@example.com"]
  message: "Here's the Q2 deck — would love your take."
The skill wraps slideless share-email --json under the hood. It surfaces a per-recipient summary, and if some addresses fail (bad syntax, Resend rejection), it tells you which and why.

From the dashboard

On any presentation detail page, click Share via email in the header. The modal:
  1. Lets you add recipients (chips input — Enter/comma/Tab to add)
  2. Optional custom subject (falls back to "<your email> shared: <title>")
  3. Optional personal note (≤2000 chars)
  4. By default, mints a per-recipient tracked token. If you already have active tokens, you can pick one to reuse instead.
After sending, the modal shows a per-recipient sent/failed breakdown — refresh the tokens table and you’ll see the new per-recipient tokens with their own access counts.

Response shape (success)

{
  "success": true,
  "data": {
    "shareId": "01a3b2c4d5e6f7",
    "sent": [
      {
        "email": "alice@example.com",
        "tokenId": "01a3c9d8e7f6g5",
        "resendMessageId": "re_abc123",
        "shareUrl": "https://app.slideless.ai/share/01a3b2c4d5e6f7?token=..."
      }
    ],
    "failed": [
      { "email": "bob@bad", "code": "invalid-email", "message": "Not a valid email address." }
    ],
    "summary": { "total": 2, "sent": 1, "failed": 1 }
  }
}
Note: failed[] is a per-recipient list inside an otherwise-successful response. The call only returns success: false when zero emails could be attempted (preflight failure like auth/permission/archived).

Limits

LimitValue
Recipients per call20
Personal message length2000 characters
Custom subject length200 characters
HTML payload (via share)10 MB
If you need to send to more than 20 addresses, split into batches and call the command multiple times.

Per-recipient analytics

Each recipient’s named token shows up in the dashboard’s Share links table, with its own accessCount and lastAccessedAt. To query programmatically:
slideless get <shareId> --json | jq '.tokens[] | {name, accessCount, lastAccessedAt}'
Revoking a single recipient’s token (dashboard → Share links → trash icon, or revoke endpoint) kills the link for that person only — everyone else keeps working.

Troubleshooting

Every failure includes error.code, error.message, and error.nextAction. The nextAction field is written for agents and humans alike — it tells you exactly what to try next.
error.codeWhenWhat to do
unauthenticatedMissing or invalid API keyRun slideless auth login-request + login-complete, or pass --api-key.
permission-deniedKey doesn’t own the shareVerify the key belongs to the org that owns shareId.
not-foundshareId doesn’t existDouble-check the id. If just created, retry once after 2s.
archivedShare is archivedUn-archive or create a new share with slideless share.
missing-recipientsNo --to flagsAdd one or more recipients.
too-many-recipients>20 recipientsSplit into batches of ≤20.
message-too-long--message >2000 charsShorten or omit.
invalid-emailBad email syntaxPer-recipient (lands in failed[]). Show the user which addresses were rejected.
email-send-failedResend API failurePer-recipient. Retry once; if persistent, Resend is having issues.
rate-limitedToo many callsBack off ~30s, retry.
internalBackend 5xxRetry once; report with shareId if it persists.