Skip to main content
Türkiye e-Arşiv & e-Fatura for ERPNext — A build-to-order Frappe app that turns an ERPNext Sales Invoice into the correct Tür — 1/1Illustrative preview

A build-to-order Frappe app that turns an ERPNext Sales Invoice into the correct Türkiye document

— e-Fatura for GİB-registered buyers, e-Arşiv for everyone else — with tax mapping, rejection and correction handling, and a compliant archive.

ECOSIRE builds, installs and supports it for your v15 or v16 site.

What is Türkiye e-Arşiv & e-Fatura for ERPNext?

A build-to-order Frappe app that turns an ERPNext Sales Invoice into the correct Türkiye document — e-Fatura for GİB-registered buyers, e-Arşiv for everyone else — with tax mapping, rejection and correction handling, and a compliant archive. ECOSIRE builds, installs and supports it for your v15 or v16 site. Built to order by ECOSIRE for ERPNext v15, v16 — indicative price from $999.00 USD; request a quote for a scoped proposal.

Key Features

Automatic document-type resolution on `Sales Invoice` submit: e-Fatura for buyers on the GİB registered-user list, e-Arşiv for everyone else, decided from Customer master data rather than manual selection
`Turkey e-Invoice Settings` single DocType for company identifiers (VKN/TCKN), tax office, gateway or integrator endpoint, and separate test/production credentials stored in `Password` fieldtype
`Turkey e-Invoice Document` DocType as the durable per-invoice record: resolved type, scenario, serialized payload, gateway identifier, lifecycle state and full response history
Custom fields on `Customer` and `Address` for identifier type and value, registered-user status and postbox/alias, so routing is driven by master data and reused across every invoice
`validate` doc event blocks submission on missing or malformed identifiers, incomplete addresses, and lines with no resolvable tax rate or exemption reason — naming the specific failing field
Tax mapping built from native `Item Tax Template` and `Sales Taxes and Charges`, including zero-rate and exemption-reason handling, so no parallel tax configuration is maintained
Transmission enqueued via `frappe.enqueue` on `on_submit` — a slow or unreachable gateway never blocks the user's submit or times out the request
Scheduler event polls for acceptance, rejection and application-response messages, writing state changes back onto the linked document automatically
Rejection handling with a controlled correction workflow: the original stays archived and immutable, a linked corrective document is raised, and the chain is traversable from either end
`on_cancel` guard that refuses to cancel an invoice already accepted downstream and routes the user to the correction path instead of orphaning a live document
Jinja print format producing the human-readable invoice from the same posting as the machine payload, so the two representations cannot diverge
Compliant archiving: both representations attached as `File` records with checksums, retrievable on demand and verifiable as unaltered
Whitelisted methods (`@frappe.whitelist()`) for retry, status refresh and archive retrieval — available from the desk and over the Frappe REST API for portal or middleware integration
Role profile separating finance issuers from a read-only auditor role, using Frappe's native permission and document-level access model
Client script on `Sales Invoice` showing resolved document type and live gateway status inline on the form the user already works in
Built and tested against Frappe/ERPNext v15 and v16, packaged as a standard installable app with no core file modifications

Built to order, done for you

No DIY setup — a working app, built, installed and supported by ECOSIRE.

  1. 1

    You order

    Start with a one-time build price. We scope it with you at kickoff.

  2. 2

    We build & install

    ECOSIRE builds, configures and installs it on your ERPNext.

  3. 3

    Go live + support

    You go live in about one working week, with two weeks of go-live support. Defects in the code we deliver are fixed free of charge.

Technical Specifications

ERPNext Compatibility
—
License
Licence confirmation required
Python Requirement
Python 3.10+
Database
MariaDB 10.6+

About this Product

Finance teams invoicing in Türkiye carry a split obligation that ERPNext core does not model. A buyer registered on the GİB e-Fatura user list must receive an e-Fatura routed through the registered-user channel; every other buyer — domestic retail, unregistered companies, and typically export scenarios — must receive an e-Arşiv, reported on a different cadence and retained under different rules. ERPNext gives you a Sales Invoice, an Item Tax Template and a print format. It does not know which of the two document types a given customer requires, does not carry the exemption and scenario codes the profile expects, cannot receive a buyer's rejection, and has nowhere structured to keep the machine-readable original that an audit will actually ask for. The result is the pattern we see repeatedly: invoices posted in ERPNext, then re-keyed into a portal or an integrator's own screen, with the two systems drifting apart by month-end.

We build a proper Frappe app — its own repository, its own module, installed with bench get-app and bench --site <site> install-app — that makes ERPNext both the system of record and the point of issue. A Turkey e-Invoice Settings single DocType holds company-level configuration: tax office, VKN/TCKN identifiers, integrator or gateway endpoint and credentials (stored as Password fieldtype, never plain text), a test-versus-production environment toggle, and the numbering series reserved for each document type. A Turkey e-Invoice Document DocType is created per outgoing invoice and is the durable record: resolved document type, scenario, serialized payload, returned identifier and timestamps, current lifecycle state, and every response received. Customer-side data lives on custom fields against Customer and Address — identifier type and value, registered-user status, and the alias or postbox where one applies — so the routing decision is made from master data rather than from a spreadsheet a controller maintains on the side.

The flow hangs off hooks.py doc events rather than a button someone must remember to press. Sales Invoice validate runs the completeness checks — identifier present and well formed, the address fields the profile requires, every line resolving to a tax rate and, where zero-rated, to an exemption reason — and blocks submission with a specific message instead of letting a malformed document reach the gateway. on_submit resolves the correct document type from the customer's registered status, builds the payload from ERPNext master data (Item Tax Template, Sales Taxes and Charges, UOM, currency and exchange rate), and enqueues transmission through frappe.enqueue so a slow or unavailable gateway never blocks a user's submit. on_cancel refuses to cancel a document already accepted downstream and directs the user to the correction path instead. A scheduler event declared in hooks.py polls for state changes — acceptance, rejection and application-response messages — and writes them back onto the Turkey e-Invoice Document, so a buyer's rejection surfaces in ERPNext as a task with an owner rather than as an email nobody opened. Rejection then opens a controlled correction workflow: the original stays intact and archived, a linked corrective document is raised against it, and the chain from original to correction is queryable from either end.

One posting produces both faces of the invoice. The machine-readable payload goes to the gateway and is stored verbatim on the document record; the human-readable rendering is a Jinja print format carrying the mandated visual elements, generated from the same data so the two can never disagree. Both are attached as File records against the Turkey e-Invoice Document with a checksum, giving you an archive that can be produced on demand and verified as unaltered. Access follows Frappe's permission model: a Turkey e-Invoice User role profile for the finance team who issue and correct, and a read-only auditor role that can retrieve archived originals without touching live invoicing. Whitelisted methods (@frappe.whitelist()) expose retry, status refresh and archive retrieval to the desk and, where you need it, over the Frappe REST API so a portal or middleware can query invoice status without a database login. A client script on Sales Invoice shows the resolved document type and live status inline, so the person issuing sees the outcome on the form they already work in.

This is build-to-order, not a marketplace download. We start with a scoping call — your GİB registration position, which integrator or gateway you use or intend to use, your Frappe/ERPNext version (v15 or v16), the scenarios you actually issue, and how corrections are handled today. We then build against your site, install on your staging bench first, and run UAT with your own customers and invoice patterns in the gateway's test environment before anything touches production. Typical delivery is one working week from confirmed scope. You receive the full source repository — your code, on your git remote, with no obfuscation and no runtime licence phone-home — plus installation and configuration documentation, a user guide, a live training session for the finance team, and a post-go-live support window for defects and regulatory adjustments.

What you get

  • Complete, unobfuscated Frappe app source code built for your Frappe/ERPNext version (v15 or v16), with no runtime licence check
  • Installation on your bench (staging first, then production) and full configuration of settings, customer master fields, roles and numbering series
  • Technical documentation: DocType reference, `hooks.py` doc events and scheduler jobs, whitelisted API methods, and gateway integration points
  • End-user guide covering issuing, status monitoring, rejection handling, the correction workflow and archive retrieval
  • Live training session for your finance and accounting team, recorded for onboarding future staff
  • UAT on staging against the gateway test environment using your own customers and invoice patterns, with a documented rollback plan
  • Handover of the private git repository to your organisation's remote, including branch and tag history
  • Post-go-live support window for defect fixes and adjustments arising from regulatory or gateway changes

Who this is for

Finance Manager at a Türkiye-based company on ERPNext

Responsible for every invoice leaving the business being the right document type, correctly taxed and accepted. Wants issuing to happen once, inside ERPNext, with rejections visible as work items instead of being discovered at month-end reconciliation.

Accounting and compliance lead

Owns the audit position. Needs the machine-readable original and its human-readable counterpart retained together, verifiably unaltered and retrievable per invoice — plus a clear, traceable link from any corrective document back to the original it replaces.

ERP manager or internal Frappe developer

Maintains the bench and every app on it. Wants a standard Frappe app with no core patches, doc events instead of monkey-patching, real DocTypes instead of JSON blobs, and the source in their own repository so they can read, extend and upgrade it from v15 to v16.

Multi-entity group CFO with a Türkiye subsidiary

Runs several companies on one ERPNext site and needs the Türkiye entity locally compliant without forking the group's chart of accounts, tax templates or reporting — company-scoped settings and identifiers, group-wide consistency.

How Türkiye e-Arşiv & e-Fatura for ERPNext Compares

CriterionECOSIRECustom BuildCompetitorERPNext Native
Document-type routing (e-Fatura vs e-Arşiv)Resolved automatically on submit from the customer's registered-user status held in master dataAchievable, but the routing rules and their edge cases are yours to specify, build and re-testUsually supported, though often as a manual field on the invoice rather than master-data drivenNo concept of either document type; ERPNext produces one generic Sales Invoice
Fit to your invoice scenariosScoped against your actual scenarios and gateway before a line is written, then tested on your dataExactly your fit, at the cost of a full internal discovery, build and QA cycleFits the vendor's assumed common case; anything outside it needs a fork or a feature requestGeneric invoicing only
Rejection and correction handlingScheduler polls responses, surfaces rejections in ERPNext, and raises a linked corrective document with a traceable chainFrequently deprioritised in phase one and bolted on after the first live rejectionVaries widely; status is often visible but the correction chain is not modelledNo inbound status channel at all
Archiving and audit evidenceMachine and human representations from one posting, attached with checksums and retrievable per invoiceDepends entirely on how thoroughly retention was specified up frontPayload usually stored; verifiable retention and auditor-scoped access are less commonPrint format only, regenerated on demand rather than retained as issued
Source code and lock-inFull unobfuscated source handed to your git remote, no runtime licence checkYours outright, and yours to maintain aloneOften licence-keyed or partially obfuscated, with upgrades tied to the vendorOpen source, but nothing here to own
Frappe engineering qualityReal DocTypes, `hooks.py` doc events, scheduler jobs, whitelisted methods, role profiles, zero core patchesAs good as the team building it; in-house first Frappe apps commonly patch coreGenerally sound, but internals are not always visible for reviewCore-quality by definition, minus the required functionality
Version support and upgrade pathBuilt and tested for v15 and v16, with upgrades covered under a maintenance arrangementEvery Frappe major version becomes an internal migration projectThe vendor's release cadence dictates when you can upgrade your benchUpgrades with ERPNext, but the compliance gap upgrades with it
Time to a working systemone working week from confirmed scope, including staging UAT and a rollback planTypically several months once discovery, build, gateway testing and QA are countedFast to install; slow once the gaps against your scenarios emergeImmediate, and immediately non-compliant for Türkiye

Frequently Asked Questions about Türkiye e-Arşiv & e-Fatura

How long does delivery take?

This is build-to-order: there is no instant download. Typical delivery is one working week from confirmed scope, measured from the point where we have agreed the document scenarios, your gateway or integrator, your Frappe/ERPNext version and your correction process. We install on staging and run UAT with you before anything reaches production. Scope touching unusual scenarios or a gateway we have not integrated before is quoted with its own timeline rather than squeezed into that window.

What happens with support and updates after go-live?

The engagement includes a post-go-live support window for defects and for adjustments arising from regulatory or gateway changes during that period. You hold the full source in your own git repository, so your team can read and extend it at any time. Beyond the included window we offer an ongoing support and maintenance arrangement covering GİB or integrator format changes, Frappe/ERPNext version upgrades and enhancements — quoted separately once we know your invoice volume and the environments involved.

Do we need a specific e-invoicing integrator or gateway?

No. The transmission layer is built against whichever GİB-accredited integrator or private integrator you already use or plan to use, and the endpoint and credentials are configuration rather than code. If you have not chosen one yet, we scope against the candidate you shortlist. Test and production environments are separate settings, so you can point at the gateway's test environment throughout UAT and switch by configuration at go-live.

Does this work on Frappe Cloud, self-hosted, or ERPNext v15?

It is a standard Frappe app installed with `bench get-app` and `bench --site install-app`, targeting Frappe/ERPNext v15 and v16, and it modifies no core files. Self-hosted benches and Frappe Cloud private benches both work. On Frappe Cloud, custom apps require a private bench — we confirm your hosting arrangement during the scoping call so there are no surprises at install time.

What happens when a buyer rejects an e-Fatura?

The scheduler job polls for application responses and writes the rejection onto the linked `Turkey e-Invoice Document`, so it appears in ERPNext as a state change with an owner rather than as an email in someone's inbox. The original invoice is not cancelled or altered — it stays archived exactly as issued. Instead, the correction workflow raises a linked corrective document against it, and the chain from original to correction is queryable from either direction for audit.

Can our own developers modify it later?

Yes. You receive the complete, unobfuscated source in a repository on your own remote, with no runtime licence check and no phone-home. The app is built the way a Frappe app should be — real DocTypes, `hooks.py` doc events, scheduler events, whitelisted methods and client scripts — precisely so a Frappe developer can read it, extend it and carry it through version upgrades without depending on us.

How does this interact with our existing ERPNext tax setup?

It reads your existing configuration rather than duplicating it. Rates and exemptions come from your `Item Tax Template` and `Sales Taxes and Charges` rows, with additional fields only where the Türkiye profile requires something ERPNext has no place for — such as an exemption reason code on a zero-rated line. During scoping we review your current tax templates and tell you exactly which need enrichment before go-live.

Request a quote

Türkiye e-Arşiv & e-Fatura

A build-to-order Frappe app that turns an ERPNext Sales Invoice into the correct Türkiye document — e-Fatura for GİB-registered buyers, e-Arşiv for everyone else — with tax mapping, rejection and correction handling, and a compliant archive. ECOSIRE builds, installs and supports it for your v15 or v16 site.

  • Automatic document-type resolution on `Sales Invoice` submit: e-Fatura for buyers on the GİB registered-user list, e-Arşiv for everyone else, decided from Customer master data rather than manual selection
  • `Turkey e-Invoice Settings` single DocType for company identifiers (VKN/TCKN), tax office, gateway or integrator endpoint, and separate test/production credentials stored in `Password` fieldtype
  • `Turkey e-Invoice Document` DocType as the durable per-invoice record: resolved type, scenario, serialized payload, gateway identifier, lifecycle state and full response history
  • Custom fields on `Customer` and `Address` for identifier type and value, registered-user status and postbox/alias, so routing is driven by master data and reused across every invoice

Request a Quotation

Tell us about your Türkiye e-Arşiv & e-Fatura requirements and we'll send pricing, licensing options and a tailored proposal — usually within one business day.

No payment now. This sends a quote request to our team — we'll follow up by email with pricing and next steps.