ZATCA Phase 2 E-Invoicing Integration
Complete documentation for ZATCA (Zakat, Tax and Customs Authority) Phase 2 e-invoicing integration. This integration enables businesses in Saudi Arabia to automatically generate, sign, and submit compliant electronic invoices to ZATCA's Fatoorah platform.
Overview
The ZATCA Phase 2 e-invoicing integration enables businesses in Saudi Arabia to automatically generate, sign, and submit compliant electronic invoices to ZATCA's Fatoorah platform. This integration ensures full compliance with Saudi Arabia's e-invoicing regulations.
Key Features
- Automatic Invoice Submission: Invoices are automatically submitted to ZATCA when created and submitted
- XML Generation: Automatic generation of ZATCA-compliant XML invoices
- Digital Signing: Automatic signing of invoices using ZATCA CLI
- QR Code Generation: Automatic QR code generation for invoices
- Compliance & Production Modes: Support for both compliance testing and production environments
- Queue Management: Built-in queue system for batch processing
- Integration Logging: Comprehensive logging of all ZATCA operations
Prerequisites
Before starting the ZATCA integration setup, ensure you have:
- ZATCA Account: An active account on the Fatoorah platform (https://fatoorah.gov.sa)
- VAT Registration: Valid VAT registration number
- Company Information: Complete company details including:
- Legal company name
- VAT registration number
- Company address (street, building number, city, postal code, district)
- Commercial registration details (if applicable)
- System Requirements:
- Java 11 or higher (for ZATCA CLI)
- Internet connection for API communication
- Valid SSL certificates
Initial Setup
Step 1: Enable ZATCA Integration
- Navigate to Settings → ZATCA Settings
- Check the "Enable ZATCA Integration" checkbox
- Click "Save Settings"
Once enabled, additional configuration options will become available.
Step 2: Configure Basic Settings
Fatoora Server Environment
Select the appropriate environment:
- Sandbox: ZATCA test environment (for initial testing)
- Simulation: Test environment requiring OTP from Fatoorah platform
- Production: ZATCA production environment (for live operations)
Important: Start with Sandbox for testing, then move to Simulation before going to Production.
Type of Business Transactions
Choose your business transaction type:
- Let the system decide (both): Automatically determines B2B or B2C based on customer VAT registration
- B2B: Business-to-Business transactions only
- B2C: Business-to-Consumer transactions only
Note: Changing this setting requires redoing the onboarding process from CSR generation.
Currency
Select the currency for your invoices (typically SAR for Saudi Arabia).
Validate Generated XML
- Enabled: Validates XML during creation (recommended for testing/troubleshooting)
- Disabled: Skips validation for better performance (recommended for production)
Configuration
Seller Details Configuration
Navigate to the "Seller Details" tab in ZATCA Settings:
Required Fields
- Company: Enter your legal company name as it should appear on invoices
- Company Unit: The name of the onboarded EGS (Electronic Generation System) unit on Fatoorah platform
- Company Unit Serial: Unique identifier for your EGS unit
- Format:
1-Solution Provider Name|2-Model or version|3-Serial - Example:
1-ERPNext|2-15|3-1 - Use the "Auto Generate" button to automatically generate this value
- Format:
- Company Category: Select from:
- Services
- Goods
- Both
- Country & Country Code:
- Country: Saudi Arabia
- Country Code: SA
- Company Address: Complete address details:
- Company Address (full address)
- Street
- Building Number
- City
- Postal Code
- District
Seller ID Configuration
Required Fields
- Seller Name: Your registered seller name
- VAT Registration Number: Your 15-digit VAT registration number
Branch Configuration (Optional)
If you have multiple branches with different commercial registration numbers:
- Enable "Enable Branch Configuration"
- Configure Accounting Dimensions for company branches
- Set up branch-specific VAT registration numbers
Warning: Branch configuration requires manual setup of Accounting Dimensions.
Additional IDs (Optional)
Add additional identification numbers if required:
- Commercial Registration Number (CRN)
- MOMRAH License
- MHRSD License
- 700 Number
- MISA License
- Other ID
CLI Setup
The ZATCA CLI (Command Line Interface) is required for:
- Generating Certificate Signing Requests (CSR)
- Validating XML invoices
- Signing invoices digitally
Automatic Setup (Recommended)
- Select "CLI Setup" → "Automatic"
- The system will automatically:
- Download ZATCA CLI from GitHub
- Download Java 11 runtime (if needed)
- Configure paths automatically
Manual Setup
If you prefer manual setup:
- Select "CLI Setup" → "Manual"
- Download ZATCA CLI from: https://github.com/zatca/fatoora
- Install Java 11 or higher
- Configure paths:
- CLI Path: Full path to zatca-cli executable
- Example:
/home/user/zatca-cli/bin/zatca-cli(Linux/Mac) - Example:
C:\zatca-cli\bin\zatca-cli.bat(Windows)
- Example:
- Java Home: JAVA_HOME path (leave blank to use system default)
- CLI Path: Full path to zatca-cli executable
Override Download URLs (Advanced)
If you need to use custom download sources:
- Override CLI Download URL: Custom URL for CLI zip file
- Override JRE Download URL: Custom URL for Java runtime
Onboarding Process
The onboarding process establishes your connection with ZATCA and obtains the necessary credentials for invoice submission.
Step 1: Generate Certificate Signing Request (CSR)
- Ensure all Seller Details are correctly filled
- Navigate to ZATCA Settings → Onboarding tab
- Click "Generate CSR" or "Check CLI" first to verify CLI is working
- The system will:
- Generate a CSR using your company details
- Display the CSR in the settings page
- Save the CSR for later use
Step 2: Submit CSR to Fatoorah Platform
- Copy the generated CSR from the settings page
- Log in to Fatoorah platform: https://fatoorah.gov.sa
- Navigate to Onboarding → CSR Submission
- Paste the CSR and submit
- You will receive an OTP (One-Time Password) via email/SMS
Step 3: Complete Onboarding
- In ZATCA Settings, click "Start Onboarding"
- Enter the OTP received from Fatoorah platform
- Click "Verify OTP and Generate CSR"
- The system will:
- Verify the OTP with ZATCA
- Receive compliance credentials (Request ID, Security Token, Secret)
- Save credentials automatically
Step 4: Compliance Testing
Before going to production, you must pass compliance testing:
Manual Compliance Check
- Create test invoices in your system
- Ensure invoices have all required ZATCA fields
- In ZATCA Settings, click "Perform Compliance Check"
- Enter invoice names (comma-separated):
SINV-0001, SINV-0002 - Click "Submit to ZATCA"
- Review the results:
- Accepted: Invoice passed compliance
- Accepted with warnings: Invoice passed but has warnings
- Rejected: Invoice failed compliance (check errors)
Automated Compliance Check
The system can automatically create and test various invoice types:
- Click "Automated Compliance Check"
- Fill in required parameters:
- Company: Your company name
- Item: Select an existing item
- Simplified Customer (B2C): Customer without VAT registration
- Standard Customer (B2B): Customer with VAT registration
- Click "Start Automated Compliance"
- The system will create and test:
- Standard invoices (B2B)
- Simplified invoices (B2C)
- Credit notes
- Debit notes
Step 5: Production Onboarding
Once compliance testing is successful:
- Log in to Fatoorah platform
- Navigate to Production Onboarding
- Submit your compliance test results
- Receive production credentials:
- Production Request ID
- Production Security Token
- Production Secret
- Enter these credentials in ZATCA Settings → Integration tab
- Save settings
Sales Invoice Additional Fields
When ZATCA integration is enabled, each Sales Invoice automatically creates a Sales Invoice Additional Fields document containing ZATCA-specific metadata.
Accessing Additional Fields
- Open any Sales Invoice
- Navigate to the "ZATCA" tab or section
- View the Sales Invoice Additional Fields link
- Click to open the additional fields document
Key Fields in Additional Fields Document
Details Tab
- Sales Invoice: Link to the parent invoice
- Integration Status: Current status of ZATCA integration
Ready For Batch: Ready for submissionResend: Needs to be resentCorrected: Invoice was correctedAccepted: Successfully accepted by ZATCAAccepted with warnings: Accepted but has warningsRejected: Rejected by ZATCAClearance switched off: Clearance mode disabledDuplicate: Duplicate submission detected
- Last Attempt: Timestamp of last submission attempt
- Invoice Doctype: Type of invoice (Sales Invoice, POS Invoice, Payment Entry)
- Is Latest: Indicates if this is the latest version
- UUID: Unique identifier assigned by ZATCA
- Invoice Type Code: ZATCA invoice type code
- Invoice Type Transaction: Transaction type (B2B/B2C)
- Tax Currency: Currency code (typically SAR)
- Invoice Counter: Sequential counter for invoice hashing
- Invoice Hash: Cryptographic hash of the invoice
- Previous Invoice Hash: Hash of the previous invoice (for chaining)
Buyer Tab
- Buyer VAT Registration Number: Customer's VAT number (if B2B)
- Other Buyer IDs: Additional buyer identification numbers
- Buyer Address Details: Complete buyer address information
Invoice Tab
- Allowance Indicator: Indicates if allowances are applied
- Charge Indicator: Indicates if charges are applied
- Fatoora Invoice Discount Amount: Discount amount
- Sum of Charges: Total charges
- Invoice Line Charge Percentage: Percentage-based charges
- Invoice Line Charge Amount: Amount-based charges
- Prepayment VAT Category: Prepayment VAT details
XML Tab
- Invoice XML: Generated ZATCA XML (hidden by default)
- Download XML: Button to download the XML file
- QR Code: QR code image for the invoice
Integration Status Meanings
| Status | Description | Action Required |
|---|---|---|
| Ready For Batch | Invoice is ready for submission | None - will be processed automatically |
| Resend | Previous submission failed | Check errors and resubmit |
| Corrected | Invoice was corrected after submission | None - corrected version will be submitted |
| Accepted | Successfully accepted by ZATCA | None |
| Accepted with warnings | Accepted but has warnings | Review warnings |
| Rejected | Rejected by ZATCA | Fix errors and resubmit |
| Clearance switched off | Clearance mode is disabled | Enable clearance mode if needed |
| Duplicate | Duplicate submission detected | Check if invoice was already submitted |
Invoice Submission Workflow
Automatic Submission
When ZATCA integration is enabled, invoices are automatically submitted to ZATCA when:
- A Sales Invoice is created and submitted (not saved as draft)
- The invoice has all required fields
- ZATCA credentials are configured
Submission Process Flow
- User creates and submits Sales Invoice
- System creates Sales Invoice Additional Fields document
- System generates ZATCA-compliant XML
- System validates XML (if validation enabled)
- System signs XML using ZATCA CLI
- System calculates invoice hash and counter
- System submits signed XML to ZATCA API
- System receives response from ZATCA
- System updates Additional Fields with:
- UUID (if successful)
- QR Code
- Integration Status
- Errors/Warnings (if any)
- System creates ZATCA Integration Log entry
Manual Submission
If automatic submission fails or you need to resubmit:
- Open the Sales Invoice Additional Fields document
- Check the Integration Status
- If status is "Resend" or "Failed":
- Review errors in the Errors and Warnings field
- Fix any issues in the parent Sales Invoice
- Click "Resend to ZATCA" action button (if available)
Submission Types
Reporting Mode
- Standard submission mode
- Invoices are reported to ZATCA for record-keeping
- Used for most invoice types
Clearance Mode
- Real-time clearance required
- Invoices must be cleared by ZATCA before being considered valid
- Used for specific invoice types or high-value transactions
Invoice Counter and Hash Chain
ZATCA requires invoices to be cryptographically chained:
- Invoice Counter: Sequential number starting from 1
- Invoice Hash: SHA-256 hash of invoice data
- Previous Invoice Hash: Hash of the immediately preceding invoice
This creates an unbreakable chain ensuring invoice integrity and preventing tampering.
ZATCA Queue System
The ZATCA queue system manages invoice submissions in batches, ensuring reliable processing and retry mechanisms.
ZATCA Staged Invoice
Each invoice submission creates a ZATCA Staged Invoice record that tracks:
- Invoice: Link to the Sales Invoice
- Status: Current processing status
Pending: Waiting to be processedValidated: XML validated successfullySigned: XML signed successfullySubmitted: Submitted to ZATCAFailed: Submission failed
- Integration Type: Reporting or Clearance
- Submission Mode: Sandbox, Simulation, Production, or Compliance
- Invoice Counter: Sequential counter
- UUID: ZATCA-assigned unique identifier
- Invoice Hash: Cryptographic hash
- Previous Invoice Hash: Hash of previous invoice
- QR Code: Generated QR code
- Warnings/Errors: Any issues encountered
- Last Attempt At: Timestamp of last attempt
- Attempt Count: Number of submission attempts
- XML Paths: File paths for request XML, signed XML, and response JSON
Queue Processing
The queue system processes invoices in the following order:
- Pending invoices are picked up
- XML is validated
- XML is signed using ZATCA CLI
- Invoice is submitted to ZATCA API
- Response is processed and status updated
Batch Processing
Invoices with status "Ready For Batch" are automatically processed in batches:
- System collects all invoices with status "Ready For Batch"
- Processes them sequentially (maintaining hash chain)
- Updates status after each submission
- Retries failed submissions automatically
Retry Mechanism
Failed submissions are automatically retried:
- Attempt Count tracks retry attempts
- System waits between retries to avoid rate limiting
- Maximum retry attempts are configurable
- After max retries, status changes to "Failed"
Integration Logs
All ZATCA operations are logged in ZATCA Integration Log for audit and troubleshooting.
Accessing Integration Logs
- Navigate to ZATCA → ZATCA Integration Log
- View list of all ZATCA operations
- Filter by status, invoice, or date range
Log Fields
- Invoice: Link to the Sales Invoice
- Submission Type: Reporting or Clearance
- Status: Success, Warning, or Failed
- UUID: ZATCA-assigned unique identifier
- QR Code: Generated QR code
- Invoice Hash: Cryptographic hash
- Request XML Path: Path to request XML file
- Signed XML Path: Path to signed XML file
- Response JSON Path: Path to ZATCA response
- Message: General message from ZATCA
- Warnings: Any warnings received
- Errors: Any errors encountered
- Created On: Timestamp of log entry
Resending Failed Submissions
If a submission failed:
- Open the ZATCA Integration Log entry
- Check the Errors field for details
- Click "Resend to ZATCA" action button
- System will retry the submission
Troubleshooting
Common Issues and Solutions
1. CLI Not Found or Not Working
Symptoms:
- Error: "CLI path is not configured"
- Error: "CLI verification failed"
Solutions:
- Verify CLI is installed: Click "Check CLI" in settings
- For Automatic setup: Ensure internet connection and try again
- For Manual setup: Verify CLI path is correct and executable
- Check Java installation: Ensure Java 11+ is installed and JAVA_HOME is set
2. Onboarding Failed
Symptoms:
- Error: "OTP verification failed"
- Error: "CSR generation failed"
Solutions:
- Verify all Seller Details are correctly filled
- Ensure OTP is entered correctly (check for typos)
- Verify OTP hasn't expired (OTPs are time-limited)
- Check internet connection
- Verify CSR format is correct
3. Invoice Submission Failed
Symptoms:
- Integration Status: "Rejected" or "Failed"
- Errors in Integration Log
Solutions:
- Check Errors field in Integration Log for specific issues
- Verify invoice has all required fields:
- Customer VAT number (for B2B)
- Complete address information
- Valid items with prices
- Tax calculations
- Check invoice counter and hash chain
- Verify ZATCA credentials are valid
- Check if invoice exceeds ZATCA limits
4. XML Validation Errors
Symptoms:
- Error: "XML validation failed"
- Error: "Invalid XML structure"
Solutions:
- Enable "Validate Generated XML" in settings for detailed errors
- Check invoice data completeness
- Verify all required ZATCA fields are present
- Review XML file directly (download from Additional Fields)
5. Hash Chain Broken
Symptoms:
- Error: "Previous invoice hash mismatch"
- Error: "Invoice counter invalid"
Solutions:
- Verify invoices are submitted in order
- Check if any invoices were deleted or modified
- Reset invoice counter if necessary (contact support)
- Ensure no manual invoice counter changes
6. Credentials Not Working
Symptoms:
- Error: "Authentication failed"
- Error: "Invalid credentials"
Solutions:
- Verify credentials are correctly entered
- Check if credentials have expired
- Ensure correct environment (Sandbox/Simulation/Production)
- Re-run onboarding if credentials are invalid
7. QR Code Not Generated
Symptoms:
- QR Code field is empty
- QR Code image not displayed
Solutions:
- Verify invoice was successfully submitted
- Check if UUID was received from ZATCA
- Ensure invoice status is "Accepted" or "Accepted with warnings"
- Try resubmitting the invoice
Debugging Tips
- Enable XML Validation: Turn on "Validate Generated XML" to catch issues early
- Check Integration Logs: Always check logs for detailed error messages
- Review XML Files: Download and review XML files for structure issues
- Test in Sandbox First: Always test in Sandbox before Production
- Monitor Queue Status: Check ZATCA Staged Invoice for processing status
Best Practices
Configuration Best Practices
- Start with Sandbox: Always begin testing in Sandbox environment
- Complete Seller Details: Ensure all seller information is accurate and complete
- Use Automatic CLI Setup: Prefer automatic setup unless you have specific requirements
- Keep Credentials Secure: Never share ZATCA credentials
- Regular Backups: Backup ZATCA settings and credentials
Invoice Creation Best Practices
- Complete Customer Information: Ensure customer addresses are complete for B2B invoices
- Verify VAT Numbers: Validate customer VAT registration numbers
- Accurate Tax Calculations: Ensure tax calculations are correct
- Proper Item Descriptions: Use clear, descriptive item names
- Correct Invoice Types: Use appropriate invoice types (Standard/Simplified)
Submission Best Practices
- Submit Immediately: Submit invoices as soon as they're created
- Monitor Status: Regularly check integration status
- Address Warnings: Don't ignore warnings - address them promptly
- Maintain Hash Chain: Never skip or delete invoices in the chain
- Regular Audits: Periodically review Integration Logs
Production Best Practices
- Complete Compliance Testing: Pass all compliance tests before going live
- Monitor First Invoices: Closely monitor first production invoices
- Set Up Alerts: Configure alerts for failed submissions
- Regular Testing: Periodically test in Sandbox to ensure system works
- Keep Documentation: Maintain records of all ZATCA operations
Security Best Practices
- Secure Credentials: Store credentials securely
- Limit Access: Restrict ZATCA Settings access to authorized personnel
- Regular Updates: Keep ZATCA CLI updated
- Monitor Logs: Regularly review logs for suspicious activity
- Backup Regularly: Regular backups of all ZATCA data
Additional Resources
ZATCA Official Resources
- Fatoorah Platform: https://fatoorah.gov.sa
- ZATCA CLI GitHub: https://github.com/zatca/fatoora
- ZATCA Documentation: https://zatca.gov.sa
Support
For technical support or questions:
- Customer Support: https://helpdesk.botsolutions.tech/login#login
- Documentation: https://docs.botsolutions.tech
Glossary
- B2B: Business-to-Business transaction
- B2C: Business-to-Consumer transaction
- CLI: Command Line Interface
- CSR: Certificate Signing Request
- EGS: Electronic Generation System
- OTP: One-Time Password
- QR Code: Quick Response Code (for invoice verification)
- UUID: Universally Unique Identifier
- VAT: Value Added Tax
- XML: eXtensible Markup Language
- ZATCA: Zakat, Tax and Customs Authority (Saudi Arabia)