Automate Philippine BIR (Bureau of Internal Revenue) tax form generation and filing. Handles 1601-C (withholding tax), 2550Q (quarterly VAT), 1702-RT/EX (annual income tax), and ATP (Authorization to Print) validation. Ensures 100% compliance with BIR regulations.
Transform Claude into a BIR compliance specialist that automates all Philippine tax filing requirements with zero errors.
Generate Form 1601-C - Monthly withholding tax returns
Generate Form 2550Q - Quarterly VAT declarations
Generate Form 1702-RT/EX - Annual income tax returns
ATP Validation - Authorization to Print expiry monitoring
OCR Validation - Verify scanned forms against computed data
Compliance Rate: 100% | Error Rate: 0%
When asked to handle BIR compliance:
User asks: "Generate 1601-C for October 2025 - RIM agency"
Steps:
1. Query Odoo for vendor payments with withholding
2. Categorize by ATC (Alphanumeric Tax Code)
3. Calculate withholding tax by category
4. Generate schedule of payees
5. Compute total tax withheld
6. Create Form 1601-C in BIR XML format
7. Validate against ATP expiry
8. Generate PDF for submission
Result: Ready-to-file Form 1601-C with schedules
See examples/generate-1601c.md for full workflow.
User asks: "Generate Q3 2025 VAT return for all agencies"
Steps:
1. Query sales and purchases for Q3
2. Compute output VAT (12% of sales)
3. Compute input VAT (VAT from purchases)
4. Calculate VAT payable (output - input)
5. Handle zero-rated and VAT-exempt transactions
6. Generate supporting schedules
7. Create Form 2550Q in BIR format
8. Validate ATP validity
Result: Quarterly VAT return with full schedules
See examples/generate-2550q.md for process.
User asks: "Check ATP expiry for all agencies"
Steps:
1. Query ATP database (stored in Supabase)
2. Check validity dates
3. Identify expiring/expired permits
4. Flag forms affected
5. Send renewal reminders
6. Update Notion tasks
7. Generate compliance report
Result: ATP status report with action items
See examples/atp-monitoring.md for details.
User asks: "Generate 2024 annual income tax return"
Steps:
1. Query Odoo for full year transactions
2. Compute gross income
3. Compute allowable deductions
4. Calculate taxable income
5. Apply corporate tax rate (25% or 20%)
6. Account for quarterly payments
7. Compute tax payable/refundable
8. Generate supporting schedules
9. Create Form 1702-RT
Result: Annual income tax return with full documentation
See examples/generate-1702rt.md for workflow.
User asks: "Validate this scanned 1601-C form"
Steps:
1. Extract form data using PaddleOCR
2. Parse BIR form fields
3. Query Odoo for expected values
4. Compare computed vs scanned amounts
5. Flag discrepancies
6. Generate validation report
7. Recommend corrections
Result: Validation report with confidence scores
See examples/ocr-validation.md for process.
Purpose: Monthly withholding tax return format
Key Fields:
{
'tin': '123-456-789-000',
'registered_name': 'AGENCY NAME',
'period_covered': {
'month': 10,
'quarter': None,
'year': 2025
},
'schedules': {
'1': { # Schedule 1: Expanded Withholding Tax
'WC010': { # Professional fees
'atc': 'WC010',
'tax_base': 500000.00,
'tax_rate': 0.10,
'tax_amount': 50000.00
},
'WC020': { # Professional fees >720k
'atc': 'WC020',
'tax_base': 800000.00,
'tax_rate': 0.15,
'tax_amount': 120000.00
}
},
'2': { # Schedule 2: Compensation
'employees': [
{
'name': 'Employee Name',
'tin': '987-654-321-000',
'gross': 50000.00,
'tax_withheld': 5000.00
}
]
}
},
'summary': {
'total_tax_withheld': 175000.00,
'total_remitted': 175000.00
}
}
See reference/form-1601c-spec.md for complete spec.
Purpose: Map transaction types to BIR tax codes
Common ATCs:
ATC_CODES = {
'WC010': {
'description': 'Professional fees',
'rate': 0.10,
'threshold': 720000 # Annual
},
'WC020': {
'description': 'Professional fees >720k',
'rate': 0.15,
'threshold': None
},
'WC030': {
'description': 'Professional fees to government',
'rate': 0.05,
'threshold': None
},
'WC140': {
'description': 'Rentals >12,800/month',
'rate': 0.05,
'threshold': 153600 # Annual
},
'WI010': {
'description': 'Income payments',
'rate': 0.01,
'threshold': None
}
}
See reference/atc-codes.md for full list.
Purpose: Calculate VAT properly for Form 2550Q
Computation:
def compute_quarterly_vat(sales, purchases):
"""
Compute VAT payable for quarter
"""
# Output VAT (from sales)
vatable_sales = sum([
s['amount'] for s in sales
if s['vat_type'] == 'vatable'
])
output_vat = vatable_sales * 0.12
# Input VAT (from purchases)
vat_purchases = sum([
p['vat_amount'] for p in purchases
if p['vat_type'] == 'vatable'
])
input_vat = vat_purchases
# Net VAT payable
vat_payable = output_vat - input_vat
# Handle zero-rated and exempt
zero_rated = sum([
s['amount'] for s in sales
if s['vat_type'] == 'zero_rated'
])
vat_exempt = sum([
s['amount'] for s in sales
if s['vat_type'] == 'exempt'
])
return {
'vatable_sales': vatable_sales,
'output_vat': output_vat,
'input_vat': input_vat,
'vat_payable': max(0, vat_payable), # Never negative
'zero_rated': zero_rated,
'vat_exempt': vat_exempt
}
<?xml version="1.0" encoding="UTF-8"?>
<BIRForm>
<FormType>1601C</FormType>
<TIN>123456789000</TIN>
<Period>
<Month>10</Month>
<Year>2025</Year>
</Period>
<TaxWithheld>175000.00</TaxWithheld>
</BIRForm>
Generated using reportlab or wkhtmltopdf with BIR-compliant layout.
See reference/form-formats.md for all formats.
CREATE TABLE bir_atp (
id UUID PRIMARY KEY,
agency_code VARCHAR(10),
permit_no VARCHAR(50),
form_type VARCHAR(20), -- '1601-C', '2550Q', etc
validity_start DATE,
validity_end DATE,
series_from VARCHAR(20),
series_to VARCHAR(20),
current_series VARCHAR(20),
status VARCHAR(20), -- 'Valid', 'Expiring', 'Expired'
created_at TIMESTAMP
);
def validate_atp(agency_code, form_type):
"""Check if ATP is valid for form generation"""
atp = query_supabase(
'bir_atp',
filters={
'agency_code': agency_code,
'form_type': form_type
}
)
if not atp:
return {'valid': False, 'reason': 'No ATP found'}
if atp['validity_end'] < date.today():
return {'valid': False, 'reason': 'ATP expired'}
if atp['validity_end'] < date.today() + timedelta(days=30):
return {
'valid': True,
'warning': 'ATP expiring in 30 days',
'renew_by': atp['validity_end']
}
return {'valid': True}
# Pull data from Odoo for BIR form
transactions = odoo.search_read(
'account.move.line',
domain=[
('date', '>=', '2025-10-01'),
('date', '<=', '2025-10-31'),
('analytic_account_id', '=', agency_analytic_id)
],
fields=['partner_id', 'debit', 'credit', 'tax_line_id']
)
# Validate scanned form
scanned_data = paddle_ocr.extract_bir_form(image_path)
computed_data = generate_1601c(agency, period)
validation = compare_forms(scanned_data, computed_data)
# Create BIR filing tasks
notion.create_page({
'database_id': bir_tasks_db,
'properties': {
'Title': f'File 1601-C - {agency} - {period}',
'Due Date': filing_deadline,
'Status': 'Pending',
'Form Type': '1601-C'
}
})
"ATP expired": Renew Authorization to Print before filing "Tax computation mismatch": Verify ATC code assignment "Missing withholding": Check if vendor setup has withholding tax "VAT mismatch": Ensure all transactions have proper VAT tags "Form validation failed": Verify all required fields populated "eBIRForms error": Check XML format against BIR schema "Deadline missed": Set up automated reminders in Notion
BIR specifications and patterns:
Complete workflow examples:
This skill uses standard Claude tools:
After using this skill:
Ask Claude:
"Generate October 1601-C for RIM agency"
"Create Q3 2025 VAT return for all agencies"
"Check ATP expiry status"
"Validate this scanned 2550Q form"
"Generate 2024 annual income tax return"
Your BIR compliance automation starts here! 🇵🇭