Koru Power Seller
Social Selling app for VTEX store salespeople — catalog with trackable links and shareable banners, CRM with abandoned-cart detection and a sales ranking, with its own admin panel.
App under active development — confirm status with the team before onboarding a real client
Koru Power Seller just migrated its multi-tenant architecture to a single-host, two-step
login scheme. As of this writing, that migration was merged into the codebase, but its
production deployment and its end-to-end validation with a second real client were not yet
confirmed: the only store operating so far (pardosit) runs on an internal environment-
variable fallback, not on the self-service flow described in this guide. Two features
visible in the UI are also not yet functional: the "Sign in with VTEX ID" button
(login) and the "Automate across my statuses" toggle (share modal), both marked "Coming
soon". Verify the exact deployment status with the development team before contracting
the app for a production client.
Koru Power Seller (identified in its own code as "Power Seller") is a Social Selling application for VTEX store salespeople: each salesperson gets their own catalog with real prices and stock, generates trackable links and suggested copy to share products on social media or WhatsApp, tracks their sales and their position on a ranking, and manages a client portfolio with protected data. Unlike the rest of Koru's apps, it does not live inside VTEX Admin: it is its own mobile-first web application, hosted separately (Cloudflare Pages) and multi-tenant — a single deployment serves every retailer that contracts it, each with its own brand, its own salespeople and its own VTEX credentials.
The app is designed for two distinct moments:
- The technical team, agency, or store owner contracts the app in Koru Suite, logs in for the first time, connects the credentials of their own VTEX account, and does the initial setup (brand, salespeople, collections, banners).
- The sales team (salespeople) uses the app day to day from their phone: sharing products, tracking their metrics, and taking care of their clients.
What Koru Power Seller does not do
Koru Power Seller does not process payments or replace VTEX checkout (the generated link
leads to the store's real cart); it does not send WhatsApp or social messages by itself —
it builds the link, the copy, and the banner, and the salesperson pastes them by hand into
whatever channel they use; it does not manage VTEX License Manager users (salespeople are
accounts of their own inside the app, not VTEX IDs); it does not write to the retailer's
Master Data (it only reads CL/CC for the CRM); and it does not convert currencies or
manage the catalog of more than one VTEX account per store.
Before you start
Recommended owners
| Task | Usual owner |
|---|---|
| Contract the app and activate the website in Koru Suite | Sales rep or Koru Suite administrator |
| Generate the VTEX App Key with the correct roles | VTEX agency or the store's technical team |
| Load the VTEX connection and claim the store | Store owner or ecommerce lead (Power Seller admin) |
| Define the brand (logo, color, name) | Marketing or design |
| Load salespeople (individual sign-up or CSV) | Ecommerce manager or HR |
| Configure Hot Items / New Arrivals and their validity | Ecommerce manager |
| Upload Social Selling banners and the content calendar | Marketing |
| Share products and take care of clients day to day | Salespeople |
| Audit the team's performance | Ecommerce manager or store owner |
The same person can cover several roles in a small store.
Required access
Before you start, make sure you have:
- A Koru Suite user with the store's website activated with the Power Seller app.
- Access to VTEX Admin for the account, with permission to generate your own App Key.
- The public URL Red Clover gave you to access the app (today,
https://app.powerseller.com.ar). - Your VTEX store's public URL (the storefront domain), to configure the connection.
Koru Power Seller does not create a VTEX License Manager role: salespeople are accounts of their own inside the app (stored in the app's own database, not in VTEX), and the only VTEX access the app uses is that of the App Key the admin loads.
Identifiers you'll come across
| Identifier | Example | Who defines it | Configured manually? |
|---|---|---|---|
| Koru Website ID | UUID of the site | Koru Suite | No: it's resolved by logging in with your Koru user |
| Koru App ID | Internal UUID of Power Seller | App build | No; already built in |
| VTEX account (accountName) | mystore | Merchant | Yes, in Admin → Connection |
| VTEX App Key / App Token | vtexappkey-mystore-XXXXXX | Merchant, generated in VTEX Admin | Yes, in Admin → Connection (write-only) |
| Power Seller internal store slug | mystore (derived from your URL) | The app, when claiming the store | No; automatic |
There's no Website ID field to paste here
Unlike other Koru apps, Power Seller has no field for pasting the Website ID. The store is identified automatically when the admin logs in with their Koru Suite user: the app shows them their websites and the admin picks "Configure" on the right one. See "Activation and first access" below.
How it's contracted and accessed
Unlike the rest of Koru's apps, Power Seller is not installed with the VTEX CLI and does not live inside VTEX Admin: it is a separate application, with its own URL, hosted on Cloudflare Pages. Onboarding a new store touches three different places.
Contract the app and activate the website in Koru Suite
This is done by the Koru Suite sales rep or administrator: they create (or use) your store's website and activate the Power Seller app for that website. They also associate the person who will administer the app as a user of that website in Koru.
Log in to the app's URL with your Koru user
Using your Koru Suite user (the same one you use to log into Koru Suite, not a new
password), go to the URL Red Clover gave you (today,
https://app.powerseller.com.ar). If it's your first time, or if your user has more
than one website, you'll see a store selector.
Pick "Configure" for your store
In the selector, tap Configure on the relevant website. This creates your store
inside Power Seller with provisioning status (still without active salespeople) and
takes you straight to Admin → Connection, without asking you to log in again.
Generate the VTEX App Key with the correct roles
In VTEX Admin → Account settings → Application keys, generate a new App Key with exactly these roles and nothing else:
- Catalog — read
- OMS — view orders
- Master Data v2 — read
The App Token is shown only once in VTEX: if you lose it, you'll have to generate another key.
Load the connection in Admin → Connection
Fill in the VTEX account (accountName), store URL, App Key, and App Token, and save. The
app validates the credentials against 3 private VTEX endpoints (Catalog, OMS, Master Data)
before saving them encrypted. If any resource fails, the app tells you which one. Only
then does your store move to active status and your salespeople can start logging in.
Don't confuse the Koru user with a salesperson's account
The admin logs in with their Koru Suite user (no password of their own inside the app). Salespeople, on the other hand, are accounts of their own inside Power Seller (email + password given by the admin) — they don't exist in Koru or in VTEX License Manager.
Update and uninstall
Since Power Seller isn't installed on your VTEX account or workspace, there is no
vtex install/vtex uninstall command your team runs: the code is deployed centrally by
Red Clover and the same build serves every store (there is no per-store version to
update).
- Updates: require no action on your part. If a change affects your configuration in some way, Red Clover will let you know separately.
- Cancelling the subscription: deactivating the app for your website in Koru Suite cuts access (see "License and security" below): both salesperson and admin logins get blocked once the license is inactive, with up to ~5 minutes of grace from the validation cache.
There is no full data purge or export in the UI
Cancelling the license blocks access, but doesn't delete anything: your store row, salespeople, brand/collections/banners/calendar configuration, and shortlinks stay persisted (Cloudflare D1 and KV) until manually removed. If you need a definitive deletion or a data export, coordinate it with support.
Activation and first access
How admins log in (via Koru Suite)
The admin has no password of their own in Power Seller: they sign in with their Koru Suite user, using the app's two-step login (see below). The first time Koru validates that login, Power Seller shows them the Koru websites associated with that person:
- If they have exactly one website and it's already claimed, they go straight to the admin panel.
- If they have zero, several, or a mix of claimed/unclaimed websites, they land on a selector ("Pick a store") with an Enter button (for already-claimed ones) or Configure (to claim a new one) per website.
How salespeople log in
Salespeople have no Koru user: the admin creates them (individually or via CSV) with an email and a temporary password, which they receive by email (if email sending is configured; see below). On first login, the app forces them to change it before continuing.
Two-step login
Every role logs in through the same form, in two steps:
Type your email
The app looks up which store your email belongs to (across salespeople of every store) and paints that store's brand (logo, color) before asking for your password. If your email doesn't match any store, or matches several, you still proceed (with a generic brand, or with a store selector).
Enter your password
With the brand already painted, you enter your password. If you're a Koru admin, this validates against Koru Suite; if you're a salesperson, it validates against the password your admin gave you.
Login doesn't depend on a per-store domain: every tenant enters through the same shared hostname. What identifies your store is your email (or, if needed, your choice in the selector), not the URL you typed.
Recommended setup
After connecting VTEX (see above), follow this order before inviting your sales team:
Confirm the VTEX connection
Check that Admin → Connection shows "Active connection with account X". Without this,
catalog, dashboard, and CRM return an error (VTEX_NOT_CONFIGURED) for every
salesperson.
Configure your brand (White Label)
In Admin → Brand, load the app's name, primary color, and logo that your salespeople (and anyone visiting the login) will see. Without your own logo, the default Power Seller icon is used.
Define Hot Items and New Arrivals
In Admin → Hot Items / New Arrivals, paste the VTEX collection ID for each section and, optionally, its validity window (from/to). Use Verify to confirm the collection returns products with stock before saving.
Upload the Social Selling banners
In Admin → Banners, upload the Story, Post, and WhatsApp thumbnail images your salespeople will be able to download when sharing a product.
Load your sales team
In Admin → Salespeople, add them one by one or import a CSV. Each sign-up triggers a welcome email with the temporary password (if email sending is configured); if not, note the temporary password shown by the import itself.
Prepare the content calendar (optional)
In Admin → Calendar, load posts with copy and images for your team to use in New Arrivals.
Test the full flow with a test salesperson
Log in as that salesperson: check the Dashboard, share a product and confirm the short link redirects to the real cart, search for a client in the CRM and confirm the data shows up masked.
Full configuration
All configuration lives outside VTEX: in Power Seller's own database (Cloudflare D1/KV), scoped per store.
VTEX connection (Admin → Connection)
| Field | Required | Behavior |
|---|---|---|
| VTEX account (accountName) | Yes | Host the app sends Catalog/OMS/Master Data API calls to. |
| Store URL | Yes | Must be absolute and use https://. Used to build the checkout link with the UTMs salespeople share. |
| App Key | Yes | Write-only: never shown again once saved. To rotate it, paste a new one. |
| App Token | Yes | Same as the App Key: write-only. Shown only once in VTEX when generated. |
Roles the App Key needs: Catalog (read) · OMS (view orders) · Master Data v2 (read). The app validates all three before saving; if any fails, it tells you which one (Catalog, OMS, or Master Data).
Brand / White Label (Admin → Brand)
| Field | Default if empty | Behavior |
|---|---|---|
| App name (max. 30 characters) | "Power Seller" | Browser title and name shown throughout the interface. |
| Primary color | #6d28d9 | Accent color on buttons and highlights; must be a 6-digit hex. |
| Logo (PNG/SVG, max. 5 MB) | Power Seller icon | Shown on login, header, and transactional emails. |
| Shortlink domain (optional) | app's domain | Only changes how the link is displayed to the salesperson; the link still works the same without this field. |
Hot Items / New Arrivals (Admin → Hot Items / New Arrivals)
| Field | Behavior |
|---|---|
| VTEX collection ID | Used as the productClusterIds filter of the Catalog Search API. |
| Validity from / to | Outside that range, the salesperson's catalog section shows an empty state instead of the collection. |
Salespeople (Admin → Salespeople)
Individual sign-up or CSV import (columns: nombre, nro_vendedor, email, telefono, empresa, sucursal, otros, otros1). Required fields: name, salesperson number, email,
company, branch, and password (CSV sign-up generates a temporary password
automatically). Email and salesperson number must be unique per store; duplicates are
skipped during import without blocking the rest of the batch.
Social Selling banners (Admin → Banners)
| Field | Suggested size |
|---|---|
| Story | 1080×1920 |
| Post | 1080×1080 |
| WhatsApp thumbnail | free |
If a format isn't loaded, the corresponding download button appears disabled in the salesperson's modal ("the admin hasn't configured this banner yet").
Content calendar (Admin → Calendar)
Each post has a date/time, suggested copy (max. 500 characters), images (story, post, thumbnail), and, optionally, a linked product (looked up by name). The salesperson sees posts grouped by week in their New Arrivals tab.
How each module works
Attributing sales to the salesperson
Each salesperson has their own salesperson number. When they share a product, the
generated link adds utm_campaign=<salesperson number> to VTEX's add-to-cart link. On
the dashboard side, the app queries OMS filtering by that same value, but using the
parameter OMS actually requires (f_UtmCampaign; OMS ignores utm_campaign as a search
filter, even though it does accept it as a URL parameter for checkout). Every sales
metric (own dashboard, ranking, admin's consolidated dashboard) is scoped to the
current calendar month; there is no date-range selector.
Trackable links (shortlinks)
Tapping Share on a product generates a short code (stored in Cloudflare KV, 90-day
TTL) that redirects (/r/{code}, 302) to VTEX's real add-to-cart link with the
attribution UTMs. Each click is counted in a non-blocking way. If shortlink generation
fails for any reason, the modal falls back to showing the product's plain link (without
tracking) instead of blocking the share.
CRM and client data
The search (by name, ID document, or email, minimum 2 characters) queries VTEX Master
Data's CL entity and always returns masked data: the real value never leaves the
edge toward the salesperson's browser. Examples: marcos.garcia@gmail.com →
ma***@gmail.com; Marcos García → Marcos G...; document 33456789 → 33.***.**9.
A client's detail (purchases, abandoned cart) is requested with the CL document's id,
never with the email. If a client has a detected abandoned cart, the app builds a
WhatsApp link (wa.me) with a suggested message; it does not use the WhatsApp Business
API. The purchase history only shows the client's last 3 invoiced orders, not their
full history.
Salesperson catalog
Only products with available stock greater than zero are shown, up to a maximum of 20 products per section (All/Hot Items/New Arrivals), cached for 5 minutes. A discounted product (list price higher than the final price) shows a discount percentage computed by the app itself, not a native VTEX field.
Ranking and dashboard
The ranking is computed per branch (the salesperson's branch field); if a
salesperson has no branch loaded, they're compared against a global pool of up to 60
active salespeople. The salesperson's dashboard shows the podium (top 3) and, if the
salesperson isn't in it, adds their own row separately with "···" in between. The admin's
consolidated dashboard shows the whole team sorted by sales, with average conversion
(orders ÷ clicks), and exports to CSV.
Screens and day-to-day operation
Bottom navigation with four sections and an interactive guide:
- Dashboard: sales for the month, closed orders, accumulated clicks, your branch's ranking, and recent activity (latest orders or clicks).
- Catalog: search + All/Hot Items/New Arrivals filters; every product has a Share button that opens the Social Selling modal (trackable link, editable copy, downloadable banners). The "Automate across my statuses" toggle shown in that modal is not yet functional ("Coming soon").
- Clients (CRM): search by name/ID/email with obfuscated data, an expandable detail with recent purchases and, if applicable, an abandoned-cart WhatsApp reminder.
- New Arrivals (Calendar): posts prepared by the admin, grouped by week, with copyable text and a downloadable story image.
- Interactive guide: a spotlight tour through Dashboard, Catalog, CRM, and Calendar on first login; it can be replayed from the help button (?) in the header.
- First login / password recovery: mandatory password change on first login (minimum 8 characters and 1 number); "forgot my password" only applies to salespeople — an admin recovers theirs from Koru Suite, not from here.
License and security
License validation
Every login and every authenticated request validates the website's Koru license
(GET /api/auth/widget?website_id&app_id), with these rules:
- Result cached for 5 minutes (fresh) and up to 1 hour as a fallback value.
- Fail-open on transient errors: if Koru doesn't respond or the network fails, the app lets the request through instead of blocking it, so a Koru blip doesn't take down the merchant's operation.
- A license that's explicitly inactive (
authorized: false) blocks login with403 LICENSE_INACTIVE, with up to ~5 minutes of grace from the cache. - With a session already open, a license cutoff today shows up as "session expired" (401), not as an explicit license message — the real reason only appears once you retry the login. This is a known pending improvement from the development team, not a bug to report.
VTEX credentials
- The admin loads their own App Key/Token from Admin → Connection; they're never requested through any other channel.
- They're validated against 3 private VTEX endpoints (Catalog, OMS, Master Data) before being saved: if the probe fails, nothing is persisted.
- They're encrypted with AES-256-GCM envelope encryption (master key = a project secret) before being saved in the app's database. They're never stored or shown in plain text.
- They're write-only: the panel never shows the saved value again, not even partially. To rotate them, you overwrite them with a new value.
Client data (CRM)
All CRM PII (name, email, phone, document) is masked server-side before responding to the browser: the salesperson never receives the real value, only its masked version. The CRM screen also shows a fixed banner reminding that this is confidential data for exclusive use in sales management.
Passwords and session
- Salesperson passwords are stored with PBKDF2-SHA256 (100,000 iterations), never in plain text.
- The session is a custom JWT (HS256, valid for 8 hours), sent as a
Bearertoken and stored in the salesperson's/admin's browser. - The Koru admin has no password of their own in the app: their identity is validated against Koru Suite on every login, not against a stored password here.
Troubleshooting
I can't log in / "Incorrect email or password"
- If you're a salesperson, confirm with your admin that your account is active (a deactivated salesperson can't log in, even with the correct password).
- If you're an admin, confirm you're using your Koru Suite user, not a password you've used on another store.
- An email that belongs to a salesperson at several stores may require picking the store in step 1 of the login.
"This store's license is not active"
- Confirm in Koru Suite that the Power Seller app is still active for your website.
- Wait a few minutes: the check is cached for up to 1 hour, so a recent reactivation may take a while to be reflected.
- If it persists, tell support the email you used and the store's name (without sending passwords).
"This store is still being set up" (salesperson)
Your store was claimed but the admin hasn't loaded (or validated) the VTEX connection in Admin → Connection yet. No salesperson can log in until the admin completes that step and the store moves to active status.
The VTEX connection won't save / "VTEX rejected the credentials"
Check, in this order:
- That the VTEX account is the real
accountName(nohttps://, no spaces). - That the store URL is absolute and uses
https://. - That the App Key has exactly the three roles: Catalog (read), OMS (view orders), Master Data v2 (read).
- The error detail shows the result per resource (Catalog/OMS/Master Data): whichever one doesn't say "OK" is the missing role.
The catalog, dashboard, or CRM return a connection error
It's the same error (VTEX_NOT_CONFIGURED) for all three: it means your store doesn't
have a valid saved VTEX connection yet. Ask the admin to complete it in Admin →
Connection.
No products show up in Hot Items / New Arrivals
- Confirm the collection ID is correct (use Verify on the configuration screen itself before saving).
- Confirm you're within the configured validity window (from/to); outside that range, the section deliberately shows an empty state.
- Remember only products with stock greater than zero are shown: a collection whose products are out of stock may appear empty.
The salesperson didn't receive the welcome or recovery email
Sending emails is best-effort: if the provider (Resend) isn't configured for your store, sending is skipped without breaking sign-up or the reset. On a CSV sign-up, the temporary password is still shown on screen to the admin as a fallback — pass it along manually if the email didn't arrive. For a reset, there's no visible fallback: you need to retry "Forgot my password" once the provider is configured.
"Sign in with VTEX ID" doesn't work
That button is disabled on purpose: it's a planned feature, not implemented yet. Use the normal email-and-password login.
The "Automate across my statuses" toggle doesn't do anything
It's a feature planned for a future phase, visible in the UI but not yet functional. It's not a bug.
Functional limits
The current version:
- Is not a VTEX Admin App: it lives outside VTEX Admin, on its own URL shared by every store that contracts it.
- Has no field to manually paste the Koru Website ID: the store is identified automatically when logging in with a Koru Suite user.
- Only supports one VTEX account per store (one tenant = one row with a single set of VTEX credentials).
- The salesperson's catalog shows a maximum of 20 products per section, and only products with available stock.
- Sales metrics and the ranking are scoped to the current calendar month; there is no date-range selector.
- The CRM's purchase history shows only a client's last 3 invoiced orders.
- Images (logo, banners, calendar) are uploaded to Cloudflare KV with a maximum of 5 MB per file (PNG, JPG, WEBP, GIF, or SVG).
- Shortlinks have a 90-day TTL; past that, the link stops resolving.
- There is no full data purge or bulk export from the UI.
- The "Sign in with VTEX ID" button and the "Automate across my statuses" toggle are visible but disabled: they're planned features, not available yet.
- The single-host, self-service multi-tenant model (two-step login + store selector) is recent: as of this guide, it had only been validated end-to-end with an internal test store, not with a real production client.
- It does not manage VTEX License Manager users nor replace VTEX Admin's native roles: salespeople are accounts of their own inside the app.
Checklist before going live
- Website activated with the Power Seller app in Koru Suite, with the admin associated.
- Store "claimed" from the Power Seller selector (
Admin → Connectionreachable). - VTEX App Key generated with the Catalog (read), OMS (view orders), and Master Data v2 (read) roles.
- VTEX connection verified and saved (status "Active connection").
- Brand (name, color, logo) configured.
- At least one test salesperson loaded and tested end to end.
- Hot Items / New Arrivals configured and verified (or deliberately left empty).
- Social Selling banners uploaded.
- Email provider (Resend) configured, or the team knows it must communicate temporary passwords by hand.
- Sales team aware that "Sign in with VTEX ID" and "Automate across my statuses" are not available yet.
- An owner defined to periodically audit the consolidated dashboard.
Useful info when requesting support
Provide the email you used to log in, your store's name or slug, the affected section (Connection, Salespeople, Catalog, CRM, etc.) and, if the error shows it, the per-resource detail (Catalog/OMS/Master Data). Avoid sending passwords, App Key/Token, or session cookies.