If you’ve ever wanted your accounting, sales, or ERP system to magically send your invoices straight to ZIMRA without the need to print, scan, or sacrifice a small goat, you’ve come to the right place. Yes, fiscalisation is here, and yes, your system can do it—if you know the right tricks.
Step 1: Know Your Enemy (AKA ZIMRA FDMS)
ZIMRA’s Fiscal Data Management System (FDMS) is like that strict teacher who always wants your homework done exactly right. It expects your invoices in a certain format, with digital signatures, timestamps, and a lot of fields you didn’t even know existed.
Luckily, brave developers have already started decoding it. Two excellent starting points are:
- zimra-public by lordskyzw – Think of this as your cheat sheet for public FDMS endpoints.
- ZimraEGS by mabaega – A slightly more hands-on library for talking to FDMS from your code.
Step 2: Pick Your Weapon
Most modern systems speak JSON, REST, or SOAP. FDMS expects certain structured requests, usually over HTTPS, with a digital signature. If you’re using PHP, Python, or Java, you can integrate fairly easily.
Here’s a tiny PHP example using ZimraEGS:
require 'vendor/autoload.php';
use Zimra\Egs\EgsClient;
$client = new EgsClient([
'api_key' => 'YOUR_API_KEY',
'env' => 'sandbox', // or 'production'
]);
$invoiceData = [
'invoiceNumber' => 'INV-2025-001',
'date' => '2025-09-30',
'totalAmount' => 1250.50,
'taxAmount' => 200.00,
'customer' => [
'name' => 'Dexter Wurayayi',
'tin' => '1234567890'
],
'items' => [
['description' => 'Laptop', 'quantity' => 1, 'unitPrice' => 1250.50]
]
];
$response = $client->submitInvoice($invoiceData);
if($response->success){
echo "Invoice sent to ZIMRA successfully! 🎉";
} else {
echo "Error: " . $response->message;
}
Pro Tip: Sandbox first. You don’t want your first invoice to be “Oops, I just sent a million-dollar invoice to ZIMRA”.
Step 3: Make Your ERP System Do the Talking
Now, your accounting system probably has some export feature. You can hook into it via:
- Database triggers: When a new invoice is added, call a script to send it to FDMS.
- Webhook approach: If your system supports webhooks, trigger the submission script automatically.
- Scheduled cron jobs: For batch uploads (perfect for lazy Fridays).
Example in Python using zimra-public endpoints:
import requests
import json
url = "https://sandbox.zimra.co.zw/fdms/api/v1/invoices"
payload = {
"invoiceNumber": "INV-2025-002",
"date": "2025-09-30",
"totalAmount": 500.00,
"taxAmount": 80.00,
"customer": {
"name": "Tech Geek Ltd",
"tin": "9876543210"
}
}
headers = {
"Authorization": "Bearer YOUR_ACCESS_TOKEN",
"Content-Type": "application/json"
}
response = requests.post(url, data=json.dumps(payload), headers=headers)
if response.status_code == 200:
print("Invoice successfully sent!")
else:
print("ZIMRA is angry. Status:", response.status_code, "Message:", response.text)
Step 4: Test, Debug, Repeat
- Log everything: FDMS will reject invoices silently if something is wrong. Logs are your lifeline.
- Sandbox is your friend: Test until your cat loses interest in walking across your keyboard.
- Error handling: Expect weird errors like
Invalid TIN
orTimestamp out of sync
. Handle gracefully.
Step 5: Celebrate (Carefully)
Once you’ve connected your system, every invoice can flow automatically to ZIMRA. It’s like having a digital accountant that never sleeps—but don’t throw a party yet, compliance is serious business.
TL;DR
- FDMS = strict but programmable.
- Use zimra-public or ZimraEGS.
- Sandbox first, real invoices later.
- Hook into your ERP/accounting system using triggers, webhooks, or cron jobs.
- Log and debug everything.
Now your accounting system can speak ZIMRA fluently—without you needing to learn Shona or sign endless PDFs.