REDA One Help Center
EN
Language
English EN Español ES Português PT Italiano coming soon Français FR Deutsch coming soon العربية coming soon
reda.one ↗
Home / REDA Financials AI / Tax Management / Tax Engine Foundations / Understanding the Tax Engine

Understanding the Tax Engine

Tax is the most intricate part of any accounting system — and REDA’s tax engine is the most layered piece of this product. The good news: once you understand the shape of it, the rest of this category falls into place. This article is the map. It explains how the whole machine fits together so that every later article — jurisdictions, rules, calculation, withholding — slots into a picture you already hold in your head.

The single most important idea: REDA’s tax engine is data-driven. The rules of tax for the United Kingdom, the United States, Brazil, and India are not written into the software — they are configured as records. Adding a new country means creating jurisdiction, tax-type, and rule records. It never means changing code. The same engine that fires one rule for a UK sale fires six for a Brazilian one, with nothing different under the hood.

Getting there. The rulebook is set up in the REDA Financials Admin app — open the App Launcher (the grid icon at the top-left of any page), pick REDA Financials Admin, and use its tax tabs (Tax Jurisdictions, Tax Types, Tax Rules, Tax Profiles, Party Tax Profiles, Withholding Tax Rules). Most of it is created for you by the Tax Seeding Wizard. The tax the engine calculates then appears on the documents you work in the day-to-day REDA Financials AI app.
Access you'll need. Any REDA Financials AI permission set can view the tax setup and the tax on documents. Setting up and maintaining the rulebook requires the Accounting Admin v2 or Accounting Controller v2 permission set; the Accounts Payable v2, Accounts Receivable v2, and Read Only v2 sets cannot change it.
The one-paragraph version. You configure a rulebook once (jurisdictions, tax types, rules, profiles, GL routing). Then, every time an invoice is posted, the engine looks at who is selling, who is buying, what is being sold, and where, finds every rule that matches, calculates each tax, and writes an audit row per tax. You rarely touch any of it after setup — the invoice screen just shows the right tax.

The big idea: a rulebook, and a calculation

Hold two things apart in your mind and everything else follows:

The rulebook (setup)The calculation (runtime)
What it isRecords you configure: jurisdictions, tax types, rules, profiles, registrations, GL routingWhat the engine does automatically each time a document posts
How often it changesRarely — set up at implementation, edited when a rate or law changesEvery invoice, every time
Who touches itA finance administratorNobody — it’s invisible automation
The output—A Source Line Tax audit row for every tax that applied, and balancing GL entries
Many rules fire — there is no “first match wins.” This is the rule most people get wrong about REDA. The engine evaluates every rule that matches a transaction and applies all of them. A UK sale matches one rule (VAT). A Brazilian interstate consumer sale matches six (ICMS, IPI, PIS, COFINS, DIFAL, FCP) — and all six fire, in sequence order. Keep this in mind and Brazil stops being mysterious.

The four layers of the engine

The tax module is fourteen objects. That sounds like a lot until you see them grouped — they fall into three setup layers plus one runtime output. Each later article in this category lives in one of these layers, so this is the table to remember.

Layer 1 — Master Data (the vocabulary)

Configured once. These define the universe the rules draw on.

ObjectWhat it representsExample
Tax JurisdictionA place, in a hierarchy (country → state → city)“GB”, “US-CA”, “BR-SP”
Tax TypeA named tax and how it behavesVAT, GST, ICMS, IGST, TDS
Fiscal OperationThe nature of the transaction (auto-derived)Intrastate / Interstate / Export
Party Tax ProfileHow a buyer or seller behaves for taxRegistered business, end consumer, exempt
Tax ProfileHow a product/service is treatedStandard-rated, zero-rated, exempt

Layer 2 — The Rule Engine (the brain)

ObjectWhat it represents
Tax Rule“When all these conditions match, apply this tax type at this rate.” Eight optional matching dimensions — every one left blank means “match anything”.
Tax Calculation ComponentOptional extra steps for a rule’s base — a cap on the taxable base, or a rate override. Brazil’s markup (MVA), embedded tax (por dentro) and rule-on-rule dependencies live on the Tax Rule itself. Most rules need neither.

Layer 3 — Entity Configuration (your specifics)

ObjectWhat it represents
Entity Tax RegistrationWhich jurisdictions your company is registered to collect tax in (its “nexus”).
Tax GL MappingWhere each tax posts in your chart of accounts — by tax type, side, and recoverability.
Product Fiscal ProfileThe bridge from your products to a Tax Profile, with country codes (UK none, India HSN, Brazil NCM).

Runtime output

ObjectWhat it represents
Source Line TaxThe result. One immutable row per tax that fired, per invoice line — the tax-side audit trail. Created by the engine, never edited by hand.

The remaining three objects belong to withholding tax (a parallel engine): Withholding Tax Rule and its Withholding Tax Rate children, plus the WHT Transaction audit record. More on that below.

Where the engine gets “who” and “where”

The engine needs to know the seller, the buyer, and their locations. Those come from two records you already manage, each extended with two tax fields:

RecordTax fieldsRole
Entity (your company)Tax Jurisdiction, Party Tax ProfileThe seller — its location is the tax origin
Account (customer / vendor)Tax Jurisdiction, Party Tax ProfileThe buyer — its location is the tax destination

So a sale from your UK entity to a French customer has origin = GB, destination = FR — and the engine knows, without anyone choosing it, that this is an export. (The Entity also carries the withholding-tax configuration; see the WHT articles.)

How one calculation flows

When an invoice is posted, the engine runs a fixed six-step pipeline. You don’t need the internals yet — How Tax Calculates on a Document covers every step with numbers — but here is the shape:

1. Resolve — read the seller, the buyer, their jurisdictions and profiles, and each line’s product/Tax Profile.
2. Nexus check — is your entity registered to collect tax where the buyer is? If not, tax is zero (and that’s recorded, not an error).
3. Match rules — find every Tax Rule whose conditions fit, ordered by sequence.
4. Compute — for each matched rule, work out the base and the tax amount (handling markups, tax-on-tax, dependencies).
5. Persist — write one Source Line Tax row per rule that fired.
6. Post to GL — route each tax to the right account via Tax GL Mapping, as balancing ledger entries.
When does tax calculate? Previewed while you edit, stamped at posting. While a draft invoice is open, the form shows a live preview of both the tax and any withholding — the same arithmetic the engine will run, with nothing saved yet. The stored amounts — the Source Line Tax rows, the withholding records, the header tax totals, the GL entries — are all written at the moment you post the document. What you preview is what posts.

The same engine, four countries

Nothing makes the design click like watching one engine handle wildly different tax regimes with no code change. We’ll use these four throughout the category.

🇬🇧 United Kingdom — one simple rule

Your UK entity sells £1,000 of standard-rated goods to a UK customer. One rule matches: VAT at 20%, added on top.

Rules firedBaseRateTaxInvoice total
VAT (1 rule)£1,000.0020%£200.00£1,200.00

This is the simplest case, and the most common. With one catch-all rule and a flag on the product, you barely configure anything — covered in UK VAT.

🇺🇸 United States — nexus decides everything

US sales tax is destination-based, but only applies if your entity is registered (has nexus) in the buyer’s state. Same $1,000 sale, two outcomes:

ScenarioNexus in buyer’s state?Result
Entity registered in Texas, ships to TexasYesTexas sales tax fires (seeded 8.19% = $81.90)
Entity not registered in Texas, first sale thereNo$0 tax — recorded as a normal outcome, not blocked

That “zero tax, not an error” behaviour is deliberate — crossing into a new state is a normal business event. See US Sales Tax & Nexus.

🇧🇷 Brazil — six rules fire at once

An interstate sale from São Paulo to a consumer in Rio de Janeiro is the engine’s stress test. Six rules fire on a single line, in sequence — and three of them (ICMS, PIS, COFINS) are embedded inside the price (“por dentro”), not added on top:

#TaxNote
1ICMSEmbedded in the price (por dentro)
2IPIFederal excise on manufactured goods, added on top
3PISFederal social contribution — also embedded in the price
4COFINSFederal social contribution — also embedded in the price
5DIFALRate differential owed to the destination state (consumer sales)
6FCPPoverty-fund surcharge of the destination state

The engine handles all of this through ordinary configuration — sequence, dependency links, and calculation components. Walked through in full in Brazil.

🇮🇳 India — the rules change with the route

Indian GST splits by whether the sale crosses a state line — and the engine derives that automatically from the two jurisdictions:

RouteRules firedOn ₹10,000 @ 18%
Within one state (Maharashtra → Maharashtra)CGST 9% + SGST 9% (2 rules)₹900 + ₹900
Across states (Maharashtra → Karnataka)IGST 18% (1 rule)₹1,800

India also features TDS (withholding) on the purchase side — the bridge into the WHT articles. See India.

Real data: the UK rulebook, record by record

Enough theory — let’s look at the actual records. Everything below ships with REDA in the UK seed pack; running the Tax Seeding Wizard for “United Kingdom” creates exactly these. This is what one country’s entire rulebook looks like — and it’s small.

1 · Jurisdictions — the geography

Five records: the country, plus its four nations as children. VAT is UK-wide, so the rules sit at country level — but the hierarchy is there for the cases that need it (e.g. Northern Ireland’s Windsor Framework).

CodeNameLevelParent
GBUnited KingdomCountry—
GB-ENGEnglandState/ProvinceGB
GB-SCTScotlandState/ProvinceGB
GB-WLSWalesState/ProvinceGB
GB-NIRNorthern IrelandState/ProvinceGB

2 · Tax Types — the named taxes

The UK has one tax (VAT) with four treatments. Note Exempt is the only one where input VAT is not recoverable — that flag drives the GL routing later.

CodeNameFamilyRecoverable?
GB-VAT-STDUK VAT — Standard RateVAT / GSTYes
GB-VAT-REDUK VAT — Reduced RateVAT / GSTYes
GB-VAT-ZEROUK VAT — Zero RateVAT / GSTYes
GB-VAT-EXEMPTUK VAT — ExemptVAT / GSTNo

3 · Profiles — classifying the “what” and the “who”

Two independent dimensions. Tax Profiles classify the product; Party Tax Profiles classify the business.

Tax Profile (product)Party Tax Profile (business)
GB-STD-20 — Standard Rate Goods & ServicesGB-VAT-REG — VAT Registered Business
GB-RED-5 — Reduced Rate SuppliesGB-VAT-FRS — Flat Rate Scheme
GB-ZERO — Zero Rated SuppliesGB-VAT-UNREG — Unregistered / Below Threshold
GB-EXEMPT — Exempt Supplies

4 · Tax Rules — the brain

Four rules, one per treatment. Each ties a tax type to a product tax profile at a rate, scoped to the UK. Notice how lean a rule is when a country is simple — most of the eight matching dimensions are left blank (= “match anything”).

Rule CodeTax TypeTax ProfileDestinationRateEffective from
GB-VAT-STD-20GB-VAT-STDGB-STD-20GB20%2011-01-04
GB-VAT-RED-5GB-VAT-REDGB-RED-5GB5%1997-09-01
GB-VAT-ZERO-0GB-VAT-ZEROGB-ZEROGB0%1973-04-01
GB-VAT-EX-0GB-VAT-EXEMPTGB-EXEMPTGB0%1973-04-01
Rates have history built in. The standard rate is effective-dated 4 January 2011 — the day UK VAT rose to 20%. To change a rate you add a new rule with a new effective date and close off the old one; an invoice always uses the rate that was in force on its date. Nothing is overwritten.

5 · GL accounts & routing — where the tax lands

The seed also creates the tax GL accounts and the Tax GL Mapping records that route each tax to them. This is where the recoverable flag pays off: the same VAT type posts to a liability when you sell and to an asset when you buy.

Tax TypeSideRecoverable?GL Account
GB-VAT-STDSalesNo2311-VAT-GB — VAT Payable (liability)
GB-VAT-STDPurchaseYes1511-VAT-ITC-GB — VAT Input Tax Recoverable (asset)

6 · Putting it together — the £1,000 sale through these exact records

Now watch the engine walk this data for our UK sale of £1,000 of standard-rated goods to a VAT-registered UK customer:

Resolve — origin = GB (your entity), destination = GB (customer). The product’s fiscal profile points to Tax Profile GB-STD-20.
Nexus — your entity has a UK registration, so tax applies.
Match — exactly one rule fits: GB-VAT-STD-20 (its tax profile is GB-STD-20, destination GB, active, effective). The other three don’t match the product’s profile.
Compute — base £1,000 × 20% = £200.00.
Persist — one Source Line Tax row: Tax Type GB-VAT-STD, Rule GB-VAT-STD-20, Base £1,000, Rate 20%, Amount £200.
Post — via the Sales mapping, £200 credits 2311-VAT-GB (VAT Payable). The invoice totals £1,200.

The resulting journal:

AccountDebitCredit
Accounts Receivable£1,200.00
Revenue£1,000.00
VAT Payable — 2311-VAT-GB£200.00

Had this been a purchase of the same goods, that £200 would instead debit 1511-VAT-ITC-GB (VAT Input Tax Recoverable) — an asset you reclaim from HMRC — because the purchase mapping’s Is Recoverable flag is set to Yes. Same tax type, different account, decided by one flag. That’s the whole engine in miniature.

This is seed data — yours to adjust. The records above are a starting point, not a black box. You can rename accounts, point the mappings at your own chart of accounts, or add rules — all without touching code. The UK VAT walkthrough goes deeper, including the one-flag “apply default tax” shortcut for the simplest setups.

Real data: Brazil, where six rules fire at once

Now the opposite extreme — same engine, same kind of records, but Brazil’s seed pack is an order of magnitude bigger: 28 jurisdictions, 12 tax types, and 58 rules (versus the UK’s 5 / 4 / 4). And a single interstate sale fires six rules in sequence. The remarkable part: not one line of code differs from the UK. It’s all data.

The taxes in play

An interstate sale of manufactured goods touches six different taxes — three federal, three at state level:

Tax TypeNameLevel
BR-ICMSICMS — goods circulation taxState
BR-DIFALDIFAL — ICMS rate differentialState
BR-FCPFCP — poverty-fund surchargeState
BR-IPIIPI — federal excise on manufactured goodsFederal
BR-PIS-NCPIS — social contribution (non-cumulative)Federal
BR-COFINS-NCCOFINS — social contribution (non-cumulative)Federal

The seller’s regime changes the rates

Brazil ships five Party Tax Profiles — and which one your entity carries genuinely changes the calculation. PIS and COFINS have two versions, and the engine picks based on the seller’s regime:

Seller regime (Party Tax Profile)PIS rateCOFINS rate
BR-LR-CONTRIB — Lucro Real (non-cumulative)1.65%7.6%
BR-LP-CONTRIB — Lucro Presumido (cumulative)0.65%3.0%

That’s the Seller Regime dimension on a Tax Rule doing its job — a Lucro Real company and a Lucro Presumido company selling the identical product pay different federal contributions, from the same rule set.

The six rules that fire — São Paulo → Rio de Janeiro

A Lucro Real manufacturer in São Paulo sells R$1,000 of goods to an end consumer in Rio de Janeiro (an interstate sale, fiscal operation BR-6101; DIFAL and FCP fire only when the buyer is a non-contributor — a consumer rather than an ICMS-registered business). The engine matches six rules and runs them in sequence order:

SeqRuleTaxRateHow it appliesPosts to
10BR-ICMS-6101-SP-TO-SEICMS12%Por dentro — embedded in the price2331-ICMS-BR
20BR-IPI-STANDARDIPI10%Added on top2334-IPI-BR
30BR-PIS-LR-STDGPIS1.65%Embedded (Lucro Real rate)2335-PIS-BR
40BR-COFINS-LR-STDGCOFINS7.6%Embedded (Lucro Real rate)2336-COFINS-BR
50BR-DIFAL-RJ-STDGDIFAL8%RJ internal 20% − interstate 12%, added2332-DIFAL-BR
60BR-FCP-RJ-STDGFCP2%Rio poverty-fund surcharge, added2333-FCP-BR

Illustrative amounts on the R$1,000 goods value — six Source Line Tax rows, each posting to its own account:

TaxRate≈ AmountAdded to total?
ICMS12%R$120 (embedded)No — inside the price
IPI10%R$100Yes
PIS1.65%R$16.50 (embedded)No — inside the price
COFINS7.6%R$76.00 (embedded)No — inside the price
DIFAL8%R$80.00Yes
FCP2%R$20.00Yes
These are illustrative, not penny-perfect. Brazil’s real arithmetic is subtle — the embedded (“por dentro”) taxes sit inside the price rather than on top of it, and DIFAL is the destination state’s claim to the gap between its internal rate and the lower interstate rate. The engine handles all of it through ordinary rule fields — sequence, the embedded-tax setting, markup and dependency options; the exact, rounded figures are worked line by line in the Brazil walkthrough. The point here is the shape: six rules, one sequence, six audit rows, six GL accounts.
UK: one rule. Brazil: six. Zero code difference. Re-read those two sections back to back and you have the whole thesis of REDA’s tax engine. The UK seed is tiny; the Brazil seed is large; the engine that reads them is identical. When a new country, a new state rate, or a 2026 reform (note Brazil’s pilot CBS/IBS rules already in the seed) comes along, you add records — never code.

What you set up vs what’s automatic

You configure (once)The engine does (every invoice)
Jurisdictions, tax types, rules, profilesPicks the right jurisdiction by walking the hierarchy
Your registrations (nexus) per jurisdictionChecks nexus and zeroes tax where you’re not registered
GL routing per tax typeDerives the fiscal operation (domestic / interstate / export)
Product fiscal profiles (or the “apply default tax” flag)Matches every applicable rule and computes each tax
Buyer/seller jurisdiction & profile on Account/EntityWrites the Source Line Tax audit rows and posts to the ledger
Most of this ships pre-built. REDA includes seed data for major jurisdictions, so you rarely start from a blank page — you run the Tax Seeding Wizard, then adjust. The objects above are what the seed creates; knowing them helps you read and tune what you’re given.

Where to go next

Read this category in order — it follows the way you actually build:

Frequently asked questions

No. Countries, rates, and rules are records, not code. Adding a country means creating jurisdiction, tax-type, and rule records (often via the seeding wizard); changing a rate means editing or superseding a Tax Rule. The engine is untouched.

Because that’s how many rules match. The engine never stops at the first match — it applies every matching rule. Brazil’s tax law genuinely layers six taxes on one sale; the UK layers one. The engine simply reflects the configured reality.

On the invoice (the tax total and the line tax), and in the Source Line Tax records behind it — one row per tax that fired, showing the rule, rate, base, and amount. Those rows are the audit trail and are created automatically; you never edit them by hand.

The line gets zero tax. That can be correct (a genuinely non-taxable item, or a jurisdiction where you have no nexus) — the engine records the outcome rather than guessing. If you expected tax and got none, it’s almost always a missing registration, a missing product fiscal profile, or a rule whose conditions didn’t fit. The calculation and country articles show how to diagnose each.

It’s a parallel engine with its own rules and rates, because withholding behaves differently — it reduces the payment rather than adding to the invoice. Like the tax engine, it previews on the draft form and writes its records when the bill posts. It shares the same data-driven philosophy. Start with Understanding Withholding Tax.

Was this article helpful?