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 / Rules & Calculation / Tax Rules

Tax Rules

The Tax Rule is the brain of the engine. Everything before it — jurisdictions, tax types, profiles — is vocabulary. The rule is the sentence: “Apply this tax type at this rate when these conditions are all true.” When you post an invoice, the engine finds every rule whose conditions fit and runs them.

Two ideas make tax rules powerful, and both run counter to what people expect. First, many rules fire at once — there is no “first match wins.” A UK sale matches one rule; a Brazilian interstate sale matches six, and all six apply. Second, a rule’s conditions are mostly optional, and a blank condition means “match anything.” That’s what lets a simple country use lean rules while a complex one layers precise ones.

Getting there. Open the App Launcher (the grid icon at the top-left of any page) → REDA Financials Admin → the Tax Rules tab. In practice the Tax Seeding Wizard creates a country's rule set for you; open the tab to review a rule, or to add a new-rate rule when a rate changes.
Access you'll need. Setting up and maintaining tax rules requires the Accounting Admin v2 or Accounting Controller v2 permission set. The Accounts Payable v2, Accounts Receivable v2, and Read Only v2 sets can view them but not change them.
One rule = one tax type at one rate. A rule never bundles two taxes. If a transaction needs ICMS and IPI, that’s two rules. This keeps each rule readable and lets the engine post each tax to its own account — and it’s why Brazil needs six rules where the UK needs one.

Anatomy: three groups of fields

A Tax Rule looks busy, but its fields fall into three clean groups. Only five are required — the rest are optional conditions and calculation tweaks.

GroupFieldsJob
Identity & outputCode, Tax Type, Rate, Sequence, Description, Notes, Is ActiveWhat tax, what rate, in what order
Matching conditionsOrigin & Destination Jurisdiction, Tax Profile, Buyer & Seller Party Profile, Fiscal Operation, Seller Regime, Effective From / ToWhen does this rule fire?
Calculation modifiersInclude Freight, Subtract Discount, Base Reduction %, MVA %, Tax Included in Price, Depends On Prior RuleHow is the base computed?

The matching conditions — null means “any”

A rule fires only when all of its set conditions are satisfied. Leave a condition blank and it stops being a filter — the rule matches any value there. This “null = wildcard” behaviour is the single most important thing to understand about rules.

ConditionMatches when…Blank means
Origin JurisdictionSeller’s location is this place or below it (ancestry)Any origin
Destination JurisdictionBuyer’s location is this place or below itAny destination
Tax ProfileThe line’s product treatment equals thisCatch-all — fires only for products flagged “Apply Default Tax” (see below)
Party Tax Profile (Buyer)The customer’s party profile equals thisAny buyer
Party Tax Profile (Seller)Your entity’s party profile equals thisAny seller
Fiscal OperationThe derived operation equals this (interstate, export…)Any operation
Seller RegimeYour entity’s regime matches (Lucro Real…) — read from the entity Party Tax Profile’s Tax Regime field, so renaming a profile never changes the mathAny = all regimes
Buyer Contributor ScopeThe buyer’s contributor status matches (Contributor / Non-Contributor) — e.g. Brazil DIFAL/FCP fire only for non-contributor end consumersAny = all buyers
Effective From / ToThe invoice date falls in the window(From blank = no start; To blank = no expiry)
Is ActiveCheckedUnchecked = never fires

Ancestry matching (Origin/Destination) is the same hierarchy trick from Tax Jurisdictions: a rule set at GB fires for a buyer anywhere in the UK, because GB is an ancestor of every UK place. On top of these conditions, the engine also runs a separate nexus check (is your entity registered where the buyer is?) before any rule fires — see Entity Tax Registration.

The Tax Profile blank is a special wildcard. Every other blank condition simply widens the rule. A blank Tax Profile is stricter: such “catch-all” rules fire only for lines whose product carries no tax profile and has its Apply Default Tax flag ticked. They never stack on top of profile-scoped rules for a classified product — a deliberate design that prevents accidental double taxation. If a tax should apply to all products alongside profile-scoped taxes (Brazil’s federal PIS/COFINS, say), seed one rule per profile rather than one blank-profile rule.

Sequence & dependencies — order matters

When several rules fire, the engine runs them in Sequence order (lowest first). For most taxes order is cosmetic, but for some it’s essential, because one tax is computed from another’s result. That’s what Depends On Prior Rule is for.

Brazil DIFAL — a dependency in action. On an interstate sale, ICMS is charged at the interstate rate (12%), and DIFAL collects the difference up to the destination state’s internal rate. DIFAL’s rule runs at a higher sequence (50) than ICMS (10), and can reference the ICMS rule as its prior rule so its base nets off what ICMS already took. Sequence guarantees ICMS is computed first; the dependency feeds its result forward.

The rule self-reference is guarded: a rule can’t depend on itself, and the prior rule must be active (two validation rules enforce this).

How the base is computed

By default a rule’s tax is simply base × rate, where the base is the line amount. The calculation modifiers adjust that base for the cases that need it. Applied in this order:

ModifierEffect on the baseUsed for
Include Freight+ freight on the lineBrazil (freight is taxable in the ICMS base)
Subtract Discount− discount on the lineDiscounts that reduce the taxable amount
Base Reduction (%)× (1 − reduction%)Partial base exemptions (some Brazil items)
MVA / Markup (%)× (1 + MVA%)Brazil ICMS Substituição Tributária markup
Depends On Prior Rule− the prior rule’s amountDIFAL differential
Tax Included in Price (por dentro)Tax is embedded in the price — doesn’t add to the invoice totalBrazil ICMS

The final amount is base × rate ÷ 100, rounded to two decimals (half-up). The full numeric walkthroughs — including Brazil’s por-dentro grossing-up — are in How Tax Calculates and the Brazil walkthrough.

Effective dating — rate history without losing the past

Rates change, and old invoices must keep their old rate. REDA handles this with Effective From / Effective To rather than a separate history object. To change a rate: set the old rule’s Effective To to the day before the change, and create a new rule with the new rate from the change date.

UK VAT history (real): the standard-rate rule GB-VAT-STD-20 is effective from 4 Jan 2011 — the day the rate rose to 20%. An invoice dated before then would match the older 17.5% rule (with its own effective window); an invoice today matches the 20% rule. The engine always picks the rule in force on the invoice date.
Whole-regime changes work the same way. This is exactly how REDA absorbs a reform like Brazil’s 2026–2033 move to CBS/IBS: the retiring taxes get an Effective To, the new taxes an Effective From, and you apply it all by re-seeding the updated pack. Prior-dated invoices keep computing correctly — nothing is lost.

The fields — with UK & Brazil values

Every field, with the UK standard-VAT rule beside Brazil’s interstate ICMS rule:

FieldReq🇬🇧 GB-VAT-STD-20🇧🇷 BR-ICMS-6101-SP-TO-SE
CodeYesGB-VAT-STD-20BR-ICMS-6101-SP-TO-SE
Tax TypeYesGB-VAT-STDBR-ICMS
RateYes20%12%
SequenceYes1010
Effective FromYes2011-01-042020-01-01
Tax ProfileNoGB-STD-20BR-STD-GOODS
Destination JurisdictionNoGB(blank — scoped by Fiscal Operation)
Fiscal OperationNo(blank)BR-6101 (interstate)
Seller RegimeNoAnyAny
Tax Included in Price (Por Dentro)NoNoYes (por dentro)
Origin / Buyer & Seller Profile / MVA / Base Reduction / Freight / Discount / Depends OnNo(all blank)(set as Brazil law requires)

The contrast is the lesson: the UK rule sets a handful of fields and leaves the rest blank (= any), so it matches broadly. The Brazil rule pins fiscal operation and the por-dentro flag, so it fires precisely on interstate sales and embeds in the price.

Real data: UK and Brazil rule sets

🇬🇧 United Kingdom — 4 rules, one per treatment

RuleTax TypeTax ProfileRateSeq
GB-VAT-STD-20GB-VAT-STDGB-STD-2020%10
GB-VAT-RED-5GB-VAT-REDGB-RED-55%10
GB-VAT-ZERO-0GB-VAT-ZEROGB-ZERO0%10
GB-VAT-EX-0GB-VAT-EXEMPTGB-EXEMPT0%10

One product, one rule fires (the one whose Tax Profile matches). No sequencing drama — they’re mutually exclusive by profile.

🇧🇷 Brazil — six rules on one interstate line

SeqRuleTaxRateNotable fields
10BR-ICMS-6101-SP-TO-SEICMS12%Tax Included in Price (por dentro); Fiscal Operation = BR-6101
20BR-IPI-STANDARDIPI10%Additive; Tax Profile = BR-IPI-GOODS
30BR-PIS-LR-STDGPIS1.65%Seller Regime = Lucro Real; por dentro
40BR-COFINS-LR-STDGCOFINS7.6%Seller Regime = Lucro Real; por dentro
50BR-DIFAL-RJ-STDGDIFAL8%Fiscal Operation = BR-6101; Destination = RJ; Buyer = Non-Contributor
60BR-FCP-RJ-STDGFCP2%Fiscal Operation = BR-6101; Destination = RJ; Buyer = Non-Contributor

Every dimension is doing work here: Fiscal Operation gates the interstate rules, Destination scopes DIFAL/FCP to Rio, Buyer Contributor Scope restricts DIFAL/FCP to consumer (non-contributor) sales, Seller Regime selects the Lucro Real PIS/COFINS, and Sequence orders the cascade. Change the seller to Lucro Presumido and the 0.65% / 3% rules take their place; sell to an ICMS-registered business instead of a consumer and DIFAL/FCP drop out, leaving four rules.

How matching runs at post time

You don’t trigger any of this — it happens automatically when an invoice posts — but here’s the sequence, so the field choices make sense:

Build the seller’s and buyer’s jurisdiction ancestor sets, and pull every active rule whose origin/destination and effective dates fit.
Filter those down by the remaining conditions — tax profile, party profiles, fiscal operation, seller regime — treating blanks as “any.”
Sort the survivors by Sequence, then compute each one’s base and amount (honouring dependencies), and write a tax row per rule.
A rule states exactly who it applies to — and that is why some were split. Where a single seeded withholding rule mixed scopes the model keeps apart — resident versus non-resident, company versus individual — version 1.610 split it into two rules rather than widening one, so each rate now says precisely who it covers. If you seeded a country before that version you may see one rule where the corrected pack has two; that is the fix, not a duplicate. See the seeding wizard.

Built-in guardrails

RuleWhat it enforces
Code uppercase / no spacesClean external-ID codes
Rate non-negativeUse 0 for zero-rated/exempt — never a negative rate
Effective date rangeEffective To can’t be before Effective From — a rule can’t expire before it begins
Depends-not-selfA rule can’t depend on itself, and the prior rule must be active
Lookups activeThe tax type, profiles, jurisdictions, and fiscal operation a rule points at must all be active

Where to go next

  1. Tax Types — the tax a rule applies.
  2. Tax Calculation Components — advanced base customisation on a rule.
  3. How Tax Calculates on a Document — rules matched in a live calculation.
  4. Fiscal Operations — the transaction nature a rule reads.
  5. Source Line Tax (Audit Records) — the record each fired rule writes.

Frequently asked questions

Neither — both fire. The engine never stops at the first match; it applies every rule whose conditions are satisfied, in Sequence order. That’s deliberate: Brazil genuinely layers six taxes on one sale. If you only want one to apply, make their conditions mutually exclusive (as the UK rules are, by Tax Profile).

Work through the conditions: is it Active? Is the invoice date inside Effective From/To? Do the origin/destination jurisdictions match (by ancestry)? Does the line’s Tax Profile match (or is the rule’s blank)? Do the party profiles, fiscal operation, and seller regime match? And separately — does your entity have nexus in the buyer’s jurisdiction? A single unmet condition stops the rule.

Don’t edit the rate in place. Set the current rule’s Effective To to the day before the change, then create a new rule with the new rate effective from the change date. Old invoices keep the old rate; new ones get the new one.

Set a condition only when the rule should be restricted by it. Blank = “applies regardless.” Simple regimes (UK) leave almost everything blank; complex ones (Brazil) pin fiscal operation, destination, and seller regime to target precisely. Over-setting conditions is the usual reason a rule doesn’t fire when you expect it to.

Was this article helpful?