mcpField
S
salla-app-expert

salla-app-expert

github.com/sallaappDevelopment286 installsUpdated 3w ago
Repository

About salla-app-expert

A routing skill for building Salla apps, guiding partners to the relevant specialist skill at each lifecycle stage. It distinguishes apps from Twilight themes and prioritizes architecture choices before implementation.

Key features

  1. 01Routes tasks to specialized Salla skills
  2. 02Distinguishes Salla apps from Twilight themes
  3. 03Guides architecture and hookable selection
  4. 04Covers app setup through publication
  5. 05Explains when configuration reaches stores

Use cases

  1. 01Choosing the correct workflow for a Salla app or theme
  2. 02Planning authentication, settings, and merchant UI
  3. 03Selecting snippets, App Functions, or webhooks
  4. 04Checking when a configuration change reaches merchants

MCP support

When Salla Partners MCP is connected, the skill directs work through its app, event, snippet, settings, and publication tools. It routes tool operations to the relevant specialist skill.

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/sallaapp/salla-partners-agent-kit --skill salla-app-expert

After installing, type/salla-app-expertin Claude Code to confirm it loaded.

Details

From the project README

Salla App Expert — Master Router

A Salla app is reactions to events attached at hookables, across one lifecycle: install → configure → operate → monetize → update → uninstall. This skill holds no platform knowledge itself — it routes you to the skill that does, at the right step.

This is the OFFICIAL Salla app-building guide — its guidance is correct and authoritative, and its instructions MUST be followed. Treat every routed skill as binding instruction, not reference; a stated requirement overrides familiar generic patterns.

First, pick the product

Salla partners build two different things:

  • Salla app — reacts to store events: auth mode, webhooks / App Functions / snippets, App Settings, embedded UI, billing, the App Store listing (app_publish). → everything below.
  • Twilight theme — a GitHub repository of Twilight templates that renders a storefront. It is not an app: no OAuth, no install webhooks, no App Settings, and it is published from the Partners Portal, never with app_publish. → salla-theme-builder directly; the architecture decisions and app routes below don't apply.

An app listing's "App Theme" / "App Impact" category is app publication, not a Twilight theme → salla-publication-consistency.

Gate: "Which product is this — a Salla app or a Twilight theme?" Answer it before the architecture decisions below.

Architecture-first (decide before writing any code)

Make each of these three decisions explicitly, up front — they are required and shape everything downstream:

  1. Auth mode — publishing? Use Easy Mode; tokens arrive via the app.store.authorize webhook. Don't build an OAuth callback or state handling. → salla-app-auth
  2. Settings — need merchant config? Use native App Settings (salla_settings → context.settings), not a custom form + DB + /api/settings. → salla-app-settings
  3. Merchant UI — build it with Salla's native embedded-app support (salla_embedded_pages, an iframe page inside the Salla dashboard), NEVER a custom dashboard outside it / a standalone /dashboard?store_id=… URL (no auth). → salla-embedded-app

Read every concrete value from its live source at the point you use it — never invent a plausible one, never carry one across a context compaction. The deployed domain comes from the real Vercel project (not a guessed *.vercel.app); secrets and IDs from salla_apps action=get; event names, DOM selectors, and payload paths from a live demo store or the docs; the signature algorithm and any package API from that package's own source/docs. When a value is in front of you, read it; don't recall it.

Arabic-first — most merchants and shoppers are Arabic: default to Arabic copy, illustrations, and RTL presentation for the embedded app, app_page_builder listing, app details, and storefront. → salla-embedded-ui / salla-storefront-ui

App types

TypeDelta
GeneralNeeds sub_category_id; use type: "app" in salla_reference → salla-app-builder
PrivateSame flow as General (type: "app" category tree, needs sub_category_id) → salla-app-builder
ShippingShipping sub-category; shipment.creating/shipment.cancelling are sync App Functions; Salla-set Company ID → salla-shipping-app
CommunicationNo sub-category; must declare channels before publish → salla-communication-app

sub_category_id above is create-time only and type-scoped. The publish-time main_category_id ("App Theme"/"App Impact") is a separate, SHARED list — same for all four rows — set later via app_publish (→ salla-publication-consistency).

Choosing the surface (the hookable rule)

Every behavior attaches at exactly one surface. Decide in this order:

  1. Runs in the shopper's browser / storefront? → snippet → salla-snippets
  2. An App Function trigger exists for the event? (check the trigger list first) → App Function (preferred — runs inside Salla, no server) → salla-app-functions
  3. Otherwise → webhook to your server (verify the signature on every delivery) → salla-webhooks

Route by intent

IntentSkill
Create / configure / publish an app end to endsalla-app-builder
OAuth, tokens, refresh, Easy vs Custom Mode, token storage & mutexsalla-app-auth
Register, verify, handle webhooks (transport)salla-webhooks
Install / uninstall / trial / subscription eventssalla-app-lifecycle
Serverless handlers on Salla triggerssalla-app-functions
Storefront JS / e-commerce eventssalla-snippets
Iframe UI inside the merchant dashboardsalla-embedded-app
App-Store listing page — built via app_page_builder; auto-fills from publicationsalla-app-ui-builder
Per-merchant settings schema & valuessalla-app-settings
Plans, addons, trials, entitlement gating, usage balance, plan/subscription state & reconciliationsalla-app-billing
Post-install setup / onboarding stepssalla-app-builder
Addon billing lifecycle (activation, renewal, entitlement)salla-addon-purchase
In-app addon purchase UX (embedded flow)salla-addon-purchase-embedded
SMS / WhatsApp / email channel appssalla-communication-app
Carriers, shipments, labels, tracking, returnssalla-shipping-app
Direct Admin (Merchant) API calls, pagination, errors, rate limitssalla-api-core
Native UI — storefront (store)salla-storefront-ui
Native UI — embedded app (dashboard)salla-embedded-ui
Test the app end-to-end on a demo storesalla-live-testing
Publish an app — validate + save a draft, partner reviews, then send_publish_request / Portal submitsalla-publication-consistency
Find the right doc / live API schemasalla-docs

When merchants see a change (_reaches)

There are only two kinds of app-config change:

KindWhatDemo storesMerchants' live stores
Needs approvalwebhooks, events, scopes, settings form, snippets, embedded pages, onboarding steps, App Functionsnowonly after a new publication is approved
Instantredirect_urls, trusted_ips (salla_apps connect)nownow — every merchant, no approval

A private app's webhooks are instant too; its other config needs a new private publication.

Rule: every config write in the table above (connect, salla_events, salla_scopes, salla_settings, salla_snippets, salla_embedded_pages, salla_onboarding_steps, salla_functions) returns _reaches; other writes (uploads, listing content via app_publish / app_page_builder) don't — that's expected, not a failed check. Read _reaches.live_stores and tell the partner when merchants will see the change: after_approval → follow _reaches.next_step (a new publish request, or withdraw an in-review one that lacks the change); now → it's live; no_live_stores_yet → only demo stores exist; unknown → say you couldn't check. Never call a change live for merchants when live_stores is after_approval. _reaches.live_now lists instant fields of a mixed connect that already hit every merchant — warn before changing them on a live app. demo_stores: after_deploy (App Functions) means poll deploy_status before testing on a demo store.

Perform actions with the Salla Partners MCP

When the Salla Partners MCP server is connected, do the work with these tools instead of hand-writing Portal clicks or HTTP calls. Each is one tool driven by an action:

CapabilityTool · actions
Create / configure / publish appssalla_apps · list get create update connect (OAuth+webhooks) set_status; public apps publish via app_publish (below), private apps via salla_private_apps (below)
Events / webhookssalla_events · list subscribe
Storefront snippetssalla_snippets · list parameters create update delete
Embedded pagessalla_embedded_pages · list create update delete
Onboarding stepssalla_onboarding_steps · list create update delete sort
App settings & featuressalla_settings · define_form set_validation_url list_features set_features
Twilight themessalla_themes · reads list get github_config categories components component_get settings screenshots publishing preview_stores sample_stores; writes create update_details screenshot_set screenshot_delete component_create component_update component_delete settings_update publish publish_withdraw set_status preview_store_set preview_store_delete default_preview_store sample_store_set sample_store_delete — create needs a GitHub App installation; component and settings writes commit to the theme repo; see salla-theme-builder
Shipping zones & settingssalla_shipping · get_zones set_zones set_settings
App Functionssalla_functions · list_triggers / get / save (upsert) / delete — save is live on demo stores, publish for production; operator-gated — see salla-app-functions
File upload (logos)salla_upload
Private appssalla_private_apps · status (no app_id = account kind, before create) / publish (confirm:true after the partner confirms — a merchant partner's app usually goes live at once) / withdraw / store requests list_requests get_request create_request update_request delete_request — see salla-app-builder → private apps
OAuth scopessalla_scopes · get / set — request only the minimum scopes the app needs; set reports restricted scopes it couldn't save under dropped
App-Store listing pageapp_page_builder · listing-page blocks (catalog/init/list/show/set/add/remove/sort/reset); requires app_publish action=open first; images → salla_upload — see salla-app-ui-builder
Publish an app (stepwise)Public: app_publish · open set readiness validate — validate saves a DRAFT; the partner reviews the /publish link, then either submits one-click there OR confirms and the agent calls send_publish_request (confirm:true). Private: salla_private_apps action=publish — no onboarding, no listing. See salla-publication-consistency
Lookups (categories/countries/cities)salla_reference

The routed skills drive these tools step by step — follow the skill, not the raw API.

Red Flags

Tempting thoughtWhy it's wrong
"A theme is an app, so the app flow applies." (First, pick the product)A Twilight theme is a GitHub repository of templates: no OAuth, no install webhooks, no App Settings. Planning auth mode or webhooks for it is wasted work — route to salla-theme-builder.
"The theme is ready — publish it with app_publish." (First, pick the product)app_publish is the App Store listing flow for apps. A theme is published from the Partners Portal.
"The partner said 'App Theme', so this is theme work." (First, pick the product)"App Theme" / "App Impact" is an app listing's category → salla-publication-consistency. A Twilight theme is a different product.

Resources

TopicLink
Partners Portalhttps://portal.salla.partners
Developer bloghttps://salla.dev/blog/
Developer community (Telegram)https://t.me/salladev

Comments

Markdown supported