Skip to content

Feature Flags

Applies to: All subscriptions

Purpose

Document every operational control: what it does, its default, how the value in force for a registration is decided, and the consequence of changing it. Three of these flags change what the system does without a person present, and those deserve a decision rather than a default.

Audience

System administrators and implementation consultants. The three off-by-default flags also concern the customer's finance control owner.

Prerequisites

  • Modules and Licensing
  • Administrator access to Admin & Logs > Operational Controls (changes need a Super Admin)

Reference

How flags resolve

The value in force for a registration is the first of these that exists:

Order Tier Set where Reaches
1 GSTIN override Operational Controls > GSTIN Overrides That one registration
2 Company default Operational Controls > Company Defaults Every registration of the company with no override for that flag
3 Platform default Built into the product (the Default column below) Everything nobody has set

So: set a flag once for the company, and give a single registration an override only where it must differ. That is also the right way to pilot anything with legal consequence — leave the company default off and override the one registration.

Two consequences worth knowing before you change anything:

  • A company default can change many registrations at once. Every registration without its own override follows it, on the next request and within 60 seconds at the latest.
  • An override outlives a change to the company default. A registration with its own override does not move when the company default does. If "I changed the company default and this GSTIN did not change", that is why.

Effective View (Operational Controls) shows, for one registration, the value in force for every flag and which tier set it. It is the first place to look when a registration behaves unexpectedly.

Flags are never per user. Some flags are company-wide only and cannot be overridden per GSTIN (MODULE_TDS_ENABLED, AGENT_ENABLED, SOD_ENFORCED, GOVERNANCE_MODE and the company-scoped controls in the tables below) — see below.

Values are cached for up to 60 seconds. A change made through the screen or the API clears the cache for every registration it reaches, so it normally applies on the next request; if the cache store is unreachable at that moment the change applies within a minute.

The flags

Flag Default What it controls
EINVOICE_ENABLED On e-Invoice module: IRN generation, cancellation, printing
EWAYBILL_ENABLED On e-Way Bill module: generation, Part-B, extension, consolidated bills
RECONCILIATION_ENABLED On Reconciliation and matching screens
SOD_ENFORCED On Segregation of duties. Company-wide only, and locked against switching off once the company has started live work. See below
AUTO_IRN_ENABLED Off Fires IRN generation automatically on ingest
INVOICING_ENABLED Off (automatically off once an ERP connects — see below) Invoice Generation Module
MODULE_TDS_ENABLED Off Direct Tax (TDS) module: deductions, challans, return filing, certificates, notices. Company-wide only — see below
AGENT_ENABLED Off Complifly Agent — the Windows edge connector for on-premises ERPs (Tally, BUSY, Marg). Off means no enrolment token can be issued and the agent gateway refuses every call. Company-wide only — see below. Not yet reachable in production: the reverse proxy's client-certificate verification for the agent gateway is a pending deployment step
EXCEL_UPLOAD_ENABLED On (automatically off once an ERP connects — see below) Whether documents may be posted via .xlsx/.csv upload
ERP_WRITEBACK_ENABLED Off Sends compliance outcomes back to the ERP
IRN_REPORTING_WINDOW_APPLIES On Whether the 30-day e-invoice deadline applies to the registration. Leave on unless Compliance has confirmed the registration is below the threshold. Off: no "past the deadline" items, no refusal of old documents on upload, and no report_by date on failed-IRN ERP updates. Set per registration, Super Admin only
COMPLIANCE_INTELLIGENCE_V2 Off Shows the finding-based Attention Center (/attention) instead of the earlier one. Changes only what users see: findings exist only where the scheduled check is on (COMPLIANCE_SWEEP_ENABLED, an operator setting), and until it runs the screen says "Checks are not running" rather than showing an empty list. Switch it on one registration at a time, after Compliance has confirmed the 30-day IRN deadline applies to it
NOTIFICATION_DISPATCH_ENABLED Off Whether the Attention Center may email the company at all: assignments, escalations, reopened decisions and the daily and weekly summaries. Off sends no email whatever the notification settings say, including the confirmation link for an external address; the settings are still saved, and the in-app bell is not affected. Whole company only. Super Admin only. See the paragraph below
DOCUMENT_STATUS_V2 Off One set of status words and colours on the IRN Workbench, EWB Doc Workbench, e-Way Bill Dashboard and Consolidated EWB (a delivered bill reads Delivered, a document NIC has not confirmed reads In Doubt). Changes only what users read: no button, server rule, total or stored value depends on it, so switching it off is a complete rollback. Can be set for a company or one GSTIN
DOCUMENT_RULES_V2 Off On the IRN Workbench and EWB Doc Workbench, buttons that cannot run are greyed with the reason instead of answering after the click; ticked documents no longer in the list are ignored; Generate IRN, Generate E-Way Bill and Part B act on the documents that qualify and list the ones they skipped; Print and Generate IRN follow one rule. Changes what users are told and which documents a bulk action reaches, not what the server or NIC accepts. Company or one GSTIN
DOCUMENT_RULES_SERVER_MODE OFF OFF or LOG_ONLY. Log only records, in the event log, what the new server rules would refuse (event RULEBOOK_WOULD_REFUSE, once per document per ten minutes). It never refuses or changes a request, and there is no enforce value. Company or one GSTIN
ENTERPRISE_GRID_V2 Off Loads the IRN Workbench list a page at a time (50 by default, up to 200), with search, filters and sorting done on the server over all documents, and draws only the rows on screen. Off keeps today's list, which loads the newest 1,000 documents and filters them in the browser. Changes how the list is loaded and drawn, nothing else: no button, rule or stored value depends on it, so switching it off is a complete rollback. Other lists (EWB Doc Workbench, e-Way Bill list, Consolidated e-Way Bills) are not affected. Company or one GSTIN, Super Admin only
PERSONAL_VIEWS Off Lets each user save the IRN Workbench as named views: the four dropdowns, financial year and month, sort order and row density, up to 20 per user, with one opened by default. Private to the user who saved it: colleagues and administrators cannot see it. Needs ENTERPRISE_GRID_V2 on for the same registration (the picker appears only on the paged list). Changes what a user sees when the screen opens and nothing else, so switching it off is a complete rollback; saved views are kept. Company or one GSTIN, Super Admin only
COMMAND_BAR_V2 Off Arranges the actions of the IRN Workbench (as Generate IRN, Generate E-Way Bill, a Print menu, a Cancel menu, More actions and Refresh) and of the EWB Doc Workbench (as Generate EWB, Print EWB, Part B, a Change menu and More actions) instead of rows of buttons. With documents selected a line shows the count and a Bulk actions menu saying how many of the selected documents each action will process (on the EWB Doc Workbench it holds Generate EWB, the only action that works on many documents at once); on the paged IRN list and on the EWB Doc list each row also gets an actions menu. A bulk action acts on at most 500 documents at a time. The same actions, rules, permissions and reasons: only their position changes, so switching it off is a complete rollback. Needs DOCUMENT_RULES_V2 on for the same registration; without it the old rows stay. Company or one GSTIN, Super Admin only
WORK_QUEUES Off Shows a Work queues row on the Launchpad and above the IRN Workbench list: Ready for IRN (no IRN yet, or the last attempt failed) and In Doubt (NIC has not confirmed), each with a count; clicking one opens the IRN Workbench filtered to it, across every financial year. Where an Attention Center finding covers the same ground, a line links to it. Nothing is assigned, scheduled or escalated; a document leaves a queue when its state changes. Needs DOCUMENT_STATUS_V2 and ENTERPRISE_GRID_V2 on for the same registration (the API refuses without them). Changes what a user sees and clicks only, so switching it off is a complete rollback. Company or one GSTIN, Super Admin only
DOCUMENTS_WORKSPACE Off Opens a Documents screen: one list of every document of the registration, invoices and e-way bill documents together (chips for All, Invoices and E-way bill documents, with counts, and search), with a pane that shows the selected document's IRN and recent submissions, e-way bills and open Attention items. Read-only: it cannot generate, cancel or print, and it does not replace the IRN Workbench or the EWB Doc Workbench. Needs DOCUMENT_STATUS_V2 and ENTERPRISE_GRID_V2 on for the same registration (the API refuses without them). Changes what a user sees only, so switching it off is a complete rollback. Company or one GSTIN, Super Admin only
CORPORATE_PRINT_FRAMEWORK Off Prints the registration's documents through the shared print framework: each template has a version, and every print is recorded with the template version and a fingerprint of the document. The printed page is unchanged: the framework is held identical to the original templates by automated page-by-page comparison. Switching it off restores the original renderer at once and stops the recording. Company or one GSTIN, Super Admin only
IGM_CREDIT_RULE WARN Credit management. ALLOW switches it off — limits are recorded but never checked at post time; the interface labels this value OFF. WARN flags a breach and posts anyway; BLOCK refuses the post until a checker overrides it
IGM_APPROVAL_VALUE_THRESHOLD 0 (off) Invoice value above which approval is required
IGM_APPROVAL_DISCOUNT_PCT 0 (off) Discount percentage above which approval is required
IGM_DISCOUNT_OVER_MAX_ACTION BLOCK When a line discount exceeds the item's maximum: BLOCK outright, or APPROVE (allowed, but requires approval)
IGM_APPROVAL_ENGINE Off Multi-level approval workflow, rather than the simpler threshold gate. Cannot be switched off while approvals are open — see below
COMPLIANCE_POLICY_ENGINE Off Lets Complifly apply the compliance policies it has set up for your company when a document is decided, such as how a stock transfer is described to the e-way bill system. Off, or with no policy set up, nothing changes: every document is decided exactly as before. Switched on by Complifly for a company when its configuration has been agreed. Company-wide only
COMPLIANCE_DECLARATIONS Off Decides each document under the turnover band your company has declared for the document's own date, instead of the single current band held on the registration, and checks documents that cite a letter of undertaking or bond against the register you have recorded (a warning only, never a hold). A declaration applies to documents dated on or after the date you give; documents already processed are not reprocessed. Switched on by Complifly after your existing bands have been carried across. Company-wide only
EWB_ITEM_HSN_MAP Off Lets a stock transfer that must move on an e-way bill be stored without an HSN (a Tally Stock Journal carries none) and filled in the e-way bill preparer, which suggests a code from what your company has recorded for the item, as of the document's date. Nothing is filled in until a person uses it, a code that came with the voucher is never changed, and nothing can be changed once an e-way bill has been generated. Off keeps today's behaviour: a stock transfer with no HSN is refused. Switched on by Complifly. Company-wide only
GOVERNANCE_MODE STANDARD How strict the three elevated-access controls are for the company. Standard (the default) is today's behaviour with the controls optional. Strict makes them compulsory: Emergency Access only from Complifly with your approval reference for at most 4 hours; Complifly support reads the company only inside a support window your Org Admin opened; a privileged role (Org Admin, Super Admin) waits for a second person to approve. Company-wide only; Complifly Super Admin only. See Elevated Access
SCENARIO_DECLARATION_MODE Off Not in use yet: changing it has no effect on any document. Reserved for scenario declaration, where your company says which kinds of document it expects to produce. When that is released, Observe will record which documents would be held for falling outside what you declared, while every document is still processed as today; nothing is held, refused or changed by either setting. Switched on by Complifly, for one company first. Company-wide only
COMPASS_ENABLED Off The in-product Compass. Off means users see nothing. Also the per-registration off switch
COMPASS_TIER retrieval retrieval answers only with cited extracts from documentation and never calls a language model (no per-answer cost); assisted lets the model compose an answer from those extracts, within a monthly allowance
COMPASS_DB_LOOKUPS Off Lets Compass read one of this registration's own documents — its stored IRN / e-Way Bill status and the NIC error on a failure — to answer "why did this fail". Every read is row-level-security scoped to the registration. Needs COMPASS_ENABLED (or the Agent) on. On the assisted tier the stored status and error text are sent to the model
COMPASS_AGENT_ENABLED Off Compass Agent — the multi-step, tool-using troubleshooting loop. Separate from COMPASS_ENABLED; heavier and per-token. Also requires a model credential on the server, and its write/execute tools always ask a human first
COMPASS_AGENT_AUDIENCE internal Who may use the Agent once it is on. internal — Complifly support / platform / super-admin only; the registration's own users get Retrieval. all — the registration's org-admins and executives too. Enabling the Agent so Complifly can investigate a registration does not expose it to that registration's staff until this is all
ENFORCE_GSTIN_COUNT OFF What happens when adding a registration would take the company past its plan. OFF checks nothing; ALERT allows it and records the excess for Complifly; ENFORCE refuses it once past the grace band. Whole company only. Applies only to the administrative action named here, never to a document or a statutory step. See Plan & Limits
ENFORCE_USER_COUNT OFF The same, for adding or reactivating a user, or giving one access to another registration
ENFORCE_ERP_CONNECTIONS OFF The same, for adding an ERP connection. Connections the Complifly Agent makes itself are counted and never refused
ENFORCE_MODULE_ENTITLEMENTS OFF The same, for switching an optional module on (Invoice Generation, TDS, the Agent, Write-back, Compass, Compliance Intelligence) when the plan states it is not included. e-Invoice, e-Way Bill and Reconciliation are never affected
ENTITLEMENT_GRACE_PCT 10 The band between a limit and refusal, as a percentage of the limit, rounded down to whole units. A limit of 1 has no band. Only used when a limit above is ENFORCE

Who may change each flag

A flag that is part of your subscription can only be changed by a Complifly Super Admin — whoever you are inside your own organization. Your organization administrator can change your company's own business policies, and nothing else.

Kind Flags Who may change it
Customer business policy SOD_ENFORCED, IGM_APPROVAL_ENGINE, IGM_APPROVAL_VALUE_THRESHOLD, IGM_APPROVAL_DISCOUNT_PCT, IGM_DISCOUNT_OVER_MAX_ACTION, IGM_CREDIT_RULE Organization administrator, or Complifly Super Admin
Platform operations (agreed with the customer) GOVERNANCE_MODE Complifly Super Admin only
Licensing / subscription EINVOICE_ENABLED, EWAYBILL_ENABLED, RECONCILIATION_ENABLED, EXCEL_UPLOAD_ENABLED, ERP_WRITEBACK_ENABLED, COMPLIANCE_INTELLIGENCE_V2, NOTIFICATION_DISPATCH_ENABLED, IRN_REPORTING_WINDOW_APPLIES, DOCUMENT_STATUS_V2, DOCUMENT_RULES_V2, DOCUMENT_RULES_SERVER_MODE, CORPORATE_PRINT_FRAMEWORK, ENTERPRISE_GRID_V2, PERSONAL_VIEWS, COMMAND_BAR_V2, WORK_QUEUES, DOCUMENTS_WORKSPACE, INVOICING_ENABLED, MODULE_TDS_ENABLED, AGENT_ENABLED, AUTO_IRN_ENABLED, and all five COMPASS_* flags, ENFORCE_GSTIN_COUNT, ENFORCE_USER_COUNT, ENFORCE_ERP_CONNECTIONS, ENFORCE_MODULE_ENTITLEMENTS, ENTITLEMENT_GRACE_PCT, COMPLIANCE_POLICY_ENGINE, COMPLIANCE_DECLARATIONS, EWB_ITEM_HSN_MAP, SCENARIO_DECLARATION_MODE Complifly Super Admin only

A licensing flag is one that switches on a module, or starts processing Complifly runs and pays for — calls to the government's systems (AUTO_IRN_ENABLED) or a language model (Compass beyond Retrieval). An attempt by anyone else is refused with 403 FEATURE_WRITE_NOT_PERMITTED and recorded in the audit log. The rule is enforced at the server, for the screen, the API, bulk calls and removals alike; the screen marks these flags Managed by Complifly.

Overriding a safety check is also Complifly's alone. The two refusals below can be overridden with force: true and a written reason only by a Complifly Super Admin; anyone else sending force gets 403 FORCE_NOT_PERMITTED.

Reading every flag — Operational Controls' four tabs, read-only — needs only admin.view, which the organization administrator and the external auditor hold for their own company, and Complifly's support and platform engineers hold for every company. Each view by Complifly staff is recorded in the viewed company's audit log.

New flags added in a future release are licensing flags until Complifly deliberately classifies them otherwise.

MODULE_TDS_ENABLED and AGENT_ENABLED are company-wide only

Every other flag on this page can be overridden for one GSTIN. These two cannot (and neither can NOTIFICATION_DISPATCH_ENABLED, below, nor the five Plan & Limits settings):

  • MODULE_TDS_ENABLED — the TDS module has no GSTIN in its own request path; it authenticates by TAN and organization instead.
  • AGENT_ENABLED — an agent enrols against a company, before it is ever bound to a specific GSTIN. Binding happens only after an admin approves the enrolment, so there is no GSTIN to key the flag on at the point enrolment itself needs to be allowed.

Set either under Company Defaults. It then applies to every GSTIN the company holds. An attempt to set one for a single GSTIN is refused with 400 FEATURE_SCOPE_NOT_ALLOWED — a per-GSTIN value would be stored and never read.

The five that default to off, and why

These share a property: enabling one changes what the system does without a person present, sends data outward, or unlocks a module with legal or filing consequence. None of the five is a convenience, so none is inherited.

AUTO_IRN_ENABLED. Fires IRN generation the moment a document is ingested. It is an automation, not a module unlock — and registering an invoice is a legal act that consumes a billed call and permanently consumes a document number. The default is off so that generation stays a decision until someone deliberately chooses otherwise. Enable it only when validation quality is proven; automating generation over a poor-quality feed produces rejections at volume.

INVOICING_ENABLED. Unlocks the Invoice Generation Module, which raises invoices inside Complifly. A module unlock with legal consequence.

MODULE_TDS_ENABLED. Unlocks the Direct Tax (TDS) module — same posture as INVOICING_ENABLED, since TDS return filing is its own legal/filing act. See "MODULE_TDS_ENABLED and AGENT_ENABLED are company-wide only" above for how it differs from every other flag on this page.

AGENT_ENABLED. Unlocks issuance of an enrolment token and, once an agent is enrolled and approved, acceptance of calls from it at the agent gateway. A module unlock with a data-egress and device-identity consequence, not a convenience — the same posture as ERP_WRITEBACK_ENABLED. See "MODULE_TDS_ENABLED and AGENT_ENABLED are company-wide only" above.

ERP_WRITEBACK_ENABLED. Sends compliance outcomes to the ERP. Two properties matter operationally:

  • It is enforced at emission, not at delivery. A tenant with this off stores not one outbound event — so there is nothing to purge, index, back up or explain.
  • It does not backfill. Emission starts from the moment it is enabled. Seeding an ERP with existing compliance state is a separate, explicit exercise.

NOTIFICATION_DISPATCH_ENABLED. The switch for email. If your team set up notifications and nobody is getting email, this is the first thing to check. Three things to know:

  • It decides whether, not who. Who gets which email is set in Operational Controls (the Notifications section of Company Defaults for the company, and of a registration's drawer under GSTIN Overrides) and by each person in Settings & Profile > My Notifications. Those settings are saved whether this flag is on or off. With it off nothing is sent, and nothing is queued: switching it on does not send what happened while it was off, beyond the last 48 hours the sender looks back over.
  • It is for the whole company. It cannot be set for one GSTIN: an organization's settings and the summaries span its registrations. An attempt to set it for a single GSTIN is refused with 400 FEATURE_SCOPE_NOT_ALLOWED.
  • It is inside a larger switch. The sender itself runs only where the server has ATTENTION_NOTIFICATIONS_ENABLED=true and Azure email configured (see Environment Variables); without those no company is emailed, whatever this flag says. That server setting is the only stop that covers every company at once. Turning this flag off is per company. Only a Complifly Super Admin can change either.

The in-app bell is not an email and is not affected: it keeps working with this flag off.

ENTERPRISE_GRID_V2. Switches the IRN Workbench to a paged list. Before you switch it on: the list shows a page at a time with a page selector, searching and filtering cover every document (not only the newest 1,000), and "Select all" covers the pages you have loaded, up to 500 documents, and says so when more match. A registration with fewer than 1,000 documents sees the same documents either way. Switch it on for one GSTIN first; switching it off restores the earlier list at once and changes nothing stored. The paged list is requested with grid=2 on GET /api/irn/workbench; a request without it is answered exactly as before, and with the control off a grid=2 request is refused with 403 FEATURE_DISABLED_BY_OPERATOR.

PERSONAL_VIEWS. Adds a Views button to the IRN Workbench. Before you switch it on: ENTERPRISE_GRID_V2 must already be on for the same registration, or nobody will see the button (the views API still answers, the screen simply does not offer it). A user who has chosen a default view sees the list open already filtered, so tell the team before you switch it on for a registration. Switching it off removes the button at the user's next login or screen refresh, because a user's controls are read when they sign in; their saved views are kept and return when it is switched back on. Views are stored in sys_user_grid_view, protected by row-level security on the user. The API is the Personal Views API.

COMMAND_BAR_V2. Moves buttons on the IRN Workbench and the EWB Doc Workbench. Before you switch it on: DOCUMENT_RULES_V2 must already be on for the same registration, or nothing changes (the three rows stay, and there is no error). Tell the team where the familiar buttons went: Cancel IRN and Cancel E-Way Bill are under Cancel; Print NIC, Branded Print and Print E-Way Bill under Print; Part B, Extend Validity, Multi-Vehicle, Update Transporter, Reject, the lookups, Template Center and Delete Selected under More actions. A change reaches a user at their next login or screen refresh, because a user's controls are read when they sign in. The bar works on both the paged and the earlier list; the per-row actions menu appears on the paged IRN list and on the EWB Doc list (the earlier unpaged IRN list keeps its own row icons). On the EWB Doc Workbench, Generate EWB moves from the page header into the bar (the header keeps Refresh and Layout, and never shows a second Generate button), Extend Validity is under Change, and Cancel and Reject are under More actions. With the bar on, select all on the EWB Doc list stops at 500 documents and says so; with it off it selects every row as before.

WORK_QUEUES. Adds queue chips. Before you switch it on: DOCUMENT_STATUS_V2 and ENTERPRISE_GRID_V2 must already be on for the same registration, or the chips do not appear and the API answers 403 naming what is missing. Counts are up to a minute old; the list a queue opens is live. Opening a queue shows every financial year (a document waiting for an IRN is waiting whatever year it belongs to), so the list always matches the count; the financial-year control does not narrow it while a queue is open. The queues are fixed (two); they cannot be created or edited by customers. A change reaches a user at their next login or screen refresh. See the Work Queues API.

DOCUMENTS_WORKSPACE. Adds the Documents screen at /documents. Before you switch it on: DOCUMENT_STATUS_V2 and ENTERPRISE_GRID_V2 must already be on for the same registration, or the screen says it is not switched on and the API answers 403 naming what is missing. A user sees only the kinds their role allows (irn.view for invoices, ewb.view for e-way bill documents). An IGM challan or bill is listed once, as an e-way bill document, where the two workbenches each show it. The list opens on the current financial year, like the IRN Workbench. It appears as an All Documents tile on the Launchpad and as an All Documents entry under Documents in the side navigation, but only where the screen would open (the control and both prerequisites on) and only for a user who can view invoices or e-way bills. A change reaches a user at their next login. See the Documents API. CORPORATE_PRINT_FRAMEWORK. Changes how a printed document is built, not how it looks. Before you switch it on: print one invoice of each kind you issue (domestic, export, cancelled, one with an e-way bill) for the registration before and after, and compare them. Switch it on for one GSTIN first. With it on, a print whose template and data have drifted apart is refused with PRINT_DTO_SCHEMA_MISMATCH instead of printing blanks, and a template name that no longer exists still prints with the standard template but is recorded as a fallback. Switching it off restores the original renderer at once; nothing stored changes, and the audit rows already written stay.

DOCUMENT_RULES_SERVER_MODE. A measuring tool, not a rule. With it on (LOG_ONLY), each Generate E-Way Bill request is checked against the new rules and, where they would have refused it, one event is written. Nobody is refused. Read the events before anyone asks for enforcement: they say how many real requests it would affect, and why.

DOCUMENT_RULES_V2. Switches the action rules on two screens. Before you switch it on: buttons that used to answer after the click are now grey (hover for the reason), and Generate IRN on a mixed selection sends only the documents that qualify and lists the others. Switch it on for one GSTIN first. Switching it off restores both screens at once; nothing stored changes.

DOCUMENT_STATUS_V2. Switches the status words on four screens. Three things to know before you switch it on:

  • It changes words and colours, nothing else. With it on, a bill marked as received reads Delivered instead of Active in the EWB Doc Workbench's EWB Status filter; a document raised only for an e-way bill reads E-Way Bill Only instead of carrying the green "active IRN" colour; a document waiting for its e-way bill reads E-Way Bill Pending; an IRN request NIC did not answer clearly reads In Doubt. Spellings such as CANCELED, ACT, lower case and trailing spaces read the same on all four screens. Which buttons are enabled, what the server accepts, and every dashboard total are the same on or off.
  • The raw word stays in the tooltip. Hover a badge to see what is stored (for example "Stored as ACT").
  • Tell the team first. The largest visible change is in the EWB Doc Workbench's EWB Status filter: delivered bills move out of Active into their own Delivered entry.

Set it for one GSTIN first, or for the company. Switching it off puts every screen back to the earlier wording at once; nothing is lost because nothing was changed.

COMPLIANCE_INTELLIGENCE_V2. Switches a registration to the finding-based Attention Center. Two things to know before you switch it on:

  • It changes the screen, not the checks. Findings are created by the scheduled check, which is a separate setting on the application server (COMPLIANCE_SWEEP_ENABLED, see Environment Variables). With the flag on and the checks off, the screen says Checks are not running instead of showing an empty list. Requires server access to change.
  • It is switched on one registration at a time. The new screen tells a customer a document is past its 30-day IRN deadline. Confirm with Compliance that the deadline applies to that registration first. Only a Complifly Super Admin can change it.

Switching it off sends users back to the earlier screen. Findings, owners and recorded decisions are kept and reappear when it is switched back on.

IRN_REPORTING_WINDOW_APPLIES. Unlike most flags this one defaults on, because the 30-day window is what the product has always enforced and turning it off hides a statutory deadline. Three things change when it is off for a registration:

  • The Attention Center stops raising nearing and past the IRN deadline items, and any already open close at the next check (kept in Finding History).
  • An upload or an ERP push is no longer refused only because its document date is more than 30 days old.
  • A failed-IRN update sent to the ERP carries no report_by date.

If the flag cannot be read, the window applies. Set it per registration as a GSTIN override; only a Complifly Super Admin can change it.

INVOICING_ENABLED and EXCEL_UPLOAD_ENABLED close automatically when an ERP connects

A GSTIN fed by a connected ERP and left open to Excel upload or the Invoice Generation Module as well can receive the same invoice twice — once from the ERP, once entered by a person — and each entry can raise its own IRN and e-Way Bill for what is really one transaction. Nothing about this errors; it surfaces later, at reconciliation or audit, disconnected from whoever left the second channel open.

So the moment a GSTIN's ERP connection goes ACTIVE, both flags are written false for that GSTIN automatically, as a GSTIN override. This never overwrites an override already set for that GSTIN — it only fills in whichever of the two has none. The change appears in Audit History for the GSTIN with the reason "ERP connection … went live".

Turning either back on for an ERP-connected GSTIN requires a reason — however the change reaches it. The change is refused with 409 NON_ERP_POSTING_BLOCKED, naming the affected GSTIN(s) and the connected ERP(s). Only a Complifly Super Admin can override it, by sending { force: true, reason: "..." } — and since these two flags are licensing flags, only a Complifly Super Admin can change them at all. The check applies to all three routes to the same outcome:

What you did Why it is checked
Set the GSTIN's own override to on The direct case
Set the company default to on while an ERP-connected GSTIN has no override of its own That GSTIN would inherit "on"
Removed the GSTIN's override while the company or platform default is on The GSTIN would fall back to "on"

The reason is written to the audit trail against that change.

IGM_APPROVAL_ENGINE cannot be switched off under open approvals

Switching the approval engine off for a registration that still has documents awaiting approval would clear those approvals without recording them, and the documents would post unapproved. The change is refused with 409 APPROVALS_IN_FLIGHT, listing the waiting documents — again whether it arrives as a GSTIN override, a company default that an inheriting GSTIN receives, or the removal of either. Clear the approvals first. Only a Complifly Super Admin can force the change, with a written reason: forcing cancels the open approvals and records each cancellation; it never approves them. An organization administrator — who may otherwise change this flag — sees the refusal and the waiting documents, but cannot override it.

Forcing either flag on does not enable ERP_WRITEBACK_ENABLED, and does not add any cross-channel duplicate detection — Complifly does not compare documents entered through different channels against each other. A deliberate multi-source setup (an ERP migration running two systems in parallel, for example) still needs its own process for keeping the two from overlapping.

Segregation of duties, and what relaxing it means

SOD_ENFORCED defaults to on: the person who prepares a document is not the person who commits it. Preparation and commitment sit with different roles.

Turning it off collapses maker permissions into checker permissions. A user who could previously only prepare can then also approve, issue and cancel. This is a legitimate configuration for a small business where the same person genuinely performs both functions and no separation is possible — but it is a control decision belonging to the customer's finance control owner, not a convenience for an implementation team frustrated by an approval step.

It is one decision for the whole company. It is set at the company tier only; a GSTIN override for it is refused with 400 FEATURE_SCOPE_NOT_ALLOWED. GSTIN overrides that already existed when this rule shipped are kept and still apply, so no registration's effective value changed with the release; they can be removed, and no new one can be added.

It locks when live work starts. The company is locked from its first live IRN, its first generated e-way bill or its first decided approval (approved or rejected; a cancelled approval is not a decision). Work on a registration whose GSP configuration is explicitly SANDBOX does not count. A company with no GSP configuration row at all has no recorded environment, so its work does count.

Change Before live work After live work
Turn it on (or remove a setting that relaxed it) Org Admin or Super Admin Org Admin or Super Admin, no reason needed
Turn it off (or remove a setting that kept it on) Org Admin or Super Admin, with a reason Super Admin only, with a reason and approvalRef. An Org Admin gets 403 SOD_LOCKED

Direction is judged by the effective value of each registration, not by which call was made: removing an old GSTIN override that enforced, under a company default of off, relaxes that registration and is locked like any other relaxation.

Turning it off needs a written reason (400 ACCESS_WIDENING_REASON_REQUIRED without one), from every caller, and your company's other Org Admins are emailed with it. The reason is kept in the control's Audit History and in the audit log as ACCESS_WIDENED. For a locked company a Super Admin must also send the customer's approval reference as approvalRef (3 to 120 characters; 400 SOD_APPROVAL_REF_REQUIRED without it). It is stored at the front of the reason in Audit History, written to the ACCESS_WIDENED entry as customerApprovalRef, and included in the email, which says Complifly made the change. It is a record, not a check. See Segregation of Duties.

Record the decision in writing. It is exactly the kind of setting an auditor asks about, and "it was easier during testing" is not an answer.

Governance mode

GOVERNANCE_MODE is STANDARD unless a Complifly Super Admin sets it to STRICT for the company. It changes exactly three things, all described in Elevated Access: who may lend emergency access and for how long (Standard: your Org Admin or Complifly, 24 hours; Strict: Complifly only, with your approval reference, 4 hours); whether Complifly support and platform engineers need a support window your Org Admin opened to read the company (Strict: yes); and whether giving someone the Org Admin or Super Admin role waits for a second approver (Strict: yes).

If the setting cannot be read the server behaves as Strict. A change is honoured on the server that received it at once and on others within 30 seconds. Moving from Strict to Standard needs no extra confirmation; ask Complifly to tell you when it is changed.

Invoice Generation Module rules

The IGM_* flags encode business rules the customer chooses, not statutory constraints:

Setting Decision it encodes
Credit rule Whether exceeding a customer's credit limit warns or blocks
Approval value threshold The value above which a second pair of eyes is required
Approval discount percentage The discount above which approval is required
Discount over maximum Whether an excessive line discount is refused or routed for approval
Approval engine Whether a multi-level workflow replaces the simple threshold gate

A threshold of 0 means the rule is off, not that everything requires approval.

Complifly Compass

COMPASS_ENABLED unlocks Compass for a registration. COMPASS_TIER then decides how far it may go:

  • retrieval — Compass finds the relevant documentation and returns cited extracts. It never calls a language model, so there is no per-answer cost. A question it finds nothing relevant for is declined rather than answered from general knowledge.
  • assisted — Compass additionally has a language model compose an answer from the extracts it retrieved. This is metered: a monthly allowance per registration and a daily cap per user. When the allowance is spent the Compass falls back to retrieval behaviour for the rest of the month — it does not stop working.

assisted needs a model credential

The assisted tier calls a language model, so it only works when ANTHROPIC_API_KEY is configured on the server (see Environment Variables). Without it, a tenant set to assisted silently gets retrieval behaviour — cited extracts, no composed answer. It never errors.

Compass only ever draws on documentation the signed-in user is entitled to see. It is not a route to content their role does not already grant.

Retrieval is the customer-facing tier. Everything that consumes a language model — the assisted tier, DB lookups on that tier, and the Compass Agent with its Quick and Deep modes — is switched on by Complifly. All five COMPASS_* flags are licensing flags: only a Complifly Super Admin can change them, and your administrators cannot enable model-backed answers themselves. There is no customer-facing AI spend control at present; usage beyond Retrieval is a commercial arrangement with Complifly. Turning COMPASS_ENABLED off is the way to disable Compass for a registration; it is enforced on the next request, and within 60 seconds at the latest.

Compass DB lookups

COMPASS_DB_LOOKUPS lets Compass answer a question that names one of your own documents — "why did INV-00042 fail its IRN?" — by reading that document's stored record: its IRN or e-Way Bill status, and the NIC error code and message if it failed. The answer is assembled from the stored fields and the matching error-guide entry; on the retrieval tier no language model is involved.

Every read is row-level-security scoped to the registration the question is asked under — the same boundary the rest of the product enforces. A user cannot use it to see another registration's documents, and a question that does not name a document Compass can find falls back to the normal documentation answer.

It needs COMPASS_ENABLED (or the Agent) on. On the assisted tier and in the Agent, the stored status and error text are sent to the model along with the question, which is why this is a separate switch from COMPASS_ENABLED.

Compass Agent

COMPASS_AGENT_ENABLED unlocks a different, heavier capability: an agent that investigates a problem over several steps, calling tools to read documentation and — for staff profiles — search the codebase and run read-only diagnostics. It is billed per token and is not part of the retrieval / assisted tiers.

Two things always hold: any tool that would write a file or run a command stops and asks a human to Confirm or Reject first, and the agent can only reach files a profile is explicitly granted (an end user's agent sees public guides and nothing else). Turning the flag off is an immediate per-registration disable, the same as COMPASS_ENABLED.

Who gets the Agent is a second setting, COMPASS_AGENT_AUDIENCE. It defaults to internal: only Complifly's own support, platform and super-admin profiles see the Agent, and the registration's own users get Retrieval. This is deliberate — you may want the Agent enabled so Complifly can investigate a ticket against your data, without offering your own staff a per-token tool whose value over Retrieval, for a non-engineer, is small. Set it to all when you want your org-admins and executives to have it too. Retrieval is never gated this way (it has no per-answer cost); nor is COMPASS_DB_LOOKUPS, which is its own data decision.

Plan & Limits: what happens at a limit

Five company-wide settings decide what happens when an administrator's action would take the company past what its plan allows: adding a registration, adding or reactivating a user, adding an ERP connection, or switching an optional module on. Each limit has its own setting, and every one is OFF unless Complifly sets it, so nothing changes for anyone by default.

Setting value Effect
OFF Nothing is checked and nothing is recorded
ALERT The action goes ahead. An excess beyond the grace band is recorded for Complifly
ENFORCE The action is refused with 409 ENTITLEMENT_LIMIT_REACHED (or ENTITLEMENT_NOT_INCLUDED for a module) once it would go past the limit and the grace band

What is never affected, whatever these say: generating an IRN or an e-way bill, receiving documents from an ERP, and the Complifly Agent connecting itself. Those are compliance document processing, and a commercial limit never stops them.

ENFORCE behaves as ALERT instead, so the action goes ahead and is recorded, in four cases: when Complifly staff add a user, registration or ERP connection for a customer; when the PAN is held by more than one company (the limit is shared, and refusing one company would tell it about another's use); when no limit is stated in the plan; and when the check cannot be completed. In practice only a customer's own administrator adding or reactivating a user can be refused. Switching an optional module on is done only by a Complifly Super Admin: if the plan says the module is not included they are refused unless they repeat the change with force and a written reason, which is recorded.

A limit of 1 has no grace band (the band is rounded down to whole units). Only a Complifly Super Admin changes these settings. See the help entries on the Operational Controls screen, and Platform Error Codes for the two refusals.

Where the flags are set

Every flag on this page is set on Admin & Logs > Operational Controls:

Tab Use it to
Company Defaults Set a flag for the whole company; reset it to the platform default
GSTIN Overrides Give one registration (or several, in one action) a different value; remove an override
Effective View See the value in force for one registration and which tier set it
Audit History See who changed what, when, and the reason given

Who may change which flag is set out in Who may change each flag. Each control on the screen is enabled only if the server would accept the change from you.

The screen is generated from the product's own catalogue of controls, so a flag cannot exist in the product without appearing there, and each control carries its own help.

Values are validated. A value the flag does not accept — text for a number, a number outside its range, an option it does not have — is refused with 400 INVALID_FEATURE_VALUE and nothing is stored.

One module still has no flag

DPDP is a licensed module with no per-GSTIN switch, and its routes carry no feature gate — only authentication. There is therefore no control for it under Operational Controls, and nothing that would enforce one if there were. TDS was in the same position until MODULE_TDS_ENABLED (2026-09-14) — see middleware/feature.middleware.js's requireOrgFeature for why TDS needed an org-scoped variant of the gate rather than the ordinary GSTIN-scoped one every other flag on this page uses.

Verify: Adding a DPDP_ENABLED control would require a requireFeature/requireOrgFeature gate on routes/dpdp/* first. A switch that writes a value nothing reads is worse than no switch: it reports success and changes nothing. H2

Validation

After changing a flag:

Check Method Pass condition
It reached the registrations you meant Operational Controls > Effective View, for each intended GSTIN The value is the one you set, and Source is the tier you set it at. A registration still showing the old value with source GSTIN has its own override
Change has propagated Make the next request Behaviour reflects the new value. Allow up to a minute if the cache store was unreachable
Module screens appear Navigate to the module Entry present and it opens
Role can actually use it Sign in as a real user of that module Controls are enabled, not greyed out. Module visibility and permission are separate gates
Automation behaves as intended With auto-generation on, ingest one document It generates without intervention. With it off, it waits
Segregation change is understood With enforcement off, sign in as a preparer They can now approve and issue. Confirm this is intended and recorded
Write-back is emitting With write-back on, process a new document An outbound event appears. Older documents produce nothing — by design
Approval thresholds fire Create a document above and below the threshold Above requires approval; below does not
Compass tier behaves With assisted, ask a question the docs cover; with retrieval, the same assisted composes an answer; retrieval returns cited extracts only
Decision recorded Operational Controls > Audit History Who changed it, when, old and new value, and the reason — especially for segregation of duties

Troubleshooting

Symptom Cause Action
Module enabled but no screen Set for the wrong company or GSTIN, or that GSTIN has its own override switching it off Effective View for that GSTIN shows the value in force and its source
Screen present, everything greyed out The user's role lacks the permissions Fix the role, not the flag. See Roles and Permissions
Automation not firing after enabling the module Automation is a separate flag from the module unlock Enable the automation deliberately
Automation firing on poor-quality documents Auto-generation enabled before validation quality was proven Turn it off, fix the feed, then re-enable
Write-back on but the ERP has nothing for older documents Emission is not retrospective Expected. Plan a separate seeding exercise
Approvals unexpectedly required A threshold set to a low value, or the approval engine enabled Review the IGM_* settings
Approvals never required Thresholds left at 0, which means off Set a real value
A preparer can suddenly approve Segregation of duties was relaxed Confirm this was a recorded decision. If not, re-enable it
One registration behaves differently from the rest It has a GSTIN override GSTIN Overrides lists how many each registration has. Usually intended, occasionally an oversight — remove the override to make it follow the company again
Changed the company default and one registration did not change That registration has its own override, which wins Remove the override, or change it
A flag cannot be set for one GSTIN (FEATURE_SCOPE_NOT_ALLOWED) It is company-wide only (MODULE_TDS_ENABLED, AGENT_ENABLED, SOD_ENFORCED, GOVERNANCE_MODE, and the other company-scoped controls) Set it under Company Defaults
An Org Admin cannot switch segregation of duties off (SOD_LOCKED) The company has started live work, so it is locked against relaxing Turning it on is still open. To relax it, a Complifly Super Admin needs a reason and the customer's approval reference
A company that is still testing is locked Its work is not recorded as sandbox: there is no SANDBOX GSP configuration row for its registrations Add the GSP configuration with environment = SANDBOX for the test period, or accept the lock and use the Super Admin path
An auditor asks who authorised relaxing segregation Search the audit log for ACCESS_WIDENED (reason, registrations, who was emailed) and open the control's Audit History Since 15 October 2026 a relaxation cannot be saved without a reason. Earlier changes show who and when only
Excel upload or Invoice Generation stopped working with no one touching it An ERP connection for that GSTIN just went ACTIVE — both flags close automatically Expected. Audit History for the GSTIN shows it; force it back on with a reason if a second source is genuinely intended
Change refused with NON_ERP_POSTING_BLOCKED A GSTIN the change reaches has an active ERP connection Leave the channel off, or ask a Complifly Super Admin to force it with a written reason
Change refused with APPROVALS_IN_FLIGHT A GSTIN the change reaches still has documents awaiting approval Clear them. Only a Complifly Super Admin can force it — which cancels them
403 FEATURE_WRITE_NOT_PERMITTED The flag is a licensing flag, or your role can only view Ask your Complifly contact
403 FORCE_NOT_PERMITTED Only a Complifly Super Admin may override a safety check Resolve what the check reported, or ask your Complifly contact
Compass gives short cited answers, never a composed one COMPASS_TIER is retrieval, or the monthly allowance is spent Confirm the tier; if assisted, the allowance resets at the start of the month
Compass declines a question It found no documentation relevant to it Expected — it does not answer from general knowledge. Rephrase toward the task, or search the Help Centre