Conversion links
# Conversion links
OWNER or DELEGATEE needs MANAGE_CONVERSION_LINKS for the exact selected channel. Marketing-tools permission alone does not suffice. Source account resources exclude the three tools and conversion-link recovery; no domain prerequisite is added. Creation requires a verified eligible source plan; existing-link reads/editing/cleanup are not gated by creation eligibility. See the [exact policy](../tools/publ_conversion_link_apply.md#creation-policy). Missing/unknown plans fail closed and the person receives the human plan destination, without a purchase or billing call.
| Need | Tool |
| --- | --- |
| List/read a link or its connected segments/promotions | [conversion_links_get](../tools/publ_conversion_links_get.md) |
| Compose creation or edit sharing metadata/thumbnail | [conversion_link_apply](../tools/publ_conversion_link_apply.md) |
| Activate/deactivate or delete selected links | [conversion_links_manage](../tools/publ_conversion_links_manage.md) |
## Read and plan
Read a bounded list and use its creationRevision only for create. For update/visibility/delete, read each selected numeric id in detail and use its revision; a list row or keyword is not a revision.
```json
{
"channelCode": "selected-channel-code",
"view": {
"kind": "list",
"page": 1,
"limit": 15
}
}
```
The create workflow combines source wizard fields. This sample is a dry run; replace its zero digest with the returned creationRevision. dryRun defaults to false when omitted.
```json
{
"channelCode": "selected-channel-code",
"requestId": "conversion-guide-01",
"action": "create",
"expectedRevision": "0000000000000000000000000000000000000000000000000000000000000000",
"settings": {
"name": "Welcome link",
"title": "Welcome to our channel",
"description": "Read our latest updates.",
"destination": {
"kind": "WEB",
"url": "https://example.com/welcome"
}
},
"dryRun": true
}
```
After inspecting the plan, apply the intended operation and retain the requestId and original input. UTM defaults to direct / (none) with empty campaign/content/term. A keyword is server-generated. Creation normalizes only canonical numeric receipt id/channelId while preserving a nonempty opaque auto-created segment identity. Old unknown-ID tasks are not repaired or adopted by this correction. Creation may additionally create a segment; returned segment metadata does not verify its contents or authorize automatic campaign creation. Destination/UTM/keyword cannot be edited afterward through this workflow. Update supports name, sharing title/description and original thumbnail only.
Original PNG/JPEG thumbnails must be below 10,000,000 decimal bytes. Omission preserves an existing image; null removal and replacement URLs are unsupported. Upload needs configured resource gateway/bucket/region. Only verified original-byte receipts enter the save; separate upload/save effects have no rollback or object cleanup.
## Continue a task
Use taskType conversion-link with the returned taskId:
```json
{
"taskId": "conversion-guide-01",
"taskType": "conversion-link"
}
```
Status reads history. Resume may continue untouched stages after context/content checks. Sent create/update/activation/delete/grant/upload requests never repeat. Known-ID writes can reconcile by readback; a create missing its durable returned ID cannot be adopted by name. Uncertain image stages require inspection, while an unstarted upload requires the original apply bytes after restart. See the [phase contract](../tools/publ_conversion_link_apply.md#results-and-task-recovery).
For visibility, unchanged targets are omitted from the effect but included in verification. One or many changed IDs use bulk activation with200/204 acknowledgement; deletion always uses bulk-delete with200/204 acknowledgement. Cross-save matching tolerates generated updatedAt only; revisions and pre-write conflict checks retain it. Deletion requires DELETE_CONVERSION_LINKS and should first be planned; success needs recognized404 detail checks plus a stable full inventory scan bounded to 5,000 links.
## Share URL configuration
The host supplies conversionLinkBaseUrl in runtime service configuration or PUBL_CONVERSION_LINK_BASE_URL. Use the actual environment's HTTPS base ending in /, without credentials, query or fragment. It is separate from API and console origins and is not silently inherited across a custom API override. The returned keyword is validated and encoded as one path component. With no configured base, shareUrl is null; console navigation still works. Never guess a production hostname from an ID or another origin.
A generated share URL proves neither redirect behavior nor attribution. Destination/share/image URLs are never fetched by these tools. Detail/editor navigation uses the selected channel/id; connected tabs use their own console child paths. Demo produces no live share/navigation link.
## Connected views and limits
segments reads one source-filtered page for the chosen link, defaulting to100 rows rather than the ordinary list default15. Both accept explicit15/30/50/100. It performs no condition-tree editing or member export. promotions exposes a restricted connected-benefit/campaign projection. Its source request is unpaged even though the UI has controls, so the bridge exposes source pagination and moreReported with nextPage:null rather than inventing a complete export. No financial mutation is part of these tools.
Fresh readback confirms stored fields within its stated scope; completed task history is confirmed:false.
Current read results include their selected view and retain list/segment page, size and supported filters in the single console link. Open that returned address for the same selection. CONVERSION_PAGE_OUT_OF_RANGE means the selected page is past the observed total; explicitly request page1 again. It is not a successful empty inventory, and the bridge does not choose a replacement page. The source-unpaged promotion tab remains unchanged.