Title
“Show this field on the Order History page.”
- Estimate
- ?
- Questions
- 00 / 13
- Layers
- 0 / 7
is full-stack, literally.
I build and debug enterprise B2B and B2C commerce on Microsoft Dynamics 365: React and TypeScript storefronts, C# commerce services, SQL, and the ERP underneath. When something breaks, I don't stop at the layer where it shows up.
The data was synced ahead of time, so the ERP never sees this request.
Fig. 1: The same page, three architectures. Choosing between them is the job.
Most of my tickets arrive as a business request, not a technical spec. Here's a typical one, and the questions it raises before anyone writes a line of code.
Title
“Show this field on the Order History page.”
Where does this data live in Finance & Operations?
F&O
Is it already in the Commerce channel database?
SQL
Does CDX synchronize it today?
CDX
Do we need a new CDX extension to bring it over?
CDXF&O
Or should it come live through the Real-time Service?
RTS
Can an existing CRT entity carry it?
CRT
Will ExtensionProperties do, or does it need a real contract?
CRT
Does it need a new CSU request, response and API?
CSU
How should the storefront module consume it?
React
What caching and query strategy fits?
CSUSQL
What does it cost in performance, and who pays it?
every layer
How does it behave for B2B and B2C accounts?
ReactCRT
How does it get from DEV to UAT to PROD?
DEV → UAT → PROD
One sentence. Thirteen questions. Seven layers. Working out where something belongs is often more work than the code, and it's the part of the job I enjoy most.
A Dynamics 365 Commerce storefront is a distributed system. There's a React app at the top, an ERP at the bottom, and services, databases and sync jobs in between. I work in all of them.
L1
depth −1
React and TypeScript modules on the Dynamics 365 Commerce SDK: product pages, search, cart, checkout, payments, order history, invoices and account pages. Business copy, limits and feature flags live in Site Builder, not in the code.
L2
depth −2
Custom controllers and endpoints on the Commerce Scale Unit, designed around how many calls a page really needs. I rebuild SDK calls by hand in Postman to see what goes over the wire.
L3
depth −3
CRT requests, responses, handlers, triggers and overrides. When the documentation runs out, I read Microsoft's SDK source or decompile the assembly to find where the extension point really is.
Waterlinecode above · data below
L4
depth −4
SQL in the crt and ext schemas: views, stored procedures, functions, table types and extension tables. I write recursive supersession chains, customer eligibility, inventory and order-history queries, and I often translate X++ logic into SQL to check what Commerce will actually see.
L5
depth −5
Getting ERP data into the channel: jobs and subjobs, scheduler setup, custom synchronized tables and fields, and debugging a sync that has quietly stopped working.
L6
depth −6
Live calls into the ERP when the data can't wait for the next sync. Part of the job is knowing when an RTS call per row won't hold up at scale.
L7
depth −7
X++ table and class extensions, Chain of Command, and the Commerce setup that everything above depends on: channels, catalogs, assortments, customer hierarchies, trade agreements and functionality profiles.
200 OK: response on its way back up
↔ All
every layer
Across every layer I follow my own changes from DEV through UAT to PROD: Azure DevOps work items, Git branches and pull requests, cherry-picks and reverts, build and release pipelines, Commerce packages and SDK upgrades.
Selected work on production B2B and B2C commerce for Evenica's clients. The client names are left out, but the technical detail is all here.
CF-01
Enterprise industrial distributor · B2B
╱ taken out of the read path
Order history and order details were built on real-time calls into Finance & Operations. Every customer page view meant an expensive trip to the ERP, and the new wireframes asked for much more data.
Business wireframes turned into an enterprise data architecture, and the ERP taken out of the read path.
CF-02
Industrial distributor · B2B
Discontinued products are superseded by others, sometimes several levels deep (A → B → C). The storefront had to sell the right replacement from the right warehouse, the same way the ERP decides.
ERP business rules reproduced faithfully at storefront speed.
CF-03
B2B invoice payments
Customers needed to filter invoices (current, past due, paid, unpaid) and pay everything due in one go. One real-time ERP call per invoice falls over when an account has hundreds of them.
Treated a UI feature as an API-design problem.
CF-04
Order templates · platform investigation
Custom fields had to be read and written on order templates, and the documentation didn't say how the platform handles either.
ProductLists/Search → GetProductListDataRequest → the channel database view) and proved it never calls the ERP, and that extra columns come through as ExtensionProperties automatically. The read side needed far less customization than first estimated.Reverse-engineered the platform instead of guessing at it.
CF-05
B2B distributor · checkout charges
An automatic charge had to apply only once per customer per day, but at the point in the pipeline where charges are calculated, the sales order doesn't exist yet.
The hard part was timing inside the pipeline, not the code itself.
Trace log
SymptomA surcharge showed up at checkout that nobody could explain.
CauseDecompiled the payment connector DLLs. The surcharge was added after authorization, inside the payment extensions, not in the storefront.
SymptomProducts disappeared from search and PDP prices went missing.
CauseTraced it through customer hierarchies, assortments, catalogs and sync jobs 1040/1150. It was a catalog and assortment problem, not a UI bug.
Symptomcatalog=-1 appeared in product URLs, but only sometimes.
CauseFollowed it into the SDK's product URL builder and found the missing catalog and category context that caused it.
SymptomSearch indexing kept failing on large catalogs.
CauseFixed stored-procedure timeouts, null references and batch failures in a custom Elasticsearch indexer, and made the active-index swap reliable.
SymptomCustomers couldn't log in after an environment refresh.
CauseRebuilt the Azure AD B2C, Commerce shared parameters and F&O Commerce user configuration that the refresh had wiped out.
SymptomA carrier weight limit was bypassed now and then on the server.
CauseFound the timing gap, then hardened the validation on both the server and the frontend, with configurable error messages.
Also shipped
A bug that shows up in React might start in a sync job, a stored procedure, a catalog assignment or a payment connector. I keep tracing until I find where it actually lives.
Someone asked for identical products to merge into one cart line. The answer was a Functionality Profile setting, synced by job 1070, so nothing needed to ship. I check configuration, Site Builder, the SDK, CSU, CRT and F&O, in that order, before building anything.
Something that works isn't always something that scales. I think in network calls, query sizes, ERP load, pagination, batching and caching before I think in components.
If I do the same manual task twice, I write something to do it. That has meant estimate generators, formatting scripts, and a whole time tracker.
Estimates, root-cause write-ups, UAT steps, configuration guides: I explain deep Commerce behaviour in language a client stakeholder can act on.
I don't hand code over a wall. I test in DEV, deploy and validate in UAT, and follow my changes into production.
Dynamics is what I specialize in, but it isn't all I do. I also build full-stack products on my own: for clients, for school, and for myself.
01Capstone · Mohawk College2025
A full-stack commerce platform for designing and ordering custom phone cases. Shoppers upload a photo or pick one from the gallery, crop and position it on a live device mockup, choose model, material and finish while the price updates, and pay with Stripe. Behind it is a full admin side for running the store.

Orbis · Gate valve
Industrial valves, engineered for flow.
DN 50–600 · PN 16 / 25 / 40
02Client website2025–26
The website for an industrial valve manufacturer in Ahmedabad, India: a product catalogue with material and specification tables for every valve, an industries section, a brochure download, and inquiry forms. It's built with Next.js and exported as static HTML so it runs on the client's shared hosting, with clean URLs and no server.
Cu2(OH)3Cl
Copper oxychloride · CAS 1332-40-7
03Client website2026
The website for a specialty chemical manufacturer in Gujarat that makes copper compounds (copper oxychloride, oxide and sulphate) and agrochemical and pharmaceutical intermediates. Product pages carry formulas, CAS numbers and specifications, and buyers can request a quote from any of them.
Week 39 · timesheet
37.75h
04Personal tool2026
A quarter-hour time tracker I built because I kept piecing my Friday timesheet back together from memory. It has a timer, a drag-and-resize week calendar, Google Calendar sync, hours per ticket against the original estimate, and a timesheet screen that prepares the whole week for submission.
I joined Evenica as a co-op student in 2024. They kept me on part-time while I finished school, and I went full-time in December 2025. My scope has grown every term since.
Dec 2025 → now
Evenica Corp. · Burlington, ON
Full-time on enterprise B2B and B2C commerce for Microsoft Dynamics 365 clients. My work now includes architecture investigation, backend Commerce and F&O integration, channel-data design, estimates, client-facing analysis, release management, and walking newer teammates through CDX, CRT and the Dynamics build.
2025
Evenica Corp. · Burlington, ON
Evenica kept me on after the co-op while I finished school. By then I was implementing substantial client features on my own and debugging production issues.
Sep 2024
Evenica Corp. · Burlington, ON
Joined on live client implementations rather than student projects, and learned the Commerce SDK, CSU, CRT, F&O and Evenica's architecture on real tickets.
2022 → 2025
Mohawk College · Hamilton, ON
Data structures and algorithms, databases, web and mobile development, .NET, Java and Python. Capstone: DesignMyCase.
Most people stop at the surface. If you need someone who won't, whether for a role, a project, or a bug that crosses too many layers, I'd like to hear about it.