Register Devices
Every business needs at least one fiscal device to issue receipts. With MOR, you can register a Virtual Fiscal Device (VFD) in minutes — no hardware required.
What is a fiscal device?
A fiscal device is your authorized connection to the tax system. It signs every receipt with a digital signature that proves the transaction was properly recorded. Think of it as your business's official stamp for tax compliance.
Virtual Fiscal Device (VFD)
A software-based device that runs on your server or cloud. No hardware to buy or maintain.
- No hardware costs
- Easy to deploy
- Works with any POS software
- Auto-updates
Best for: Most businesses, especially those with existing POS systems
Hardware Fiscal Device
A physical device connected to your point of sale. Required in some specific cases.
- Works offline
- Tamper-resistant
- Physical receipt printing
- Battery backup
Best for: High-volume retail, areas with unreliable internet
Register a Virtual Fiscal Device
Here's how to register your first VFD. This is a one-time setup:
from mor_sdk import MorClient
client = MorClient(api_key="your_api_key")
# Register a new Virtual Fiscal Device
device = client.devices.register(
device_type="VFD",
name="Main Store POS",
branch_id="br_123abc" # Optional: for multi-branch setups
)
print(f"Device ID: {device.id}")
print(f"Status: {device.status}")
print(f"Serial Number: {device.serial_number}")Device object
Here's what you get when you register a device:
{
"id": "dev_abc123xyz",
"device_type": "VFD",
"name": "Main Store POS",
"serial_number": "VFD-2026-ET-001234",
"status": "ACTIVE",
"branch": {
"id": "br_123abc",
"name": "Head Office",
"address": "Bole Road, Addis Ababa"
},
"capabilities": {
"can_issue_receipts": true,
"can_issue_credit_notes": true,
"can_generate_z_report": true,
"offline_mode": false
},
"last_activity_at": "2026-03-15T10:30:00Z",
"created_at": "2026-03-01T08:00:00Z"
}Device statuses
ACTIVEDevice is ready to issue receipts. This is the normal operating state.
PENDING_ACTIVATIONDevice is registered but waiting for final activation. Usually completes within minutes.
SUSPENDEDDevice has been temporarily suspended. Contact support to resolve.
DEACTIVATEDDevice has been permanently deactivated. Cannot issue receipts.
Multi-branch setup
If you have multiple locations, you can organize devices by branch:
# First, create branches
main_branch = client.branches.create(
name="Main Store",
address={
"region": "Addis Ababa",
"subcity": "Bole",
"woreda": "03",
"kebele": "14",
"street": "Bole Road"
}
)
satellite_branch = client.branches.create(
name="Airport Kiosk",
address={
"region": "Addis Ababa",
"subcity": "Bole",
"woreda": "01",
"specific_location": "Bole International Airport, Arrivals"
}
)
# Then register devices for each branch
main_device = client.devices.register(
device_type="VFD",
name="Main Store Register 1",
branch_id=main_branch.id
)
airport_device = client.devices.register(
device_type="VFD",
name="Airport Kiosk POS",
branch_id=satellite_branch.id
)Offline mode
Internet can be unreliable. Our SDKs handle temporary disconnections automatically:
Online (Normal)
Receipts are signed and recorded in real-time. The fiscal code is immediately valid.
Offline (Temporary)
Receipts are queued locally and automatically synced when connectivity returns. Limited to 72 hours per regulations.
Device limits
The number of devices you can register depends on your plan:
| Plan | Devices | Branches |
|---|---|---|
| Free | 1 device | 1 branch |
| Starter | 5 devices | 3 branches |
| Business | 25 devices | 10 branches |
| Enterprise | Unlimited | Unlimited |
Best practices
Use descriptive names
Name devices clearly (e.g., “Cashier 1”, “Kitchen Kiosk”) so you can easily identify them in reports and troubleshooting.
One device per point of sale
Each register or checkout point should have its own device. This makes tracking and auditing much easier.
Generate daily Z-Reports
Ethiopian regulations require daily Z-Reports for each active device. Set up automated generation at end of business day.