skills-ws
Version:
87 agent skills for AI coding assistants — marketing, growth, web3, dev, design & operations. Built for OpenClaw, Claude Code, Cursor, and Codex.
86 lines (68 loc) • 2.5 kB
Markdown
- 8. Deep Linking <a name="deep-linking"></a>
- Link Format
- Handling /start Deep Links
- Reading startapp in Mini App
Deep links let you pass parameters when users open your bot via a link.
```
https://t.me/YourBotName?start=PARAMETER
https://t.me/YourBotName?startapp=PARAMETER (opens Mini App directly)
```
- `?start=` → opens chat with bot, triggers `/start PARAMETER`
- `?startapp=` → opens Mini App directly, `PARAMETER` available in initData.start_param
```ts
// Already shown in bot.ts above, but here's the full pattern:
bot.command("start", async (ctx) => {
const param = ctx.match; // everything after "/start "
if (!param) {
// No deep link — show default welcome
return;
}
// Parse compound parameters: "action_data"
const underscoreIdx = param.indexOf("_");
const action = underscoreIdx > -1 ? param.slice(0, underscoreIdx) : param;
const data = underscoreIdx > -1 ? param.slice(underscoreIdx + 1) : "";
switch (action) {
case "buy":
await sendStarsInvoice(ctx.chat.id, data);
break;
case "ref":
await processReferral(ctx.from.id, data);
await ctx.reply("Welcome! 🎉");
break;
case "open":
// Redirect to Mini App with context
await ctx.reply("Opening app...", {
reply_markup: {
inline_keyboard: [[
{ text: "Open", web_app: { url: `${process.env.MINI_APP_URL}?item=${data}` } }
]]
}
});
break;
default:
await ctx.reply("Welcome! Use /help to see available commands.");
}
});
```
```tsx
// In v3 the ?startapp= value arrives as `tgWebAppStartParam` in launch params.
// useLaunchParams() (sdk-react) is the reactive way to read it in a component.
import { useLaunchParams } from "@telegram-apps/sdk-react";
function App() {
const lp = useLaunchParams();
const startParam = lp.tgWebAppStartParam; // e.g., "item_123" from t.me/Bot/app?startapp=item_123
useEffect(() => {
if (startParam) {
// Route to the appropriate view
router.push(`/item/${startParam}`);
}
}, [startParam]);
}
```
> Distinguish the two params: `?start=` (chat deep link, handled by the bot's `/start` handler) vs `?startapp=` (Mini App deep link, read here as `tgWebAppStartParam`). They are *separate* — a `startapp` value does **not** reach your bot's `/start` handler.
---