> For the complete documentation index, see [llms.txt](https://help.smartico.ai/welcome/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://help.smartico.ai/welcome/products/vibe-studio-beta/promotions.md).

# Promotions

A **Promotion** is a time-boxed, personalized campaign page built for **retention** - a page that revolves around one offer, like a weekend tournament, a December raffle, a jackpot, or a clan championship. You spin one up per promotion, drive your existing players to it, and retire it when the offer ends.

<div data-with-frame="true"><figure><img src="/files/v8mcJzzzHt5XAUpwpW2j" alt=""><figcaption><p>MatchX promotion page</p></figcaption></figure></div>

{% hint style="info" icon="bell" %}
**Check examples of the widgets, landings, promotions, and custom games on** [**https://smartico.dev**](https://smartico.dev/)
{% endhint %}

### When to use a promotion

**Use a** promotion for a **specific, dated offer aimed at players who already have accounts**. It is the page you link from a campaign - the destination behind a "Join the weekend tournament" push or email.

### How a promotion identifies the player

A promotion is a standalone page on a Smartico-managed domain. Because it shows personalized data (the player's rank, points, progress), it has to know **which player** is viewing it. That comes from parameters on the page URL. When you drive a player to the page, the link carries:

| Parameter                    | What it is                                                                                                                                                     |
| ---------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `_smartico_label_public_key` | Your label's public key (identifies your program).                                                                                                             |
| `_smartico_brand_public_key` | The brand's public key.                                                                                                                                        |
| `_smartico_user_ext_id`      | The player's external user id (who is viewing).                                                                                                                |
| `_smartico_user_hash`        | A time-limited security hash, when your label [uses hash protection](/welcome/products/vibe-studio-beta/navigating-players-to-promotion-and-landing-pages.md). |
| `_smartico_language`         | The language to render.                                                                                                                                        |

The player is already recognized, and the page shows their live data.

**Note:** the `_smartico_label_public_key` and `_smartico_brand_public_key` can be passed in the URL for your convenience and easier setup, but for production usage, we recommend placing them in the index.html file.

<div data-with-frame="true"><figure><img src="/files/XrzWtur4ncZ6PlLua139" alt=""><figcaption></figcaption></figure></div>

{% code title="Explicitly set your label and brand keys:" expandable="true" %}

```html
  <script>
    window._smartico_label_public_key = 'your label key';
    window._smartico_brand_public_key = 'you brand key';
  </script>
```

{% endcode %}

### Publishing (step by step)

* **Publish.** Click **Publish** in the toolbar. On success, the **Page link** popup ("Get link") opens with the public URL on the CDN.
* **Copy the URL.** The popup gives you a ready-to-test link. It carries the label/brand keys plus your **preview user**, so you can open it as-is to check the page.

<div data-with-frame="true"><figure><img src="/files/SLdYv1S4I37slp8JLDGN" alt=""><figcaption></figcaption></figure></div>

* **Go to production.** The preview user is for testing only. For real traffic, keep the label/brand keys, but replace `_smartico_user_ext_id` (and `_smartico_user_hash`) with the **real logged-in player's** values. In practice, you don't build links by hand - you drive players from a **campaign** that personalizes the link per recipient (push, inbox, email, or an on-site CTA). Vibe Studio gives you the base URL and the parameter names; the campaign fills in the values for each player.

{% hint style="info" %}
Read a detailed guide about [navigating users to Promotions and Landings](/welcome/products/vibe-studio-beta/navigating-players-to-promotion-and-landing-pages.md)
{% endhint %}

### Where the keys come from

You don't enter keys in Vibe Studio - it resolves them and shows them in the Page link popup so you know what the published page expects:

* **Label public key** - your label's Smartico public key (the same one your site uses for `_smartico.init`).
* **Brand public key** - each brand under your label has its own, managed in your brand settings.
* **User ext id / user hash** - the player's identifier and its [security hash](/welcome/products/vibe-studio-beta/navigating-players-to-promotion-and-landing-pages.md), supplied per player by your campaign at send time.

### If the promotion is about one specific thing

Many promotion templates are built around a single entity - one tournament, one raffle, one jackpot. Those declare an **extra field**: a toolbar picker where you choose which entity the page is about.

<div data-with-frame="true"><figure><img src="/files/Zv87TVy4mfh7fY49kXqS" alt=""><figcaption></figcaption></figure></div>

For the production usage, you can either pass the 'id' in the URL, e.g., `'&id=152'` or fix it in the `index.html`

### Translating a promotion

Ask the assistant to translate (or run `/translate`), then preview each language.

<div data-with-frame="true"><figure><img src="/files/QeHVDsDa7VrTc0WYGMeq" alt=""><figcaption></figcaption></figure></div>

Then select the language to preview your page

<div data-with-frame="true"><figure><img src="/files/yNEdK5lZGNw5cB9ptzzb" alt=""><figcaption></figcaption></figure></div>

Note the split: the **mechanic's own content** (mission and tournament names) is translated in the Back Office, on the mechanic's management screen; the **page's own text** (headings, labels, CTAs) is translated here in the Studio. See Preview for users, brands, and languages.

### Examples to ask the assistant for

* "A weekend slots tournament page: hero with the prize pool and a countdown to Sunday 23:59, a live leaderboard, my current rank and points, and the full prize breakdown."
* "A raffle page showing my tickets, the draw time with a countdown, the prizes, and how to earn more tickets."

### FAQ

**How do players arrive logged in?** The link carries the keys that identify the player. You don't manage that by hand - your campaign personalizes the link per player; just publish and share the base URL.

**Can I serve it from my own domain?** Yes - promotions and landings can live on a custom domain you delegate to Smartico (e.g. `tournament.mycasino.com`). See Domains & technical setup.

**The page loads but shows no personalized data.** The URL is missing the player parameters (or the hash has expired). Check that your campaign appends `_smartico_user_ext_id` (and `_smartico_user_hash` if your label uses it) along with the label/brand keys.

***


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://help.smartico.ai/welcome/products/vibe-studio-beta/promotions.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
