Advanced (Updated: 7/19/2026)

Design Azure Service Bus for EC Orders with Claude Code: Orders, Inventory, and Retry

A practical EC order memo for Azure Service Bus queues, topics, DLQ, duplicate detection, and resend rules.

Design Azure Service Bus for EC Orders with Claude Code: Orders, Inventory, and Retry

In an EC store, the order screen, inventory CSV, shipping request, mail log, and retry memo often live in different places. When a retry is pressed without a design table, stock can be reserved twice while only the confirmation mail was actually broken. This article turns Azure Service Bus queues, topics, subscriptions, dead-letter queues, and duplicate detection into a plain order-flow memo.

Why EC order flows break

  • Do not mix order accepted, inventory reserve, shipping request, mail send, and retry in one queue.
  • Use a topic when one order event must fan out to inventory, shipping, mail, and analytics.
  • Use a stable MessageId built from order id, line item id, and action before relying on duplicate detection.
  • Treat the dead-letter queue as an inspection desk, not a blind resend button.
  • Let Claude Code draft tables; keep payment, refund, personal data, and release approval with humans.

The Microsoft documentation for Service Bus overview, queues, topics, and subscriptions, dead-letter queues, duplicate detection, message transfers, and pricing tiers is the source base. The internal Azure memo pattern is also related to the Azure OpenAI privacy memo.

Scope split for Claude Code and humans

In an EC store, the order screen, inventory CSV, shipping request, mail log, and retry memo often live in different places. When a retry is pressed without a design table, stock can be reserved twice while only the confirmation mail was actually broken. This article turns Azure Service Bus queues, topics, subscriptions, dead-letter queues, and duplicate detection into a plain order-flow memo. Claude Code should read column names, event names, retry samples, and DLQ reason text. It should not receive card data, full address text, refund judgment, or credentials. The output should be a table with event name, input columns, queue or topic, subscription, MessageId, DLQ owner, retry condition, and human review.

Humans keep payment state, refund permission, privacy policy, stock finalization, warehouse contract, apology text, and release approval. This split matters because a technically valid retry can still be a business mistake. The table makes the stop point visible before production.

Three use cases

Use case 1

Order accepted is the place where many EC failures start. Input: order CSV, order id, line item id, SKU, quantity, payment status, and mail flag. Output: topic:orders plus inventory, shipping, mail, and analytics subscriptions. Human review: unpaid order, preorder, bundle, gift option, manual stock adjustment, and customer-facing mail copy.

Use case 2

Inventory reservation needs a stable business key. Input: order id, line item id, SKU, quantity, reserve action, and send log. Output: a MessageId table such as order id plus line item id plus reserve. Human review: quantity change, cancellation, reorder, bundle split, and stock return.

Use case 3

DLQ review must be readable by operations, not only engineers. Input: DLQ reason, description, order id, SKU, failure count, last failed time, and owner memo. Output: auto retry, fix then retry, hold order, refund review, or engineering investigation. Human review: customer notice, refund, inventory gap, warehouse contact, and resend permission.

Copy-paste prompt

You are preparing an Azure Service Bus design memo for an EC store.
Inputs: order CSV columns, inventory CSV columns, event names, retry logs, DLQ reason samples, and planned Azure tier.
Output:
1. Event table with eventName, input columns, queue or topic, subscription, MessageId, and DLQ owner.
2. Human review table for payment, refund, personal data, stock finalization, customer notice, and resend approval.
3. MessageId naming rules based on order id, line item id, and action.
4. DLQ classification: auto retry, fix then retry, hold order, refund review, engineering investigation.
5. One first action that can be done in 30 minutes.
Rules: do not put card data or full address text in messages. Do not blindly resend every DLQ message.

Working check code

const events = [
  { type: "order.accepted", orderId: "ORD-1001", lineItemId: "1", sku: "TSHIRT-M", quantity: 2, action: "accept" },
  { type: "inventory.reserve", orderId: "ORD-1001", lineItemId: "1", sku: "TSHIRT-M", quantity: 2, action: "reserve" },
  { type: "inventory.reserve", orderId: "ORD-1001", lineItemId: "1", sku: "TSHIRT-M", quantity: 2, action: "reserve" },
  { type: "mail.send", orderId: "ORD-1001", lineItemId: "", sku: "", quantity: 0, action: "confirmation" },
  { type: "inventory.reserve", orderId: "", lineItemId: "2", sku: "MUG-BLUE", quantity: 1, action: "reserve" },
  { type: "shipping.requested", orderId: "ORD-1002", lineItemId: "1", sku: "BAG-BK", quantity: 1, action: "ship" }
];

function routeEvent(event) {
  if (event.type === "order.accepted") {
    return {
      entity: "topic:orders",
      messageId: event.orderId + ":accepted",
      reason: "fan out to inventory, shipping, mail, and analytics subscriptions"
    };
  }
  if (event.type === "inventory.reserve") {
    return {
      entity: "queue:inventory-reserve",
      messageId: event.orderId + ":" + event.lineItemId + ":reserve",
      reason: "one stock reservation worker should own this line item"
    };
  }
  if (event.type === "mail.send") {
    return {
      entity: "queue:mail-send",
      messageId: event.orderId + ":" + event.action,
      reason: "mail can retry without touching stock"
    };
  }
  return {
    entity: "needs-design-review",
    messageId: event.orderId + ":" + event.type,
    reason: "route is not documented yet"
  };
}

const seen = new Set();
const findings = [];

for (const event of events) {
  const route = routeEvent(event);
  if (!event.orderId) {
    findings.push({
      type: "missing-order-id",
      eventType: event.type,
      fix: "do not send this message until the order id is present"
    });
  }
  if (seen.has(route.messageId)) {
    findings.push({
      type: "duplicate-message-id",
      eventType: event.type,
      messageId: route.messageId,
      fix: "keep the same MessageId for sender retry, but make the handler idempotent"
    });
  }
  if (route.entity === "needs-design-review") {
    findings.push({
      type: "unknown-route",
      eventType: event.type,
      fix: "decide queue, topic subscription, DLQ owner, and retry rule before release"
    });
  }
  seen.add(route.messageId);
}

console.table(findings);
if (findings.length > 0) process.exitCode = 1;

Pitfall: common mistakes

The first cause is one queue for every action. The fix is to use a topic for order accepted and separate queues or subscriptions for inventory, shipping, and mail. This prevents a mail retry from touching stock again.

The second cause is random MessageId generation. The fix is to generate the id from order id, line item id, and action before sending. Duplicate detection can only help inside the configured window when the id stays stable.

The third cause is blind DLQ resend. The fix is to classify each reason into auto retry, fix then retry, hold order, refund review, or engineering investigation. Messages that affect customers or refunds need human review.

The fourth cause is ignoring tier differences. The fix is to check whether topics, transactions, de-duplication, or sessions are required before choosing Basic, Standard, or Premium.

FAQ

Q. Should every EC event be a topic? A. No. Topic is useful when one event fans out. A queue is clearer when one worker owns one task such as inventory reservation or mail send.

Q. Does duplicate detection remove all double stock moves? A. No. It helps when MessageId is stable. The handler should still check whether the line item was already processed.

Q. Who should read DLQ? A. Operations and developers. EC failures can involve customer notice, refund, stock gap, and warehouse contact.

Q. What should message body contain? A. Prefer order id, line item id, SKU, quantity, and reference id. Review personal data and logging policy before adding sensitive text.

Training path

For EC teams, the money is not in drawing a cloud diagram. It is in reducing wrong stock moves, delayed shipping, and avoidable support tickets. Bring order CSV columns, three failed messages, and the current resend steps to the Claude Code training page. Use Claude Code training and consultation when the team needs help turning order CSV, inventory CSV, retry logs, and release approval into a workflow.

What I verified

For this article I checked Microsoft Learn pages for Service Bus overview, queues/topics/subscriptions, DLQ, duplicate detection, transfers and pricing tiers. I also ran the JavaScript route checker locally and confirmed that it reports missing order id, duplicate MessageId, and unknown route. The first action is to make one table for order, inventory, mail, and retry.

#claude-code #EC #Azure Service Bus #orders #inventory
Free

Free PDF: Claude Code Cheatsheet

Enter your email and download the one-page Claude Code cheatsheet for commands, review habits, and safe workflows.

We handle your data with care and never send spam.

Level up your Claude Code workflow

Start with the free PDF, use Gumroad guides when you need repeatable workflows, and book consultation when rollout or revenue paths need human judgment.

Masa

About the Author

Masa

Engineer focused on practical Claude Code workflows. Runs claudecode-lab.com, a 10-language technical media site.