Amanti
- Java
- Spring Boot
- REST APIs
- MySQL
- Next.js
- Material UI
- Stripe
- Shopify (Remix)
- JUnit
- Mockito
- SonarQube
- Docker
In Morocco, couriers don't leave parcels at the door, so home delivery fails when nobody is in. Amanti routes parcels to local shops customers already visit, so they collect whenever it suits them. I built the platform behind it: the backend, the admin dashboard, the payments, and the plugin that drops it into online checkouts.
The Problem
In Morocco, online shopping runs on cash on delivery: you pay the courier when the package reaches you. Couriers don't leave packages at the door the way they do in the US. So if nobody is home when the courier arrives, the delivery fails. The courier has to come back another day, the package bounces between trips, and the customer keeps waiting.
The Idea
Most people already pass a neighbourhood shop every day. Amanti turns those shops into drop points: the courier leaves the package at a shop near the customer, and the customer picks it up whenever it suits them.
How a Delivery Works
- The customer orders online. On the online store's normal checkout page, they choose a drop point near them instead of home delivery.
- Amanti receives the order automatically. The store notifies Amanti the moment the order is placed, and a delivery is created.
- The courier drops the package at the shop. The handover is confirmed with a QR code and a photo, so there is a record that the package arrived.
- The customer picks it up. They come by when it suits them, the handover is recorded the same way, and they pay the shop in cash, just as they would have paid a courier.
- The shop settles up. From its page in Amanti, the shop sends the collected money through Stripe, which splits it automatically: the online store gets paid for the order, and Amanti takes its fee.
What We Tried First
- Asking customers to pay online up front. Cash on delivery is the norm in Morocco, so an online payment step made customers abandon their orders.
- A browser extension that added the drop-point option to store pages. It meant running our code in shoppers' browsers, which was too big a security risk.
The Final Solution: A Checkout Plugin
We built a native Shopify plugin that adds the drop-point choice directly to the store's own checkout, so customers never leave the page they already trust. Shopify was only the first platform. We kept all the delivery and payment logic in Amanti's own back end rather than in the plugin, so adding another e-commerce platform later would only take a small plugin talking to the same system.
What I Built
I built Amanti from scratch with one other engineer, during my internship at OpenTecc:
- The Spring Boot back end that runs every delivery, from the moment an order arrives to the final payout.
- Access control for three user roles, with every action recorded automatically in an audit log. It uses aspect-oriented programming, so no new feature can skip it.
- The QR code and photo check-in and check-out, so there is always proof of who had a package last.
- The Stripe payments that split each payment between the online store and Amanti.
- The Shopify plugin and the Next.js admin dashboard for orders, shipments, returns and payments.
We designed the system in UML before writing any code. I later raised test coverage from 20% to 80% with JUnit and Mockito, with SonarQube checking code quality.
Analytics
The dashboard provides a comprehensive view of the business health, featuring real-time analytics on orders, performance, and payments.





Logistics
Efficiently manage the entire shipment lifecycle, from creation to delivery. The system supports detailed tracking, history logs, and secure check-in processes.






Returns
A streamlined flow for handling product returns, ensuring customer satisfaction and operational efficiency.



Payments
Robust financial integration with Stripe, handling secure transactions and payouts.



Settings
Comprehensive system configuration options for general settings, account management, and storage.



What I Learned
Amanti was a pivotal project that taught me how to bridge the gap between technical complexity and user convenience. I learned to navigate the intricacies of the Spring Boot ecosystem on a large scale, managing the "Last-Mile" logistics with robust state management and real-time tracking. The biggest takeaway was the importance of iterative design—pivoting from a browser extension to a native plugin was a difficult but necessary decision that ultimately defined the project's success.





