Features
39 features across three apps — admin, mobile and customer app — engineered to live entirely inside Shopify.
Admin · Shopify admin
Embedded in your Shopify admin. No new tab, no new login, no new database.
Create, suspend, and audit agent logins with role-based access.
Assign agents to geographies, accounts or product lines.
Flat %, tiered, hybrid. Per agent, collection or customer segment.
Auto-generated PDF/CSV, exportable to payroll.
Native sync with Shopify B2B companies and locations.
Per company, per channel, with start/end dates.
Volume tiers, mix-and-match, customer-specific.
Revenue, margin, agent leaderboard, customer retention.
Monthly/quarterly quotas with progress tracking.
CSV import with field mapping & validation.
Hide products by region, channel or company.
Set thresholds requiring manager sign-off.
Email/SMS/Slack on key events.
Every change tracked, exportable for compliance.
CSV, JSON, scheduled deliveries to S3/SFTP.
Admin in 8 languages, switchable per user.
Agent · app
Mobile-first. Native iOS + Android. Works offline. Built for selling, not for admin.
Visual grid, search, collection filters.
Catalog, prices and customers cached locally.
Multi-customer carts, parked sessions.
PDF quotes sent in one tap.
Direct to Shopify — no re-keying.
Real-time earned + pending visibility.
Plan visits by geography & cadence.
Notes, photos, follow-ups.
Per customer, with one-tap reorder.
MTD revenue, vs target, top SKUs.
Scan SKU to add to cart.
High-res images cached for showroom.
Curated collections for buyer presentations.
Fashion-friendly variant matrix entry.
Based on customer cadence & depletion.
Agent-side UI in 8 languages.
Customer app · Add-on
Customers browse their personalized catalog and reorder without calling.
Live tracking pulled from Shopify Shipping.
Download PDF invoices, see payment status.
Custom domain, logo, colors, fonts, translations.
Approval workflows, spend limits per user.
New · April 2026
Eight new capabilities shipped this quarter — covering offline reality, multi-currency selling, and the small UI details that decide whether agents actually use the app.
Catalog cache + cart submit queue. Field reps can build orders without signal — everything syncs on reconnect.
Intl.NumberFormat for prices in agent's locale + customer's currency. No rounding surprises.
Google Places integration for new B2B customer creation. Validated address, structured fields.
Reassign zones across the team in one operation. No more 40-click reorgs.
5 toggles per agent: orders, refunds, quotes, discounts, territories. Each agent tunes their own noise.
Manager-gated refunds without leaving Soryk. Audit log entry on every action.
Native iOS/Android bottom sheets with safe-area awareness. Feels like the platform, not a wrapper.
Dropdown UI with multi-select chips, configured from Shopify admin. No code changes to add filters.
Same codebase deployable as a desktop web app via Expo Web — bonus for teams that want desktop access too.
Integrations
Security & Compliance
EU data residency, DPA on request, no PII outside Shopify.
Google + Microsoft Workspace, standard at every tier. No SAML/Okta add-on.
TOTP-based, enforceable per role.
Every action immutably logged for compliance.
Frankfurt & Dublin AWS regions only.
Monitored 24/7. No contractual SLA — we're indie and honest about it.
Privacy & Architecture
Soryk is stateless. The only data we host is the OAuth shop token. Everything else lives in your Shopify store — companies, orders, commissions, audit log. No DPA dance for B2B customer data.
JWT-signed everything, no Redis lookups for hot paths.
Data lives in Shopify metaobjects only. We don't see it.
The only data we hold — explicitly documented, encrypted at rest.
No DPA dance for B2B data — there's nothing on our side to process.
No external state. Process-local caches that warm fast and die clean.
Quote payloads encoded as JWT-signed tokens — no DB lookup needed.
Production · April 2026
23 hardening items shipped this quarter — the kind of plumbing that decides whether a B2B app survives its first 10,000-order shop. None of it is marketing surface. All of it is in the audit log.
Documented zero-downtime key rotation. Old tokens stay valid through a configurable grace window while new ones are issued under the rotated secret.
grace-window · dual-key verify · runbook included
Upstash sliding-window across login surfaces: 5 attempts/identity, 30/IP, 5-min window. Admin payments capped at 60/min/shop.
agent · buyer · admin · per-identity + per-IP
Every write is mirrored on Redis as an append-only stream (lpush + ltrim 5000). Orphan detection flags tampering attempts on the primary store.
redis · append-only · drift alerts
Every tag passes through sanitizeTagValue() — lowercased, special chars replaced, non-alphanum stripped. Customer/order tags can't be hijacked into selectors.
single chokepoint · validated at write
Middleware on every buyer API verifies companyId against the JWT. Cross-tenant data leaks are structurally impossible — verified, not promised.
zero cross-tenant · 100% endpoint coverage
Pre-built companyId→agents[] index plus an email→agent map (raw + sanitized) replaces the legacy O(orders × agents) fallback. Scales smoothly to 10,000+ orders/shop.
indexed lookup · constant per order
Sliding Upstash cache: 60s on the live preset, 5 min on custom date ranges. Refund-created webhooks invalidate the relevant slice instantly.
live · custom · webhook-invalidated
push notifications with secure push tech, dead-subscription pruning, service-worker push + click handlers, and an auto-registrar that mounts a subscription if the permission is already granted.
· SW listener · auto-registrar · toggle
Irregular zones: Haversine-based circles plus ray-casting polygons. Mix-and-match coverage maps without rewriting territory boundaries every quarter.
haversine · ray-cast · per-zone
Claude Opus 4.7 with effort=xhigh and a strict JSON schema reviews coverage, manager hierarchies and even region-name spelling drift before commission cycles close.
structured-output · hierarchy · drift detection
lib/errors/codes.ts + useErrorMessage() ship every error as a stable code resolved against EN/IT dicts on the client. No more "Internal server error" leaking to a buyer.
stable codes · EN / IT dicts · client-resolved
Commission payouts reject duplicate orderIds with HTTP 409. Refund webhooks dedupe on orderId+paymentId. Replays are safe by design.
409 · dedup · replay-safe