Custom software · E-commerce · Robotics and programming education

Robocode: academy, online exams, shop and a partner network on one platform

The integrated platform for the Robocode academy on .NET 10: online and in-person courses, exams with report cards, a shop with wholesale pricing, certificate issuance with QR verification, a partner and instructor panel with commission, and single sign-on from Shad.

Client
Robocode training institute
Industry
Robotics and programming education
Year
2025
Status
Live
  • Discovery and analysis
  • UX and UI design
  • Software architecture
  • Front-end development
  • Back-end and API development
  • Database design
  • Third-party integrations
  • Deployment and DevOps
  • Technical SEO
  • QA and testing
  • Support and ongoing development

The result, in numbers

18
modules with isolated schemas

in one deployment, on one database

2,831
automated tests

1,922 domain and API, 697 panel, 212 site

154
site and panel pages

57 public, 97 administrative

The challenge

Robocode is four businesses at once: an academy, an equipment shop, an examination and certification body, and a network of representatives and instructors across different cities. Each of those normally has its own software — and that is exactly where it breaks.

With four separate systems, a user registers four times, a student who bought a course is a stranger in the shop, a representative's commission has to be added up by hand from two reports, and for one simple number — how much did we sell this month — a manager has to line up three spreadsheets.

Three further constraints had no off-the-shelf answer. Login from Shad: much of the audience is schoolchildren, who must sign in from the national student network without a phone number. A second storefront: the Shad landing page needs its own catalogue, shipping methods and gateway, but on the same data and the same stock. And heavy video: a two-gigabyte file does not survive a plain upload over a domestic Iranian connection.

The solution

One platform was built to run all four businesses, but inside it are 18 modules with real boundaries: each owns its own database schema and never touches another module's tables.

For the user the result is simple: one identity, one cart, one payment, one report. A student who buys a course has the same account in the shop, one loyalty balance, and a manager reads the sales figure from one dashboard rather than three files.

The three hard problems were solved like this:

Login from Shad runs as a server-to-server exchange with a merchant token and a one-time hash valid for ten minutes; the account is created without a phone number.

The second storefront was solved with a concept called Surface: the main shop and the Shad landing page have their own catalogue, shipping methods, orders and gateway — on the same data and the same stock, without duplicating the system.

Two-gigabyte video is uploaded in chunks and resumes from the same chunk after a dropped connection rather than starting again.

And because money moves along several paths — course purchases, product orders, the wallet, representative commission, refunds — cross-module work goes through an outbox table: granting a course after payment, crediting the wallet after a refund, and 44 other events, with retries and finally a dead-letter queue. None of them is tied into one transaction and none is lost.

Key features

  • Online exams with detailed report cards

    A question bank, exam categories and packages, timed sittings, automatic marking, and a report card with raw scores and percentages broken out.

  • Certificates and QR membership cards

    Bilingual certificates with a template and seal, a QR membership card and a public verification page — anyone can check a certificate themselves. Students can request one from their own panel.

  • A shop with tiered wholesale pricing

    Products with variants and stock, tiered wholesale prices, shipping by geographic zone and weight, free delivery above a threshold, and card-to-card receipts.

  • Representative, coach and instructor panels

    Application and approval, levels and specialisms, a commission policy with automatic settlement, and an itemised earnings report — a partner can see exactly which sale earned what.

  • Online courses with two-gigabyte video

    Chapters and lessons, chunked upload to 2 GB that resumes after a dropped connection, sale by lesson or bundle, a dedicated player and content access control.

  • Payments, wallet and targeted discount codes

    A direct Parsian gateway integration with verification and reversal per the bank contract and protection against duplicate callbacks, a wallet, discount codes with usage caps, and traceable refunds.

  • Single sign-on from Shad

    A student signs in from inside the national student network without a phone number: a server-to-server exchange with a merchant token and a one-time hash that expires in ten minutes.

  • Two storefronts on one dataset

    The main shop and the Shad landing page have their own catalogue, shipping, orders and gateway — on the same stock and the same reporting, without duplicating the system.

Architecture and stack

Style
Modular monolith
Patterns
Domain-driven designEvent-drivenOutbox pattern

A modular monolith: one unit is deployed, but it is bounded like several services — the simplicity of a single deployment with the boundary discipline of microservices.

Real boundaries, not nominal ones. Each module has its own DbContext and its own schema, all inside one PostgreSQL database with 18 separate schemas. A module cannot join another module's tables; it reads only from that module's public contract. This is the one thing that stops a monolith turning into a tangle, and because it is enforced at the schema level, compliance is not optional.

Event-driven communication with guaranteed delivery. Cross-module work — granting a course after payment, crediting the wallet after a refund, calculating a representative's commission — goes through an outbox table with exponential-backoff retries and finally a dead-letter queue. A successful payment is never rolled back because another module was slow.

Two storefronts on one dataset. The Surface concept lets the main shop and the Shad landing page have their own catalogue, shipping methods, orders and gateway without duplicating the system. If a third storefront is needed, it is a configuration rather than a new deployment.

Live configuration. The gateway, SMS templates, SEO settings, landing content and the SSO connection are all changed from the panel; no redeployment is required. For a system whose operations team are not developers, that is the difference between "tomorrow" and "done".

Back end and API
.NET 10C#Entity Framework CoreMediatRHangfireREST API

API, domain and scheduled jobs; 96 projects, 65 versioned controllers

Database
PostgreSQL

PostgreSQL 16 — 18 isolated schemas, 109 versioned migrations

Cache
Redis

Redis 7 — sessions, one-time codes, rate limiting

Front end
Next.jsReact.jsTypeScriptTailwind CSS

Server-rendered public site with SEO — 57 pages, full RTL and the Jalali calendar

Front end
Vite

Admin panel with TanStack Query — 97 administrative pages

Infrastructure and deployment
Dockernginx

Docker Compose, nginx and Let’s Encrypt — single server, reversible

CI/CD and monitoring
SerilogSeq

Structured logging and request tracing

Integrations

  • Shad — single sign-on from the national student network, without a phone number
  • Parsian bank gateway — verification, reversal and protection against duplicate callbacks
  • SMS.ir — transactional and campaign SMS with a full log
  • A dedicated mail service with DKIM, SPF and DMARC

Full write-up

Every capability, in detail

Each area is a product in its own right, but all of them sit on one identity, one cart, one payment and one report.

Education

In-person and online courses, a chapter and lesson structure, chunked video upload to 2 GB that resumes after a dropped connection, sale by individual lesson or as a bundle, a dedicated player, and content access control based on what the user has bought.

Examinations

A question bank, exam categories and packages, timed sittings, automatic marking, and a detailed report card with raw scores and percentages.

Shop

Products with variants and stock, tiered wholesale pricing, shipping methods based on geographic zone and weight, free delivery above a set amount, and card-to-card receipt capture.

Payments

A direct Parsian gateway integration with verification and reversal per the bank's contract, a user wallet, targeted discount codes with usage caps, and traceable refunds.

Certificates and cards

Bilingual certificate issuance with a template and seal, a QR membership card with a public verification page, and certificate requests raised by students themselves.

Partner network

Representatives, coaches and instructors with an application and approval flow, levels and specialisms, a commission policy with automatic settlement, and an itemised earnings report.

Communications

Transactional and campaign SMS over SMS.ir with a separate template code per event and a full send log, a newsletter, and in-app announcements with rich text and attachments, targeted by role.

Content and media

A blog and block-based page builder, SEO and metadata settings, a media library with image processing and thumbnails, and secure serving of private files.

Identity

One-time-code login, fine-grained roles and permissions, parent-to-student linking, an address book, and single sign-on from Shad.

The eighteen modules

Each module owns its own database schema and never touches another module's tables; they communicate only through public contracts and events.

Identity — Users, roles, tokens, addresses, Shad identity

Academy — Courses, enrolment, course purchase, content delivery

Exam — Exam categories, exam packages, sittings

Store — Products, orders, shipping

Payment — Transactions, verification, refunds, bank reversal

Pricing — Wallet, coupons, commission, settlement

Certificate — Certificate requests, membership cards

Representative — Coach and instructor applications, levels, specialisms

Notification — Campaigns, announcements, newsletter

Media — Files, image processing, chunked upload

CMS — Articles, page builder, blocks

Settings — Live system configuration without a deployment

Search — The unified catalogue index

Reporting — Sales and performance dashboards

Audit — A record of sensitive changes

Loyalty — Points and rewards

Festival — Events and competitions

Backoffice — Internal tools

Engineering discipline

  • 2,831 automated tests — 1,922 domain and API, 697 panel, 212 site. Every bug fix ships with a test that exercises the exact broken case.
  • 109 database migrations — schema changes are always versioned and reversible; nothing is applied by hand to the production database.
  • 44 integration events — the contract between modules is explicit and typed rather than a direct call across layers.
  • 65 API controllers with versioning, layered rate limiting and RFC 7807 error responses.

External integrations

Shad — single sign-on from the national student network: a server-to-server exchange with a merchant token, a one-time hash expiring in ten minutes, and account creation without a phone number.

Parsian bank — purchase request, secure callback, transaction verification after a full match of amount and identifiers, and refunds, with idempotency against duplicate callbacks.

SMS.ir — transactional SMS with a separate template code per event, scheduled campaigns, and a complete send log.

Dedicated mail service — organisational email on the same infrastructure with DKIM, SPF and DMARC, plus brute-force protection.

Have a similar project in mind?

Fifteen minutes is enough to say what it needs, how long it takes and where to start.