[{"data":1,"prerenderedAt":317},["ShallowReactive",2],{"home-case-studies":3},[4,127,226],{"id":5,"title":6,"body":7,"client":97,"description":98,"diagram":99,"extension":100,"kind":101,"meta":102,"navigation":103,"order":104,"outcome":105,"path":106,"pillar":107,"productUrl":108,"sector":109,"seo":110,"services":111,"status":108,"stem":115,"technologies":116,"years":125,"__hash__":126},"caseStudies\u002Fcase-studies\u002Fconnecting-legacy-accounting-to-modern-commerce.md","Connecting Legacy Accounting to Modern Commerce",{"type":8,"value":9,"toc":87},"minimark",[10,15,19,23,52,56,73,77,80,84],[11,12,14],"h2",{"id":13},"challenge","Challenge",[16,17,18],"p",{},"The business ran on QuickBooks Desktop. Thousands of parts existed only inside an on-premises company file: no categories, no images, no web presence. Customers search for parts the way they talk, with misspellings and partial part numbers, and every web order had to land back in QuickBooks as a sales order without anyone typing it in twice.",[11,20,22],{"id":21},"approach","Approach",[24,25,26,34,40,46],"ul",{},[27,28,29,33],"li",{},[30,31,32],"strong",{},"Use the integration QuickBooks Desktop actually supports."," The QuickBooks Web Connector polls a SOAP service we built and exchanges qbXML. Large item queries are paged with iterators so a sync never tries to swallow the whole catalog at once.",[27,35,36,39],{},[30,37,38],{},"Let AI help, with guardrails."," A locally hosted language model proposes a category, subcategory, vehicle type and tags for each item, with a confidence score. Low-confidence results are flagged for a person to review instead of being trusted blindly.",[27,41,42,45],{},[30,43,44],{},"Protect the sync from the model."," Concurrency limits, adaptive timeouts, a circuit breaker and exponential back-off mean a slow or unavailable model degrades categorization, not order flow.",[27,47,48,51],{},[30,49,50],{},"Search for intent, not exact strings."," Fuzzy matching handles typos and part numbers; vector search over local embeddings handles meaning.",[11,53,55],{"id":54},"implementation","Implementation",[24,57,58,61,64,67,70],{},[27,59,60],{},"A Web Connector SOAP service with session handling and qbXML models for items, inventory, customers and sales orders.",[27,62,63],{},"Two-way order flow: web orders are written to QuickBooks as sales orders, matched by reference number and marked as web-originated.",[27,65,66],{},"A queued, batched categorization pipeline with confidence scoring and review flags.",[27,68,69],{},"Hybrid search (fuzzy + semantic) and a retrieval-augmented assistant that knows stock levels and hands off to customer service when it can't help.",[27,71,72],{},"An image pipeline with validation, de-duplication by content hash and a blocklist.",[11,74,76],{"id":75},"outcome","Outcome",[16,78,79],{},"The accounting catalog became a categorized storefront that tolerates the way customers actually type (\"transmision\", \"alernator\"). Orders reach QuickBooks Desktop on the Web Connector's normal sync cycle, with no re-keying.",[11,81,83],{"id":82},"technical-perspective","Technical perspective",[16,85,86],{},"The Web Connector is a polling protocol driven from the customer's own machine, so sessions, iterators and pending requests must survive between polls. Putting a language model anywhere near that loop meant designing for the model being slow or absent, so the business never waits on AI to take an order.",{"title":88,"searchDepth":89,"depth":89,"links":90},"",3,[91,93,94,95,96],{"id":13,"depth":92,"text":14},2,{"id":21,"depth":92,"text":22},{"id":54,"depth":92,"text":55},{"id":75,"depth":92,"text":76},{"id":82,"depth":92,"text":83},"A regional distributor of truck and industrial parts","How we turned an on-premises QuickBooks Desktop catalog into a searchable web storefront, with orders flowing back into accounting automatically and AI categorization that knows when to ask for help.","qbwc","md","client",{},true,1,"Thousands of accounting-only items became a categorized, typo-tolerant storefront, and web orders now reach QuickBooks Desktop without re-keying.","\u002Fcase-studies\u002Fconnecting-legacy-accounting-to-modern-commerce","connect",null,"Distribution",{"title":6,"description":98},[112,113,114],"Systems Integration","AI & Automation","Custom Software Development","case-studies\u002Fconnecting-legacy-accounting-to-modern-commerce",[117,118,119,120,121,122,123,124],"QuickBooks Desktop","QuickBooks Web Connector","qbXML \u002F SOAP","Java","Play Framework","PostgreSQL","pgvector","Local LLM","2025 – present","MYuTC9Mh1tniQdLqAxYG3AbT3b3bgcSDov-pPzwVcBY",{"id":128,"title":129,"body":130,"client":206,"description":207,"diagram":208,"extension":100,"kind":101,"meta":209,"navigation":103,"order":92,"outcome":210,"path":211,"pillar":212,"productUrl":108,"sector":213,"seo":214,"services":215,"status":108,"stem":218,"technologies":219,"years":224,"__hash__":225},"caseStudies\u002Fcase-studies\u002Freliable-payment-and-fulfillment-workflows.md","Engineering Reliable Payment & Fulfillment Workflows",{"type":8,"value":131,"toc":199},[132,134,137,139,165,167,184,186,189,191],[11,133,14],{"id":13},[16,135,136],{},"3D Secure 2 sends its result back through the cardholder's browser, which is something an attacker controls. A forged or replayed callback, or two requests racing each other, could mark an order paid or fulfil it twice. For gift cards that's unrecoverable: once a redeemable code is delivered, it's cash.",[11,138,22],{"id":21},[24,140,141,147,153,159],{},[27,142,143,146],{},[30,144,145],{},"Treat the browser as advisory."," Only the server-to-server payment response is accepted as proof of payment.",[27,148,149,152],{},[30,150,151],{},"Bind the response to the transaction."," It must be approved and match the transaction identifier, the amount (compared as fixed-point, never floating-point) and the ISO 4217 currency. Anything else fails closed with a machine-readable reason.",[27,154,155,158],{},[30,156,157],{},"Let the database pick one winner."," Every state change is a single conditional update, so exactly one request can move a transaction forward across threads and instances.",[27,160,161,164],{},[30,162,163],{},"Check again before acting."," Fulfillment re-reads payment status from the database, and a configurable kill switch holds paid gift cards without stopping checkout.",[11,166,55],{"id":54},[24,168,169,172,175,178,181],{},[27,170,171],{},"An explicit transaction state machine: initiated → verifying → pending → completed \u002F failed \u002F expired.",[27,173,174],{},"A verification layer for payment responses and atomic compare-and-set state transitions.",[27,176,177],{},"Hardened 3DS2 callback handling: first write wins, the amount never comes from the browser, and a transaction can only complete through the flow that created it.",[27,179,180],{},"A fulfillment guard and fail-closed issuance switch; provider payloads containing redeemable links are never logged.",[27,182,183],{},"Failure tracking, blocklists and background tasks that expire abandoned payments.",[11,185,76],{"id":75},[16,187,188],{},"Forged, replayed and concurrent completions cannot produce a payment or a fulfillment. Operations can pause gift card issuance instantly while customers keep paying bills and shopping. The changes shipped as a single audited containment release.",[11,190,83],{"id":82},[16,192,193,194,198],{},"The weakness wasn't a missing feature; it was trust in data that only ",[195,196,197],"em",{},"looked"," authoritative, combined with read-then-write races. The fix had to be retrofitted into a live checkout serving several flows (shop, bills, reservations) without breaking any of them.",{"title":88,"searchDepth":89,"depth":89,"links":200},[201,202,203,204,205],{"id":13,"depth":92,"text":14},{"id":21,"depth":92,"text":22},{"id":54,"depth":92,"text":55},{"id":75,"depth":92,"text":76},{"id":82,"depth":92,"text":83},"A regional consumer financial-services platform","Hardening a live card checkout so that forged, replayed or concurrent 3D Secure callbacks can never mark an order paid — or deliver a gift card twice.","payments",{},"Replayed, forged and concurrent completions cannot produce a payment or a fulfillment, and gift card issuance can be frozen without stopping checkout.","\u002Fcase-studies\u002Freliable-payment-and-fulfillment-workflows","secure-scale","Financial services",{"title":129,"description":207},[216,217],"Payments & Fintech","Performance \u002F Production Engineering","case-studies\u002Freliable-payment-and-fulfillment-workflows",[220,221,120,121,222,223],"3D Secure 2","Card payment gateway API","SQL Server","Akka","2020 – present","ERgU-FeJ0P2ENhXQKCe4cmDHHQGJuYVHP9waedu7J9c",{"id":227,"title":228,"body":229,"client":206,"description":300,"diagram":301,"extension":100,"kind":101,"meta":302,"navigation":103,"order":89,"outcome":303,"path":304,"pillar":305,"productUrl":108,"sector":306,"seo":307,"services":308,"status":108,"stem":311,"technologies":312,"years":125,"__hash__":316},"caseStudies\u002Fcase-studies\u002Fbuilding-a-multi-vendor-marketplace.md","Adding a Multi-Vendor Marketplace to an Existing Platform",{"type":8,"value":230,"toc":293},[231,233,236,238,264,266,283,285,288,290],[11,232,14],{"id":13},[16,234,235],{},"The platform already owned customer accounts, carts, card payments and gift cards. It needed multi-seller catalogs and inventory — but replacing its core with an off-the-shelf commerce product would have meant migrating everything that already worked. And stock had to stay correct even when one side of the integration was briefly unreachable.",[11,237,22],{"id":21},[24,239,240,246,252,258],{},[27,241,242,245],{},[30,243,244],{},"Keep one system of record."," The existing application remains the \"marketplace brain\" for sellers, carts, orders and payments. A headless commerce engine is used purely as an internal catalog and stock service, reachable only server-to-server.",[27,247,248,251],{},[30,249,250],{},"Isolate sellers structurally."," Each seller gets its own channel and stock location.",[27,253,254,257],{},[30,255,256],{},"Make checkout predictable."," Price and availability are snapshotted into the cart, so totals don't shift mid-checkout.",[27,259,260,263],{},[30,261,262],{},"Decouple stock from payment."," Stock is deducted after payment through queued jobs, so the commerce engine never needs to know about payments.",[11,265,55],{"id":54},[24,267,268,271,274,277,280],{},[27,269,270],{},"A GraphQL client for the commerce engine's catalog and stock operations.",[27,272,273],{},"A seller lifecycle: application → admin approval (provisioning a channel and stock location) → suspension with recorded reason → reactivation, plus listing and profile review.",[27,275,276],{},"A stock-sync worker that groups adjustments per seller, retries with exponential back-off and surfaces failures in an admin queue with manual retry.",[27,278,279],{},"Mixed carts that split marketplace and gift card items over the existing card payment.",[27,281,282],{},"Seller payouts, statements, charges, pickup locations and return workflows across buyer, seller and admin views.",[11,284,76],{"id":75},[16,286,287],{},"Sellers are onboarded, moderated and paid inside the platform customers already use. Inventory reconciles across transient failures instead of silently drifting.",[11,289,83],{"id":82},[16,291,292],{},"Splitting ownership is the hard part: orders and payments live in one system, stock in another. That makes the integration eventually consistent by nature, so retries, idempotency and failures an operator can see and act on are design requirements, not afterthoughts.",{"title":88,"searchDepth":89,"depth":89,"links":294},[295,296,297,298,299],{"id":13,"depth":92,"text":14},{"id":21,"depth":92,"text":22},{"id":54,"depth":92,"text":55},{"id":75,"depth":92,"text":76},{"id":82,"depth":92,"text":83},"Bringing third-party sellers, catalogs and stock into a live financial-services platform — without surrendering the system of record to a commerce engine.","marketplace",{},"Sellers can be onboarded, moderated and paid inside the existing platform, and stock reconciles even when the commerce engine is briefly unavailable.","\u002Fcase-studies\u002Fbuilding-a-multi-vendor-marketplace","build","Commerce",{"title":228,"description":300},[309,112,310],"Marketplace \u002F Commerce Platform","Architecture & Technical Consulting","case-studies\u002Fbuilding-a-multi-vendor-marketplace",[313,314,120,121,222,315],"Vendure (headless commerce)","GraphQL","Background workers","31vt29yx0lIf_4QdBeYynL10Rnr-9e8lMRamQeE23u0",1792463091532]