🎉 1 month of building SafePay in public!
Day 30 Added a webhook delivery log where merchants can track failed deliveries, check error details, and resend them with one call.
30 days down, 30 to go. Still building, still learning!
Day 30/60
#BuildInPublic
SafePay has API docs now
Day 29 SafePay now sets Idempotent Replayed true on a replay so the client knows it got the original result not a new payment
And the API finally has real docs Swagger UI error codes and the webhook contract
Day 29/60 Building SafePay
#BuildInPublic
Simret Abebe retweeted
We hosted the first OpenAI hackathon in Ethiopia🥳
DevDay Bahir Dar was awesome, hope to do more of this
Day 4: Until I get into Y Combinator ⚡
Poll closed: msh won with 56%, so that's our official YC submission.
My phone died and power went off in Addis today lol 😭 but we finished it... so we’re building straight from the terminal.
Exactly 8 days left until the deadline. Day 4 logged. Let’s get into YC. 🇪🇹🔥
#buildinpublic #ycombinator #aiagents #coding #startups #msh
Who said building a project is always about success?
YenePay was supposed to be my third provider, but I couldn't access the website or required documentation. I'm putting it aside and looking for another provider while continuing to build SafePay.
Day 28 of SafePay.
Let's count Day 27 as DevDay community day. It was the first openai hackathon in Ethiopia. I got so much experience by connecting to real people and learn how real people matter and value in this community day and in team work.
#BuildInPublic
Day 26/60 Building SafePay
Started integrating SafePay’s third provider. SantimPay’s manual onboarding slowed things down, so after researching alternatives, I pivoted to YenePay for its developer sandbox.
Next : Integrating the third provider
#BuildInPublic
What should happen to a payment nobody pays?
SafePay now expires it. But first it asks the provider was it paid? If yes, it settles instead. If the provider doesn't answer, it does NOT expire. Unknown is not expired.
Day 25/60 Building SafePay
#BuildInPublic
Payment bugs can cost businesses money.
Building SafePay in 24 Days has taught me a lot about backend systems. Now, I’m taking the next step: opening up for small paid Django backend projects and working toward my first client. DM me.
#BuildInPublic
Payments that SafePay can't settle on its own now go into a review queue.
Each one shows the reason how long it's been waiting and which merchant it belongs to. Telegram alert as a bot if needed.
Thanks @GetPingCron for the feedback that shaped it.
Day 23/60 Building SafePay.
A shop can finally see its own payments in SafePay.
Newest first, filter by status, provider, reference or date, in pages that never repeat.
Day 22/60 Building SafePay
#BuildInPublic
Day 21/60 No code today.
Building is the easy part. The real question is do people need SafePay? I’m asking developers and shop owners in Ethiopia how they handle payments and what goes wrong. Time to listen, gather information, and learn before building more.
#BuildingInPublic
A test key can't read a live payment A live key can't read a test one.
Day 20 SafePay has test keys and live keys with separate data. A live key is refused unless two switches are on and no provider is marked live capable yet so no real money can move.
Day 20/60
#BuildInPublic
Building SafePay in public one API for Ethiopian payment providers.
19 days in, it already retries safely, re checks stuck payments and switches providers when one is down.
Day 20 drops will be soon⚡
#BuildInPublic
A shop gives you a webhook URL. Your server will call it.
What if the URL is 127.0.0.1 or a cloud metadata address ? That's SRRF.
Day 19 SafePay refuses private addresses checks again at send time, and never follows redirects. Each shop also gets its own secret.
Day 19/60
Every Ethiopian payment provider plays by different rules.Different APIs, test methods and security rules, so SafePay uses adapters and fallback.
Day 19 drops in a few hours ⚡
#BuildInPublic
When should a payment API fail over to another provider?
Not on every error. Only when it's certain the first provider created nothing. After a timeout, SafePay keeps the payment pending and retries the same provider. Unknown is not failed.
Day 18/60 SafePay
#BuildInPublic
My first time working with Ethiopian payment providers has been a great learning experience.Each provider has its own APIs, testing methods, and security requirements. That’s why I’m building SafePay with adapters and fallback support.
Day 18 work in few hours !
#BuildInPublic
Anyone on the internet can hit your webhook URL and claim an order is paid.
Day 17: Brought ArifPay to full parity with Chapa. SafePay never blindly trusts incoming webhook payloads it catches the callback, verifies directly with ArifPay.
Day 17/60 Building SafePay
#60Days













