Why a pay slip matters
Before Bloccpay, I could get paid, eventually. What I could not do was prove it. A wallet history is not a record a bank will accept as proof of income. When I moved to the UAE, opening an account and showing what I earned was the hard part, not the money itself.
Ordinary employment produces that proof as a side effect. Every month there is a payslip, and nobody thinks about it. People paid across borders, in stablecoins or through a chain of friends and trades, often get nothing a bank can read. So for us the payslip is not an extra. It is half of the product.
A document people give to banks
That one sentence ended up shaping most of the code. A payslip is something a person hands to a bank, a landlord or a visa office. Whatever it says, they are saying it too. So every rule starts from: what would make this document untrue?
It only exists for money that was paid. A payslip for a pending or failed payment would be a false statement. The system refuses to issue one until the payment has settled.
Only two parties can download it. The person who was paid, and an active admin of the business that paid them. When a business admin downloads someone’s payslip, we record it, because that is someone else’s pay leaving in a file.
The period has to agree with the amount. Someone who joins mid-month is paid for part of the month. Their payslip has to show a period that starts on their start date, not the first of the month. Before payslips, the pay period was worked out inside the proration code and nowhere else. I pulled it out into one place that both use, and wrote tests that fail if the two definitions ever drift apart. To check those tests could fail at all, I changed a monthly period to four weeks, and three of them failed. A full month printed beside a part-month amount reads as an error, on exactly the kind of document where an error costs someone a flat.
Saying what changed, in the right currency
When a person is paid less than their recorded salary, the payslip names the difference a deduction and shows what it came from. When they are paid more, it is an addition. That comparison happens in the salary’s own currency, so an exchange-rate movement is never reported as a deduction someone did not have.
If a pay item was adjusted, the payslip carries the note meant for the person. It never carries the internal reason. Those are two different fields with two different audiences, and there is a test that checks the internal one never reaches the document.
The people paid before payslips existed
Some people had been paid through Bloccpay before we linked each payment to its payroll record. Without that link there was nothing to build a payslip from, and those people would have had no download at all. But the payment itself carried everything a payslip states: the amount, the currency, the date, who paid and who was paid. So for those older payments the payslip is built from the payment directly. Nobody loses their proof because we built the feature later than their pay day.
The file outlives the app
A small thing I care about: the file name. It is “Payslip”, the person’s name, and the month, not a database ID. The file will sit in someone’s downloads folder, then be attached to an email to a bank, long after they have closed our app. It should still make sense there.
The same thinking runs through the other documents. Transactions have receipts. Invoices have receipts for both sides, one for the client and one for the contractor.
Money moving is what people see. Being able to prove it moved is what lets them rent the flat, open the account, or get the visa. That is why, as I told Disrupt Africa, the documentation layer is as important as the payment.