ERPNext is GST Compatible

Do we know for certain that every HSN code will use one and only one rate slab? Here is one example of where that is not particularly true at the 4 digit level.

8517 Majority of Networking products 18 percent
8517 Imported mobile phones 12 percent

I have not checked the 8 digit level.

1 Like

I think Tax rates have to be fixed. Otherwise there is no meaning of classifying using HSN. Can you verify the full HSN code for above scenario?

HSN Codes can either be 2 digit, 4 digit, 6 digit, or 8 digit based on size. I don’t think we should assume that all users must use the 8 digit codes.

Tally doesn’t place rates at the HSN level, and I dont believe Quickbooks or SAP do either. (This conclusion is based on looking through their documentation on GST. If I am wrong, please feel free to correct me.)

1 Like

Okay. I dont have reliable information to positively confirm this. But i am just imagining how complex it would be to reflect the tax rate in all items if any change happen for a particular HSN.


Do you have any comments on my second question about selecting “In State GST” or “Out of State GST” based on the State codes of Company and Customer automatically without human intervention?

This is not available yet. There are many users that have asked for this. But, there is no timeframe for this feature. If you can contribute resources to make this happen, that would be great!

Item wise tax details:

1 Like

It would become quite problematic if we assign a tax rate to an item based on the HSN code because :

  1. You will be forced to use the 8 digit HSN code - which is not mandatory for all tax payers, it is mandatory only for tax payers above a certain turnover.

  2. Your IGST, CGST and SGST components will create a conflict - since CGST and SGCT divide the tax by half between them, you need to set in the right parameters and additional checks in your invoice item table.

@Sachin_Mane ,

You can use the following procedure, so that you dont have to choose the In State and Out State manually.

This can be solved in a very simple way using Tax Rule.

  1. Create two customer groups - Out state Customers, In state Customers - make sure to put the customers on the right category.

  2. Create two tax templates - Out state GST(with only IGST) and In state GST(with SGST and CGST)

  3. Create two tax rules - Out state tax rule and In state tax rule.

  4. In tax rule select your customer group and tax template and during your purchase and sales invoicing it gets automatically applied depending on the customer group.

  5. Similarly create the rules for different tax rates and set the priorities for the tax rule.

I think this should solve the problem for the time being.

No you can’t base it on HSN code. Because there are few cases when same HSN code has different tax rate.

GST HSN error

Its not naming new HSN codes with HSN code field. Please check.

This issue has been raised on git hub, #9529

Hi @ajit.jain1, Our customers have many shipping addresses. Some are in state and some are out state. So we need to have this selection based on the Shipping Address rather than based on the Customer and Customer Group.

1 Like

Sure. We will love to contribute. We are looking at right place to incorporate this change. We want to base it on the Company Address and Shipping Address state codes.

Thanks @rajagopalx for the format. However it is only working for the view. If we try to print it or convert to pdf, it is giving NIL for all the three taxes. Can you please help to resolve it.


Hi Amit

He has mentioned that he is not able to get the print. We will need this for print though.
@umair how to (if possible) fetch child table values (IGST SGST CGST) rates from item master as a quick fix for now?
This is turning out to be the most important requirement for GST.
It is desirable to include rates instead of trying to “explain” to the authorities.

1 Like

Print format to get started will really help

Print format code

{%- for item in doc.items -%}
	{{ item.item_name }} :
	{% set iitem = frappe.get_doc("Item",item.item_code) %}
	{%- for itax in iitem.taxes -%}
		{%- for dtax in doc.taxes -%}
			{%- if dtax.account_head == itax.tax_type -%}
				{{ dtax.account_head }} @ {{ itax.tax_rate }}%
			{%- endif -%}
		{%- endfor -%}
	{%- endfor -%}<br />
{%- endfor -%}

IGST, SGST, CGST rate in invoice tax table should be kept ZERO. Tax rates for all 3 types of GST in each item must be set

Output: screen shot attached

1 Like

using @ItsRaichura’s code, one can display a lot of things in related to selling in a table.
See the following for example


table {
    font-family: arial, sans-serif;
    border-collapse: collapse;
    width: 100%;

td, th {
    border: 1px solid #dddddd;
    text-align: left;
    padding: 8px;

tr:nth-child(even) {
    background-color: #dddddd;

    <th>Tax Rate</th>
  {% for item in doc.items %}
    <tr>{% set this_item=frappe.get_doc("Item", item.item_code)%}
      <td>{{ item.idx }}</td>
      <td>{{ item.item_code}}<br>{{item.item_name}}</td>
      <td>{{ item.gst_hsn_code }}</td>
	{% for itax in this_item.taxes %}
		{% for dtax in doc.taxes %}
			{% if dtax.account_head == itax.tax_type %}
				{{ '-'.join(dtax.account_head.split('-')[:-1]) }} @ {{ itax.tax_rate }}%
			{% endif %}
		{% endfor %}
	{% endfor %}
      <td>{{ item.batch_no }}</td>
      <td>{{ frappe.db.get_value("Batch", item.batch_no, "expiry_date") }}</td>
      <td>{{ item.qty }} {{ item.stock_uom }}</td>
      <td>₹{{ item.rate }}</td>
      <td>₹{{ item.amount }}</td>
  {% endfor %}

Hi does this work as is? I can’t seem to get it working.