I am a founder of a startup and my employee is demanding, I have given a salary to my employee for the past three months and he's actually demanding for salary slip. As an employer, I don't know what a salary slip, how to generate it and I have just paid him in his bank account from my current account, so I don't know how to give him that. Just help me with it. And basically he is asking for visa purposes that he wants to apply and yeah.
Which country is your startup based in? (This determines the format and legal requirements for the salary slip) · What would you like me to do?
Got it! Would you also like me to create a ready-to-use salary slip template (or actual slips for the past 3 months) that you can fill in and give your employee?
| Field | Example |
|---|---|
| Company Name | XYZ Startups Pvt. Ltd. |
| Company Address | Bengaluru, Karnataka |
| Employee Name | Rahul Sharma |
| Employee ID | EMP001 |
| Designation | Software Engineer |
| Department | Engineering |
| Date of Joining | 01-Feb-2026 |
| Pay Period | February 2026 |
| Bank Account No. | XXXX XXXX 4567 |
| PAN No. | ABCDE1234F |
| Component | Amount (₹) |
|---|---|
| Basic Salary | 25,000 |
| House Rent Allowance (HRA) | 10,000 |
| Special Allowance | 5,000 |
| Gross Salary | 40,000 |
For a small startup with just 1 employee, you can keep it simple — Basic + HRA + Special Allowance is enough.
| Component | Amount (₹) |
|---|---|
| Provident Fund (PF) | 1,800 |
| Professional Tax (PT) | 200 |
| TDS (Income Tax) | 0 (if below tax bracket) |
| Total Deductions | 2,000 |
Net Salary = Gross Salary − Total Deductions ₹40,000 − ₹2,000 = ₹38,000
So this is just prepared by the employer only, right? And not a legal document. I mean, like, the visa authorities cannot cross-verify it from a third party, right?
Can you fact check this payslip Specially for gujarat pvt ltd company in india
cd /home/daytona/workspace/attachments/7bca2c3a-ab9d-4187-8657-ce8f799e5cd8/ && python3 -c " import pdfplumber with pdfplumber.open('Akash_Bhatiya_Payslip_May2026_Redesigned.pdf') as pdf: for i, page in enumerate(pdf.pages): print(f'--- PAGE {i+1} ---') text = page.extract_text() print(text) print() tables = page.extract_tables() for j, table in enumerate(tables): print(f'TABLE {j+1}:') for row in table: print(row) print() "
| Item | Verdict | Notes |
|---|---|---|
| Basic Salary = 40% of Gross | ✅ | ₹72,000 = 40% of ₹1,80,000 — correct |
| HRA = 20% of Gross | ✅ | ₹36,000 = 20% of ₹1,80,000 — standard |
| PF = 12% of Basic | ✅ | ₹72,000 × 12% = ₹8,640 — correct |
| Professional Tax (Gujarat) | ✅ | ₹200/month for salary above ₹12,000 — correct per Gujarat PT slab |
| Gross Earnings total | ✅ | ₹72,000 + ₹36,000 + ₹60,150 + ₹1,600 + ₹1,250 + ₹9,000 = ₹1,80,000 — correct |
| Net Pay calculation | ✅ | ₹1,80,000 − ₹30,000 = ₹1,50,000 — correct |
| Annual CTC | ✅ | ₹1,80,000 × 12 = ₹21,60,000 gross + ₹1,03,680 employer PF (₹8,640×12) = ~₹22,63,680 — correct |
| Conveyance Allowance ₹1,600 | ✅ | Standard amount used by many companies |
| Medical Allowance ₹1,250 | ✅ | Standard ₹15,000/year = ₹1,250/month |
| Pay Period label | ✅ | Says "April 2026" but header says "May 2026" — see issue below |
The PDF filename saysPayslip_May2026and the header reads "PAYSLIP FOR THE MONTH OF APRIL 2026" with pay period 01 April–31 April 2026. This is actually fine as a document — salary for April is typically paid in May (Pay Date: 04 May 2026 is correct). But the filename can create confusion. Not an error, but worth noting.
TDS shown: ₹19,175/month. Annualised TDS = ₹19,175 × 12 = ₹2,30,100.Under the New Tax Regime (FY 2026-27), taxable salary at ₹22,63,680 CTC:
- Standard deduction: ₹75,000
- Taxable income ≈ ₹21,88,680
- Tax on this: ₹15,000 (0–4L) + ₹20,000 (4–8L @5%) + ₹40,000 (8–12L @10%) + ₹60,000 (12–16L @15%) + ₹56,870 (16–20L @20%) + remaining @25% ≈ roughly ₹2,20,000–₹2,40,000 tax + 4% cess
₹2,30,100 annual TDS falls within a plausible range. Not an error, but you may want your CA to confirm the exact slab calculation.
There is a line item called "Other Deductions: ₹1,985" with no description. This is a red flag for visa/legal purposes. Every deduction on a payslip must be explained. It could be:
- Advance salary recovery
- Loss of pay (LOP)
- Health insurance premium
- Any other
Fix: Replace "Other Deductions" with the actual reason (e.g., "Health Insurance Premium – ₹1,985").
PF ₹8,640 + PT ₹200 + TDS ₹19,175 + Other ₹1,985 = ₹30,000 ✅ — adds up correctly.
In India, employer also contributes 12% of Basic to PF (₹8,640). This is typically shown in the CTC breakup but not in the deductions column — which is correct here. The CTC of ₹22,63,680 accounts for it. No error, just confirming.
LTA is typically an annual benefit (₹1,08,000/year here = 5% of gross). Showing it monthly is fine and common. However, LTA is tax-exempt only when actually claimed for travel. Showing it monthly in CTC is standard practice. No error.
PAN shown: HOYPB6293B — this follows the correct Indian PAN format (5 letters, 4 digits, 1 letter). ✅ Structurally valid.
CIN: U32500GJ2025PTC159907 — format analysis:
- U = Unlisted
- 32500 = NIC code
- GJ = Gujarat ✅
- 2025 = Year of incorporation ✅
- PTC = Private Limited Company ✅
- 6-digit number ✅ Structurally valid CIN format for a Gujarat Pvt Ltd.
| Priority | Issue | Action |
|---|---|---|
| 🔴 Must Fix | "Other Deductions ₹1,985" has no description | Add the actual reason |
| 🟡 Minor | Filename says May, content says April | Rename file or align header to avoid confusion |
| 🟡 Advisory | TDS amount — have a CA verify the exact computation | Confirm with accountant |
Now fact check this especially calculations all use python script to verify calculations
python3 << 'EOF' # ============================================================ # PAYSLIP FACT-CHECK SCRIPT # Orr Is Care Private Limited — Akash Bhatiya — April 2026 # ============================================================ print("=" * 60) print("PAYSLIP FACT-CHECK: Akash Bhatiya | April 2026") print("=" * 60) # --- RAW VALUES FROM PAYSLIP --- monthly_gross = 180000.00 basic_salary = 72000.00 hra = 36000.00 special_allowance = 60150.00 conveyance = 1600.00 medical = 1250.00 lta = 9000.00 pf_employee = 8640.00 professional_tax = 200.00 tds = 19175.00 other_deductions = 1985.00 gross_earnings_stated = 180000.00 total_deductions_stated = 30000.00 net_pay_stated = 150000.00 annual_ctc_stated = 2263680.00 errors = [] warnings = [] ok = [] print("\n--- EARNINGS CHECKS ---\n") # 1. Basic = 40% of Gross basic_expected = monthly_gross * 0.40 check = abs(basic_salary - basic_expected) < 0.01 status = "✅ PASS" if check else "❌ FAIL" print(f"Basic Salary (40% of ₹{monthly_gross:,.0f}):") print(f" Expected : ₹{basic_expected:,.2f}") print(f" On Slip : ₹{basic_salary:,.2f} → {status}") if not check: errors.append(f"Basic Salary mismatch: expected ₹{basic_expected:,.2f}, got ₹{basic_salary:,.2f}") else: ok.append("Basic Salary = 40% of Gross ✅") print() # 2. HRA = 20% of Gross (standard) hra_expected_20 = monthly_gross * 0.20 check_hra = abs(hra - hra_expected_20) < 0.01 status = "✅ PASS" if check_hra else "⚠️ NOTE" print(f"HRA (20% of Gross):") print(f" Expected : ₹{hra_expected_20:,.2f}") print(f" On Slip : ₹{hra:,.2f} → {status}") if not check_hra: warnings.append(f"HRA doesn't match 20% of Gross exactly. Got ₹{hra:,.2f}, expected ₹{hra_expected_20:,.2f}") else: ok.append("HRA = 20% of Gross ✅") print() # 3. Gross Earnings = Sum of all earnings gross_calc = basic_salary + hra + special_allowance + conveyance + medical + lta check_gross = abs(gross_calc - gross_earnings_stated) < 0.01 status = "✅ PASS" if check_gross else "❌ FAIL" print(f"Gross Earnings (sum of all components):") print(f" {basic_salary:,.2f} + {hra:,.2f} + {special_allowance:,.2f} + {conveyance:,.2f} + {medical:,.2f} + {lta:,.2f}") print(f" Calculated : ₹{gross_calc:,.2f}") print(f" On Slip : ₹{gross_earnings_stated:,.2f} → {status}") if not check_gross: errors.append(f"Gross Earnings mismatch: calculated ₹{gross_calc:,.2f}, stated ₹{gross_earnings_stated:,.2f}") else: ok.append("Gross Earnings sum is correct ✅") print() # 4. Special Allowance = Gross - (Basic + HRA + Conveyance + Medical + LTA) [plug number] special_expected = monthly_gross - basic_salary - hra - conveyance - medical - lta print(f"Special Allowance (plug = Gross - all other earnings):") print(f" Expected : ₹{special_expected:,.2f}") print(f" On Slip : ₹{special_allowance:,.2f} → {'✅ PASS' if abs(special_allowance - special_expected) < 0.01 else '❌ FAIL'}") if abs(special_allowance - special_expected) > 0.01: errors.append(f"Special Allowance mismatch: expected ₹{special_expected:,.2f}, got ₹{special_allowance:,.2f}") else: ok.append("Special Allowance (plug) is correct ✅") print() print("--- DEDUCTIONS CHECKS ---\n") # 5. PF = 12% of Basic pf_expected = basic_salary * 0.12 check_pf = abs(pf_employee - pf_expected) < 0.01 status = "✅ PASS" if check_pf else "❌ FAIL" print(f"Provident Fund (12% of Basic ₹{basic_salary:,.0f}):") print(f" Expected : ₹{pf_expected:,.2f}") print(f" On Slip : ₹{pf_employee:,.2f} → {status}") if not check_pf: errors.append(f"PF mismatch: expected ₹{pf_expected:,.2f}, got ₹{pf_employee:,.2f}") else: ok.append("PF = 12% of Basic ✅") print() # 6. Professional Tax — Gujarat slab # Gujarat PT: ₹200/month for salary > ₹12,000 pt_expected = 200.00 check_pt = abs(professional_tax - pt_expected) < 0.01 status = "✅ PASS" if check_pt else "❌ FAIL" print(f"Professional Tax (Gujarat slab for salary > ₹12,000):") print(f" Expected : ₹{pt_expected:,.2f}") print(f" On Slip : ₹{professional_tax:,.2f} → {status}") if not check_pt: errors.append(f"Professional Tax mismatch: expected ₹{pt_expected:,.2f}, got ₹{professional_tax:,.2f}") else: ok.append("Professional Tax (Gujarat ₹200) ✅") print() # 7. TDS — New Tax Regime FY2026-27 # Annual gross = 180000 * 12 = 2,160,000 # Standard deduction = 75,000 # Taxable income = 2,160,000 - 75,000 = 2,085,000 # New regime slabs FY26-27: # 0 - 400,000 : 0% # 400,001 - 800,000 : 5% → 20,000 # 800,001 - 1,200,000: 10% → 40,000 # 1,200,001 - 1,600,000: 15% → 60,000 # 1,600,001 - 2,000,000: 20% → 80,000 # 2,000,001 - 2,400,000: 25% → remaining # above 2,400,000 : 30% annual_gross = monthly_gross * 12 standard_deduction = 75000 taxable_income = annual_gross - standard_deduction tax = 0 slabs = [ (400000, 0.00), (400000, 0.05), (400000, 0.10), (400000, 0.15), (400000, 0.20), (400000, 0.25), (float('inf'), 0.30), ] remaining = taxable_income for slab_size, rate in slabs: if remaining <= 0: break taxable_in_slab = min(remaining, slab_size) tax += taxable_in_slab * rate remaining -= taxable_in_slab # Add 4% health & education cess cess = tax * 0.04 total_tax = tax + cess monthly_tds = total_tax / 12 print(f"TDS – Income Tax (New Regime FY26-27):") print(f" Annual Gross : ₹{annual_gross:,.2f}") print(f" Standard Deduction : ₹{standard_deduction:,.2f}") print(f" Taxable Income : ₹{taxable_income:,.2f}") print(f" Tax (before cess) : ₹{tax:,.2f}") print(f" Cess (4%) : ₹{cess:,.2f}") print(f" Total Annual Tax : ₹{total_tax:,.2f}") print(f" Monthly TDS : ₹{monthly_tds:,.2f}") print(f" On Slip : ₹{tds:,.2f}") tds_diff = abs(monthly_tds - tds) if tds_diff < 50: print(f" → ✅ PASS (difference of ₹{tds_diff:.2f} — rounding)") ok.append(f"TDS broadly correct (diff ₹{tds_diff:.2f}) ✅") elif tds_diff < 500: print(f" → ⚠️ MINOR DISCREPANCY (difference of ₹{tds_diff:.2f})") warnings.append(f"TDS: calculated ₹{monthly_tds:,.2f}, slip shows ₹{tds:,.2f} — diff ₹{tds_diff:.2f}") else: print(f" → ❌ FAIL (difference of ₹{tds_diff:.2f})") errors.append(f"TDS mismatch: calculated ₹{monthly_tds:,.2f}, slip shows ₹{tds:,.2f} — diff ₹{tds_diff:.2f}") print() # 8. Total Deductions total_ded_calc = pf_employee + professional_tax + tds + other_deductions check_ded = abs(total_ded_calc - total_deductions_stated) < 0.01 status = "✅ PASS" if check_ded else "❌ FAIL" print(f"Total Deductions (sum):") print(f" {pf_employee:,.2f} + {professional_tax:,.2f} + {tds:,.2f} + {other_deductions:,.2f}") print(f" Calculated : ₹{total_ded_calc:,.2f}") print(f" On Slip : ₹{total_deductions_stated:,.2f} → {status}") if not check_ded: errors.append(f"Total Deductions mismatch: calculated ₹{total_ded_calc:,.2f}, stated ₹{total_deductions_stated:,.2f}") else: ok.append("Total Deductions sum is correct ✅") print() # 9. Net Pay net_calc = gross_earnings_stated - total_deductions_stated check_net = abs(net_calc - net_pay_stated) < 0.01 status = "✅ PASS" if check_net else "❌ FAIL" print(f"Net Pay (Gross - Total Deductions):") print(f" ₹{gross_earnings_stated:,.2f} - ₹{total_deductions_stated:,.2f} = ₹{net_calc:,.2f}") print(f" On Slip : ₹{net_pay_stated:,.2f} → {status}") if not check_net: errors.append(f"Net Pay mismatch: calculated ₹{net_calc:,.2f}, stated ₹{net_pay_stated:,.2f}") else: ok.append("Net Pay = Gross - Deductions ✅") print() # 10. Annual CTC check # CTC = Annual Gross + Employer PF (12% of Basic × 12) employer_pf_annual = basic_salary * 0.12 * 12 annual_ctc_calc = annual_gross + employer_pf_annual check_ctc = abs(annual_ctc_calc - annual_ctc_stated) < 1.00 status = "✅ PASS" if check_ctc else "❌ FAIL" print(f"Annual CTC (Annual Gross + Employer PF):") print(f" Annual Gross : ₹{annual_gross:,.2f}") print(f" Employer PF (annual) : ₹{employer_pf_annual:,.2f}") print(f" Calculated CTC : ₹{annual_ctc_calc:,.2f}") print(f" On Slip : ₹{annual_ctc_stated:,.2f} → {status}") if not check_ctc: errors.append(f"Annual CTC mismatch: calculated ₹{annual_ctc_calc:,.2f}, stated ₹{annual_ctc_stated:,.2f}") else: ok.append("Annual CTC includes Employer PF correctly ✅") print() print("=" * 60) print("SUMMARY") print("=" * 60) print(f"\n✅ PASSED ({len(ok)}):") for item in ok: print(f" • {item}") if warnings: print(f"\n⚠️ WARNINGS ({len(warnings)}):") for w in warnings: print(f" • {w}") if errors: print(f"\n❌ ERRORS ({len(errors)}):") for e in errors: print(f" • {e}") else: print(f"\n✅ No critical errors found.") print("\n--- OTHER FLAGS (non-calculation) ---") print("⚠️ 'Other Deductions ₹1,985' has no description — must be labeled for visa use.") print("ℹ️ Pay Period image says '01 April 2026 – 30 April 2026' (30 days, correct).") print("ℹ️ PAN format HOYPB6293B — structurally valid (5L-4N-1L).") print("ℹ️ CIN U32500GJ2025PTC159907 — Gujarat Pvt Ltd 2025 registration, valid format.") EOF
| # | Check | Expected | On Slip | Result |
|---|---|---|---|---|
| 1 | Basic = 40% of Gross (₹1,80,000) | ₹72,000 | ₹72,000 | ✅ |
| 2 | HRA = 20% of Gross | ₹36,000 | ₹36,000 | ✅ |
| 3 | Special Allowance (plug number) | ₹60,150 | ₹60,150 | ✅ |
| 4 | Gross = sum of all 6 components | ₹1,80,000 | ₹1,80,000 | ✅ |
| 5 | PF = 12% of Basic (₹72,000) | ₹8,640 | ₹8,640 | ✅ |
| 6 | Professional Tax (Gujarat slab) | ₹200 | ₹200 | ✅ |
| 7 | TDS — New Regime FY26-27* | ₹19,175 | ₹19,175 | ✅ |
| 8 | Total Deductions sum | ₹30,000 | ₹30,000 | ✅ |
| 9 | Net Pay = Gross − Deductions | ₹1,50,000 | ₹1,50,000 | ✅ |
| 10 | Annual CTC = Annual Gross + Employer PF | ₹22,63,680 | ₹22,63,680 | ✅ |
What to write that give me something generic
Welfare & Miscellaneous DeductionMiscellaneous Deduction| Miscellaneous Deduction | ₹1,985.00 |
|---|
Good to go now?