Changelog-style index for implemented work (2025–2026). Use the linked docs for full detail.
| Change | Doc / code |
|---|
Shopify App Pricing (plan handles free, appifire-ai-chat-plan-1) | Shopify App Pricing |
Upgrade via top-level plan picker (window.top.location) — fixes iframe “refused to connect” | app/routes/app.billing.jsx |
| Paid detection by plan handle / Partner API (not “any active subscription”) | app/lib/billing-plans.server.js, app/lib/partner-api.server.js |
| Buy credits gated on paid plan handle | app/routes/app.billing.buy-credits.jsx |
| Change | Doc / code |
|---|
| Dashboard 5-step setup checklist (theme editor, appearance, sync, knowledge, chats) | Dashboard plan §2.5 — app/routes/app._index.jsx, app/lib/setup-checklist-storage.js |
| Chats empty state simplified (no Knowledge Hub / Dashboard button row) | AI chats / logs — app/routes/app.chat-logs.jsx |
| Timezone: browser auto-detect; OAuth no longer sets Shopify store TZ | Timezone plan — api.settings-timezone.jsx, app/shopify.server.js |
| Settings default: email alert on min balance on, threshold 1 | prisma/schema.prisma, app/routes/app.settings.jsx |
| Shop lookup: normalized domain, case-insensitive, offline session cross-ref | app/lib/shop-for-session.server.js |
Custom chatbot avatar upload (512×512 WebP, preset custom) | Appearance & custom avatar — app/lib/chat-avatar.server.js, app/routes/app.appearance.avatar.jsx |
| Knowledge Hub: FAQ tab (~50 Q&A), sanitizer strips placeholders, policy lines need full URLs | Website knowledge — website-knowledge.server.js, app.knowledge.jsx |
Knowledge save via FormData from React state (avoids huge hidden inputs truncating TEXT) | app/routes/app.knowledge.jsx |
Welcome email BCC on new install (REGISTRATION_NOTIFY_BCC) | Welcome email & install notifications |
| App Store review — side nav, dashboard CTA, 3-day auto modal with snooze / “Already Placed Review” | App Store review prompt — app.jsx, app.review.jsx, app.review-prompt.jsx, app-store-review.server.js |
| Change | Doc / code |
|---|
CSS/DOM prefix apfc → appifire-ai-chat (IDs, classes, localStorage keys); API field appifireAiChatUserId (legacy apfcUserId still accepted) | extensions/appifire-chat/assets/chat-widget.js |
| Product cards under bot replies (slider, image, price, buttons) | Storefront product cards |
View Product → PDP; Get More Info → quoted title + focusProduct | extensions/appifire-chat/assets/chat-widget.js |
| Reply cleanup when cards show: keep name/price; drop tags & product URLs | cleanReplyForProductCards in product-cards.server.js |
| Product cards: reply text only (strict full-title match; no RAG chunk / shared-prefix matching) | app/lib/product-cards.server.js — resolveProductCardsForChat |
Multi-product prompt contract — fixed title / Price: / description blocks for reliable card parsing | app/lib/prompt-builder.server.js, extractProductTitlesFromReply |
| Industry education in chat — comparisons and category guidance when relevant to store niche (from Store Context) | app/lib/prompt-builder.server.js |
products.image_url from sync for thumbnails | Product sync |
| Store currency on product cards and in replies (e.g. PKR 25,000) | Store currency |
Widget header uses avatarUrl from API (custom WebP + cache-bust) | Appearance & custom avatar |
| Powered by AppiFire branding commented out (optional re-enable) | chat-widget.js |
Chat API returns products[]; GET /api/product-card | api.chat.jsx, api.product-card.jsx |
| Change | Doc / code |
|---|
focusProduct + pageProduct in chat pipeline | RAG & chat API, Vector call stack |
| Prompt: quoted product names, focus product, name+price-only when cards below | app/lib/prompt-builder.server.js |
Prompt + chunks: store currency (no hardcoded $) | Store currency |
Published products only in RAG/cards (status:active, published_status:published, published_at) | RAG retrieval — product-storefront.server.js, vector-search.server.js |
RAG search uses recent chat history (CHAT_RAG_HISTORY_MESSAGES=8) + link follow-up boost | RAG retrieval — rag-search-query.server.js, rag.server.js |
shops.currency_code synced from Shopify on product sync | app/lib/store-currency.server.js, migration 20260523130000_add_shop_currency_code |
| Sessions table snake_case column mapping | prisma/schema.prisma, migration 20260519120000_session_snake_case_columns |
npx prisma migrate deploy # website_faq, currency_code, chatbot_avatar_updated_at, product published_at, app_store_review_*, …
npm install # sharp (custom avatar)
# Re-sync products after currency_code / image_url migrations
shopify app deploy # theme extension + app
Env (optional): REGISTRATION_NOTIFY_BCC, WEBSITE_KNOWLEDGE_MAX_TOKENS, WEBSITE_FAQ_MAX_TOKENS, CHAT_RAG_HISTORY_MESSAGES (default 8; RAG retrieval only — see RAG retrieval doc), CHAT_HISTORY_MESSAGES (LLM reply context) — see .env.sample.