H.Essers hoofdkantoor
H.ESSERS
Internship · Feb 2026 – May 2026
COMPANY
H.Essers
ROLE
Intern Software Developer
DURATION
Feb – May 2026
SCOPE
Proof of Concept
// INTERNSHIP CASE STUDY

Outlook Add-in
& Ingest API.

A proof of concept built during my internship at H.Essers , a logistics company based in Genk, Belgium. The project automates the manual process of forwarding shipment emails from Outlook into an internal dispatch system, using an Outlook Add-in paired with an event-driven backend.

// 01 · OVERVIEW

Overview.

// ABOUT H.ESSERS

H.Essers is an international logistics and transport company headquartered in Genk, Belgium. With operations across Europe and beyond, they handle complex supply chains for sectors including healthcare, chemicals and general cargo. The company employs thousands of logistics coordinators who manage daily shipment operations , many of which still rely heavily on email workflows.

01 / PROBLEM

Logistics coordinators at H.Essers received shipment data by email and had to manually re-enter it into internal dispatch systems. This process was slow, error-prone and impossible to audit at scale.

02 / APPROACH

I designed and built an Outlook Add-in that lets users submit selected emails and attachments directly to a downstream system. Behind an API gateway (Gravitee), a custom Ingest API retrieves the full email via Microsoft Graph and publishes a structured event to a Kafka topic for async downstream processing.

03 / SOLUTION

Coordinators can forward an email directly from Outlook without leaving the app. The backend processes it asynchronously, stores the content, and triggers the downstream workflow , fully logged and traceable end to end.

// OUTCOMES
  • [+] Delivered a fully working proof of concept covering the end-to-end email ingestion flow
  • [+] Built a custom Ingest API with deduplication and retry logic
  • [+] CI/CD pipeline set up on Azure , ready to deploy when the organisation decides to roll out
  • [+] Full technical documentation written covering architecture, API contracts and deployment steps
// LEARNED
  • [→] Shipping software inside an enterprise release process
  • [→] Designing APIs for other teams to actually consume
  • [→] Security, auth and observability in production systems
  • [→] How to translate vague business requests into technical specs
// 02 · TECHNICAL ARCHITECTURE

Architecture.

Outlook
Outlook Add-in (Frontend)
Office.js · JavaScript

Built with Office.js, the add-in renders a task pane inside Outlook. When a user selects an email and clicks submit, the add-in reads the email metadata and passes it to the API gateway. Authentication is handled via OAuth2 with Microsoft identity platform.

Gravitee
API Gateway
Gravitee · REST

All traffic flows through Gravitee as the API gateway. It handles routing, rate limiting and security policies. The gateway forwards validated requests to the Ingest API running behind it.

API
Ingest API (Backend)
Java 21 · Spring Boot

The core backend service. It receives the submission from the gateway, fetches the full email and attachments via the Microsoft Graph API using an OBO (On-Behalf-Of) OAuth2 flow, then publishes a structured event to a Kafka topic. Custom handling includes deduplication logic and retry mechanisms.

Kafka
Event Streaming
Apache Kafka

Events are published to a Kafka topic for async downstream processing. A Kafka consumer service processes each event, with deduplication to prevent duplicate submissions and full audit logging for traceability.

CI/CD
CI/CD Pipeline
Azure · GitHub Actions

A full CI/CD pipeline was set up for GitHub Actions , including build, test and deployment stages. The pipeline is ready to deploy the full system when the organisation decides to move from proof of concept to production.

Database
State DB
State storage

Tracks every submission , who submitted what email, when, and with what processing status. The Outlook Add-in reads this database to show the user their submission history directly inside the task pane.

Document storage
Document Storage
Saved files

The Ingest API saves the full email body and all attachments to document storage after fetching them from Microsoft Graph. The storage returns document IDs which are then included in the Kafka event for downstream reference.

Microsoft
Microsoft Graph
External · Microsoft API

External Microsoft API used by the Ingest API to retrieve the full email content and attachments. Access is granted via an OBO (On-Behalf-Of) OAuth2 flow , the user's token is exchanged so the backend can fetch emails on their behalf without storing credentials.

// 03 · TIMELINE

Timeline.

W1–2
Onboarding & Research
Feb 2026

Got access to internal systems, studied the existing Gateway API and codebase. Explored Office.js documentation and the Microsoft Graph API. Defined the project scope together with the team and wrote the initial project plan.

W3–5
Outlook Add-in , First Version
Mar 2026

Built the initial Outlook Add-in with Office.js. Implemented the task pane UI, email metadata reading and OAuth2 authentication flow. Got the first end-to-end request through the API gateway.

W6–9
Ingest API & Kafka Integration
Mar – Apr 2026

Built the Spring Boot Ingest API with Microsoft Graph OBO flow. Integrated Apache Kafka for async event publishing. Implemented deduplication and retry mechanisms.

W10–12
Testing & CI/CD
Apr – May 2026

Wrote unit and integration tests covering the core flows. Set up the GitHub Actions CI/CD pipeline on Azure. Ran k6 load tests to validate performance under realistic throughput.

W13
Handover & Documentation
May 2026

Wrote full technical documentation covering architecture decisions, API contracts, deployment steps and known limitations. Presented the proof of concept to the team and handed over the codebase.

// 04 · MY CONTRIBUTION

My Contribution.

01
Add-in development

Designed and built the full Outlook Add-in from scratch , task pane UI, email metadata reading, attachment handling and OAuth2 authentication flow.

02
Ingest API design

Designed and implemented the entire Ingest API , endpoint contracts, Microsoft Graph OBO flow, Kafka publishing and deduplication logic.

03
Testing & reliability

Wrote unit and integration tests end-to-end. Set up k6 load testing to validate throughput and identify bottlenecks before handover.

04
CI/CD pipeline

Set up the full GitHub Actions pipeline , build, test and deployment stages on Azure. Configured environments so the system is production-ready when the organisation decides to roll out.

05
Documentation

Wrote full technical documentation covering architecture decisions, API contracts, deployment steps and known limitations , so another developer can pick this up without me.

06
Solo delivery

Owned the entire project independently , from requirements analysis and technical design to implementation, testing and final presentation to the team.

// 05 · CHALLENGES & SOLUTIONS

Challenges.

01 / OAUTH2 OBO FLOW

Implementing the On-Behalf-Of OAuth2 flow to fetch emails via Microsoft Graph was the steepest learning curve. Token exchange between the add-in, gateway and backend required careful configuration of Azure app registrations and scopes.

→ Solution

Worked through the Microsoft Identity Platform docs in detail and set up a dedicated test environment to isolate auth issues. Introduced a token cache to reduce latency on subsequent requests.

02 / KAFKA IN ENTERPRISE

Working with Kafka in a production enterprise environment was new , existing topics, consumer groups and access policies were already in place. Getting local development to mirror the real environment took significant setup.

→ Solution

Used Docker Compose to spin up a local Kafka instance that matched the production config. Collaborated with the infrastructure team to understand the topic structure before writing any consumer code.

03 / DEDUPLICATION

The same email could be submitted multiple times by different coordinators or through retries. Without deduplication, the downstream system would process duplicate shipment entries , a serious data integrity issue.

→ Solution

Implemented idempotency keys based on email message ID. The Ingest API checks against a processed-events store before publishing to Kafka, rejecting known duplicates with a 409 response.

04 / ENTERPRISE PROCESS

Working within an enterprise release process meant every change needed approval, code had to meet internal standards and deployments followed a fixed schedule , a very different pace from school projects.

→ Solution

Adapted by planning features further ahead and keeping a clear backlog. Used the slower pace to invest more in documentation and test coverage than I would have in a faster environment.

// PROJECT STATUS

Status.

The project is a proof of concept and has not yet been taken into production at the time of handover.

// DONE

// STILL REQUIRED

// ADVICE FOR H.ESSERS

Next Steps.

Gravitee
Gravitee auth flow

Kafka
Kafka listener downstream

H.Essers
Production rollout

// 06 · MEDIA

Photos.

Stage foto 1
photo_1
Stage foto 2
photo_2
Stage foto 3
photo_3
Stage foto 4
photo_4
Stage foto 5
photo_5
Stage foto 6
photo_6
// DEMO VIDEO
// 07 · REFLECTION

Reflection.

// WHAT WENT WELL

The technical scope was well-chosen , complex enough to be interesting, focused enough to deliver in 13 weeks. Working independently pushed me to make architectural decisions I'd normally defer to a senior developer, and most of them held up well under review.

// WHAT I'D DO DIFFERENTLY

I'd involve the end users , the logistics coordinators , earlier in the process. My first UI iteration made assumptions about their workflow that turned out to be slightly off. An earlier feedback loop would have saved a week of rework mid-project.

// WHAT I TAKE WITH ME

How different enterprise software development feels compared to a school project , the constraints, the process, the care required around security and observability. It made me a more deliberate developer, and confirmed that I want to keep building at this level of complexity.

// SELF-INSIGHTS
// STRENGTHS

// GROWTH POINTS

// COMPETENCIES DEVELOPED
Backend development Office Add-in Event-driven architecture Enterprise auth (OAuth2 / OBO) Cloud deployment Containerisation Technical documentation Cross-team collaboration Independent delivery
// 08 · DOCUMENTS

Documents.

Realisatie Document
Open PDF ↗

Technical realisation document describing the implementation, architecture decisions and deliverables of the internship project.

Reflectie Document
Open PDF ↗

Personal reflection on the internship experience , what went well, what I would do differently, and how the project shaped my growth as a developer.

Project Plan
Open PDF ↗

The initial project plan submitted at the start of the internship , scope, objectives, timeline and technical approach.