Skip to content
Projects
AI inside4 min read

Product Information Management Platform

Production-grade PIM with integrated DAM, brand-specific rules, channel validation, and AI-ready enrichment that proposes - never silently overwrites, now extended with a Business Central connector that pulls raw product data, auto-enriches it, and pushes validated listings back toward Shopify.

Role
Architect and lead engineer
Year
2025
Status
live
AIdatagovernancefull-stackERP

// AI capabilities

  • Pluggable image intelligence (Vision API ready)
  • LLM-based enrichment proposals routed to a review queue
  • Confidence and source tracking per proposed value
  • Completeness and channel-readiness scoring engines

// Architecture flow

Overview

A Next.js + Prisma PIM (Product Information Management) system with a Digital Asset Manager (DAM) baked in. Multi-brand catalog support with brand-specific rules in JSON, per-channel readiness validation, AI enrichment that proposes but never overwrites, and a clean operator UI for the catalog team.

Problem

Multi-brand retailers like Mike Sport need a single product hub that respects brand-specific data rules (Adidas requires X attributes, Crocs requires Y), validates against per-channel requirements (Shopify, marketplace, retail), and uses AI for enrichment without giving up control of master data. Off-the-shelf PIMs were either rigid or too expensive for the size of the operation.

Approach

Build a governance-first PIM where brand rules and channel profiles are configuration, not code. Treat AI as a contributor with proposal rights, not commit rights. Never silent-overwrite anything: every machine-generated value goes to an EnrichmentTask queue with confidence and source attribution.

Business Central integration

The "X BC" track turns the PIM into the data hub between Microsoft Dynamics Business Central and Shopify:

  • Pull, enrich, push: Business Central supplies raw product facts (item reference, vendor, prices, variants, inventory). The PIM enriches title, description, and SEO, then returns the finished listing for syncing toward Shopify via the productSet shape. The PIM is the sole writer to BC, never to Shopify directly.
  • Connector abstraction: a transport-agnostic interface (ping, pushProduct, pullSince, pullReady, pullReferenceData) with a mock connector for dev and test today and an HTTP/OData connector stubbed for production, swappable via a BC_CONNECTOR env var with zero code changes.
  • Cursor-based sync: incremental pulls tracked per store and table by a sync cursor, so the full catalog is never re-pulled.
  • Auto-enrich on arrival: when a store has auto-enrich enabled, every pulled product queues for AI enrichment as a single batched job.
  • Validation gating: a product moves through an explicit state machine (draft, enriched, in review, approved, queued for sync, synced) and validation failures surface in a "fix-needed" queue that blocks the push until resolved.
  • Status: tested end-to-end against a mock BC instance. Production wiring awaits the Business Central team's OAuth2 credentials and change-tracking enhancements, so this track is in preview while the core PIM stays live.

Architecture

  • App: Next.js 15 App Router, TypeScript, Tailwind, shadcn/ui primitives.
  • ORM: Prisma over SQLite by default (swap to Postgres for production deploys).
  • Validation: Zod schemas for brand rules, channel profiles, and runtime input.
  • Asset storage: SHA-256 deduplication; any backend (S3, R2, local) works behind the storage adapter.
  • Brand rules: JSON-defined per-brand attribute requirements parsed by the rules engine on every product change.
  • Channel profiles: Per-channel JSON specs that drive the validator's structured issue reports.

Tech stack

  • Frontend / backend: Next.js, TypeScript, Tailwind, shadcn/ui
  • ORM and DB: Prisma over SQLite (default) / PostgreSQL (prod), 50-model schema
  • Queue: BullMQ + Redis (optional, with an in-process worker fallback)
  • Validation: Zod
  • Storage: Adapter pattern (S3 / R2 / local)
  • ERP sync: Business Central connector (transport-agnostic; OData/HTTP pending prod auth)

AI work

  • Image intelligence stub: heuristic-based by default, swappable to OpenAI Vision, Google Vision, or AWS Rekognition behind a single interface.
  • Enrichment LLM stub: proposes values to an EnrichmentTask queue with confidence and source tracking. Never overwrites.
  • Completeness engine: weighted scoring across required attributes, locales, imagery, and SEO metadata, with weights tuned per brand.
  • Channel validation: structured issue reports point operators directly at what's missing for which channel.

Engineering highlights

  • Non-negotiable integrity rules: AI never overwrites; every proposal traces back to a source; assets dedupe by SHA-256; locales never collapse silently.
  • 15+ admin pages: products, assets, brands, channels, validation, imports, exports, activity, settings, plus BC pull history, BC push status, and the fix-needed queue, all with the same operator-grade UX.
  • Pluggable everywhere: vision provider, LLM provider, storage backend, and now the BC transport all live behind narrow interfaces, making vendor swaps a config change.
  • Audit trail: every enrichment, every overwrite-by-human, every channel publication is timestamped and attributable.

Outcome

Production-ready, used as the catalog backbone for downstream commerce and analytics. AI proposals reduce manual data work without ever compromising the master data layer. The Business Central pipeline is proven end-to-end on a mock instance and waiting on the BC team's API credentials to go from preview to live.

Lessons

  • Brand rules are configuration, not code. The moment you hard-code one brand's quirks you've created a maintenance trap.
  • "Propose, never overwrite" is a five-word architecture decision that prevents an entire category of AI failure modes.
  • Operator UIs deserve the same care as customer-facing ones. The catalog team is using this every day.

Want to dig deeper?

Ask my AI agent anything about how this was built, what tradeoffs I made, or how it could fit your team.

Ask my AI →