Salary discussions and evaluating fresher offers
40 min · Intermediate
Need help? Ask a tutor on WhatsApp (opens in a new tab)You get an offer that says Rs 4.5 LPA, and HR asks if you understand it. They are checking whether you know that CTC is not the money that reaches your bank account each month.
Reading CTC: fixed pay, variable pay, joining bonus, benefits
CTC (cost to company) is the total yearly amount a company spends on you, including pay you never receive monthly. It is not the money that reaches your bank account.
Here is a CTC breakdown read line by line, showing which parts reach you every month and which do not.
Example 1 · A CTC breakdown read line by line
Annual CTC: Rs 4,50,000 Basic salary 1,80,000 HRA 72,000 Special allowance 1,67,742 Employer PF (12% basic) 21,600 Gratuity (4.81% basic) 8,658Paid monthly (fixed gross): 1,80,000 + 72,000 + 1,67,742 = 4,19,742 a year (about 34,979 a month)
Not paid monthly: employer PF 21,600 (goes to your PF account),
gratuity 8,658 (paid only if you complete about 5 years)
Deductions from monthly pay: employee PF, professional tax, income tax (if any)What this code does
- Of the Rs 4,50,000 CTC, about Rs 30,000 never appears in monthly pay. Employer PF is still your money, saved in your PF account.
- This offer has no variable pay or joining bonus, so the fixed part is the whole salary. The numbers are an example, not any real company's package.
Fixed pay is paid every month: basic salary, HRA (house rent allowance) and other allowances. Variable pay depends on performance and is often paid yearly, so you may get less. A joining bonus is paid once, sometimes with a clawback if you leave within a year. CTC also holds the employer's PF (provident fund, a retirement savings account, usually 12% of basic or of the Rs 15,000 wage ceiling), gratuity (paid only after about five years under current rules) and insurance.
A quick map:
- Monthly gross = fixed pay / 12.
- In CTC but not monthly: employer PF, gratuity, insurance, variable pay, joining bonus.
- Deducted from monthly gross: employee PF, professional tax, income tax (TDS).
- Some offers quote CTC with one-time items: always ask for the fixed component.
Worked example: approximate monthly in-hand pay
In-hand pay is the money that reaches your bank account each month: fixed gross pay minus employee PF, professional tax and income tax. It is always lower than CTC divided by 12.
This program estimates monthly in-hand pay for two offers, using simplified FY 2025-26 new-regime tax rules.
Example 2 · Approximate monthly in-hand pay for two offers
from dataclasses import dataclass
@dataclassclass Offer: name: str basic: float hra: float special: float employer_pf: float gratuity: float variable: float joining_bonus: float employee_pf_monthly: float
def ctc(self): return (self.basic + self.hra + self.special + self.employer_pf + self.gratuity + self.variable + self.joining_bonus)
def fixed_gross(self): return self.basic + self.hra + self.special
def income_tax(taxable): """New regime, FY 2025-26 (simplified): slabs, rebate up to 12 lakh, 4% cess.""" if taxable <= 1_200_000: return 0 starts = [400_000, 800_000, 1_200_000, 1_600_000, 2_000_000, 2_400_000] rates = [0.05, 0.10, 0.15, 0.20, 0.25, 0.30] tax = 0 for i, start in enumerate(starts): upper = starts[i + 1] if i + 1 < len(starts) else float("inf") if taxable > start: tax += (min(taxable, upper) - start) * rates[i] return tax * 1.04
def show(o): professional_tax = 200 yearly_income = o.fixed_gross() + o.variable + o.joining_bonus tax_monthly = income_tax(yearly_income - 75_000) / 12 gross_monthly = o.fixed_gross() / 12 in_hand = gross_monthly - o.employee_pf_monthly - professional_tax - tax_monthly print(f"{o.name}: CTC Rs {o.ctc():,.0f} | fixed gross Rs {gross_monthly:,.0f}/month") print(f" minus PF Rs {o.employee_pf_monthly:,.0f}, prof. tax Rs {professional_tax:,.0f}, " f"income tax Rs {tax_monthly:,.0f} -> in-hand about Rs {in_hand:,.0f}/month")
show(Offer("Offer A (service)", 180_000, 72_000, 167_742, 21_600, 8_658, 0, 0, 1_800))show(Offer("Offer B (product)", 720_000, 360_000, 413_768, 21_600, 34_632, 150_000, 100_000, 1_800))Offer A (service): CTC Rs 450,000 | fixed gross Rs 34,978/month minus PF Rs 1,800, prof. tax Rs 200, income tax Rs 0 -> in-hand about Rs 32,978/month Offer B (product): CTC Rs 1,800,000 | fixed gross Rs 124,481/month minus PF Rs 1,800, prof. tax Rs 200, income tax Rs 11,592 -> in-hand about Rs 110,889/month
What this code does
- Offer A's taxable income (Rs 3,44,742) is under the Rs 12 lakh rebate limit, so income tax is zero and in-hand is gross minus PF and professional tax. Offer B pays tax on Rs 16,68,768 of taxable income, including the one-time bonus and the full variable pay.
- The
:,in an f-string groups digits in threes, so 450,000 is Rs 4.5 lakh. Simplifications: PF capped at Rs 1,800 a month, professional tax Rs 200 a month, no other income or deductions, variable assumed fully paid. Real TDS is spread differently across months; use this to compare offers, not to file taxes.
In-hand pay starts from the fixed gross and subtracts employee PF (12% of basic, or Rs 1,800 a month at the Rs 15,000 ceiling), professional tax (a state tax on salaries, about Rs 200 a month in several states and none in some) and income tax spread over 12 months.
The example uses the new tax regime for FY 2025-26: a Rs 75,000 standard deduction (a fixed amount subtracted before tax), slabs of 0% up to Rs 4 lakh then 5%, 10%, 15%, 20%, 25% and 30% in Rs 4 lakh steps, a rebate that makes tax zero up to Rs 12 lakh taxable, and 4% cess. It ignores marginal relief and other deductions, so treat the result as an estimate.
Predict the output
Estimate the pay
Read the code and pick what it prints.
Round 1 of 2
Fixed gross Rs 4,20,000 a year, no income tax. What is the monthly in-hand pay?
When freshers can and cannot negotiate
Negotiation is asking for better terms in an offer, with a reason and usually a number. It works only when the company has room to change the offer.
Here is when asking is sensible and when it is not, with a polite way to ask.
Example 3 · Negotiation: when and how
Situation 1: campus mass drive, same package for all 300 selected students.Situation 2: off-campus offer of Rs 7.5 LPA fixed; you hold a written offer of Rs 8.5 LPA fixed from another company for a similar role, but you prefer this team.Situation 1: do not negotiate salary. Ask factual questions instead: "Could you share the fixed and variable split, and when the joining date and location are confirmed?" Situation 2: ask once, politely, with a reason and a number: "Thank you for the offer; I am keen to join this team. I have a written offer of Rs 8.5 LPA fixed for a similar role. Is there any flexibility to bring the fixed pay closer to that? If not, I would still like to discuss the joining date, since the team is my first choice."
What this code does
- In a batch hire the band is fixed, so asking for more salary gains nothing; clarity questions are always fine.
- In situation 2 the request is honest (a real written offer), specific and polite, and it shows you will join anyway, which makes a "no" easy for them and a "yes" possible.
In large campus drives the package for a role is fixed for the whole batch, so negotiating salary there rarely works and can look unaware. Off campus, with a competing written offer or rare proven skills, there is more room: ask once, politely, with a reason and a number, and be ready to accept a fixed band.
What is usually fixed and what is not:
- Usually fixed: mass-campus packages and training stipends.
- Sometimes flexible: joining date, location preference, joining bonus, relocation help.
- Never: invent a competing offer. Companies can and do check.
Comparing two offers beyond salary
These scores compare two offers on the factors that matter, using weights that match your priorities.
Example 4 · Scoring two offers on what matters
weights = { "Role (real development)": 30, "Learning and mentoring": 25, "In-hand pay": 20, "Location": 10, "Bond / agreement": 10, "Growth path": 5,}offer_a = [9, 8, 5, 8, 6, 7]offer_b = [5, 5, 9, 6, 3, 6]
score_a = score_b = 0for (factor, weight), a, b in zip(weights.items(), offer_a, offer_b): print(f"{factor:<24} weight {weight:>2} A {a} B {b}") score_a += weight * a / 10 score_b += weight * b / 10print(f"Weighted score: A {score_a:.1f} / 100, B {score_b:.1f} / 100")Role (real development) weight 30 A 9 B 5 Learning and mentoring weight 25 A 8 B 5 In-hand pay weight 20 A 5 B 9 Location weight 10 A 8 B 6 Bond / agreement weight 10 A 6 B 3 Growth path weight 5 A 7 B 6 Weighted score: A 74.5 / 100, B 57.5 / 100
What this code does
- Each factor gets a weight (adding to 100) and each offer a 0-10 rating; the weighted score turns a vague feeling into a clear comparison.
- Here B pays more in hand but has a weaker role, less learning and a stricter bond, so A wins with these weights. Change the weights to your own priorities; the method matters more than the numbers.
Weigh everything that affects your first two or three years: the role (what you will actually work on), learning (training, mentoring, tech stack), location and cost of living, any bond, growth, and the in-hand pay, not the CTC headline.
A higher CTC with a large variable part, a three-year bond and unrelated support work can be worse for your career than a slightly lower fixed offer in a real development role. Give each factor a weight and score both offers honestly.
Find the bug
Find the weak reasoning
Each round shows a note about an offer. Click the line with the weak reasoning.
Which line makes the weak decision?
Round 1 of 3Offer etiquette and college placement policies
Here is a polite way to accept an offer and a polite way to decline one, both in writing.
Example 5 · Accepting and declining politely
Situation: you have accepted Offer A through your placement cell. Two weeks later Offer B, from anoff-campus application, arrives. Your college allows switching only for a "dream" package above astated limit, and B qualifies.1. Check the placement policy and inform the placement cell before replying to either company. 2. If you choose B, write to company A promptly: "Dear Ms. Iyer, thank you for the offer for the Graduate Engineer role and for your time during the process. After careful thought, I have decided to accept another offer that is closer to my long-term goals in backend development. I am grateful for the opportunity and hope to stay in touch. Regards, Ananya Rao" 3. Accept B in writing within its deadline, and keep copies of all emails.
What this code does
- The order matters: policy and placement cell first, then a prompt, polite decline, then the written acceptance.
- Never simply stop replying. A short, respectful decline keeps your reputation and your college's relationship with the company intact.
Offer etiquette means being honest and timely: reply within the deadline, ask questions before accepting, and decline politely in writing. Accepting and then not joining without telling anyone (ghosting) damages your name and your college's relationship with the company.
Most colleges have placement policies, such as one offer per student, a dream-company rule for higher-paying companies, or penalties for declining after accepting. Rules vary, so read your placement cell's policy before you sit for any company.
Next step
Check your understanding
12 quick questions