Tag: partial fill

  • Blog
  • Tag: partial fill

When 10,000 Tonnes Becomes 3,842: Engineering Carbon Credit Partial Fill Settlement

A carbon exchange can display a beautiful order book and still have fundamentally broken trading infrastructure. The real test begins when a buyer submits an order for 10,000 tonnes, but the matching engine can only execute 3,842 tonnes across multiple eligible sellers. What happens to the remaining 6,158 tonnes? More importantly: This is where carbon credit partial fill settlement becomes an architecture problem rather than a UI feature. Traditional exchange infrastructure already understands partial fills. Carbon markets make the problem harder because the underlying asset isn’t simply “10,000 units.” A carbon order can depend on vintage, methodology, geography, project, registry, authorization status, corresponding adjustment, removal/reduction classification, co-benefits, eligibility rules and available inventory.That means the matching engine cannot simply ask: “Does price match?” It needs to ask: “Does price match and does this exact inventory satisfy the buyer’s eligibility constraints at execution time?” And settlement has to preserve that decision. Why Partial Fills Are More Complicated in Carbon Markets Consider this order: Order Parameter Buyer Requirement Quantity 10,000 tCO₂e Maximum price $18/t Registry Approved registry Vintage 2022–2025 Methodology Removal Geography Eligible jurisdictions Eligibility Corporate procurement criteria Time-in-force IOC The order enters the exchange. The engine finds: But Seller D’s inventory subsequently fails an eligibility check. The executable quantity is therefore 3,840 tonnes, not 8,340. That single change creates several state transitions. Order state NEW → PARTIALLY_FILLED → CANCELLED/EXPIRED Inventory state AVAILABLE → RESERVED → TRADED → SETTLED Settlement state PENDING → PARTIALLY_SETTLED → SETTLED Registry state TRANSFER_REQUESTED → CONFIRMED / FAILED A production platform must maintain these states independently without allowing them to contradict one another. That is the core challenge behind carbon credit partial fill settlement. 1. Start With the Matching Engine, Not Settlement Settlement problems are frequently symptoms of weak execution architecture. A robust carbon exchange should separate at least these logical layers: The important architectural principle is that matching creates an execution commitment; settlement fulfils that commitment.Settlement should not independently decide what was traded. If the settlement service recalculates eligibility or price independently from the matching engine, the platform can create discrepancies between: That is precisely what an exchange operator wants to avoid. Read: The Authorization Wall: How Custom Carbon Exchanges Must Architect for Article 6 Corresponding Adjustments 2. Eligibility Must Be Part of Matching A common architecture mistake is to treat eligibility as a front-end filter. For example: “Show the buyer only CORSIA-eligible credits.” That is not enough. The eligibility decision needs to survive all the way into execution. Suppose a buyer wants 5,000 tonnes of eligible inventory. The matching engine finds three lots: Seller Available Price Eligibility Executable A 1,200 $14.80 Yes 1,200 B 2,000 $15.10 Yes 2,000 C 3,000 $15.40 No 0 The engine should not match 5,000 tonnes and “sort out eligibility later.” The correct result is: 3,200 tonnes executable + 1,800 tonnes residual. This distinction becomes especially important when eligibility can change because of: For institutional trading, eligibility should therefore be represented as a versioned execution condition, not simply a UI attribute. 3. Order Types Determine Partial-Fill Behaviour Not every order should behave the same way. A carbon exchange may support several order instructions depending on its market design. Order Type Partial Fill? Typical Behaviour Limit Yes Execute available eligible quantity and leave residual Market Usually yes Execute against eligible liquidity subject to protection rules IOC Yes Fill available quantity immediately; cancel residual FOK No Execute only if entire eligible quantity can be filled GTC Yes Leave residual active until filled/cancelled/expired GTD Yes Remain active until specified expiry Smart Order Yes Route across eligible liquidity sources For carbon credit partial fill settlement, this distinction matters because the residual order is not necessarily another settlement. The platform must clearly separate: Executed quantity from Remaining quantity For example: The settlement engine must never accidentally treat the original 10,000 tonnes as the settled amount. 4. Partial Fill Is an Execution Event, Not an Order Event This is a subtle but critical architecture decision. One order can generate multiple executions. For example: The order has therefore executed: 3,842 tonnes But the exchange has three separate execution records. Each execution should have its own immutable identifiers and economic details. At minimum: This event-level structure is what makes downstream reconciliation possible. 5. The Smart Order Router Has a Different Job A smart order router should not simply find the cheapest credit. It should find the best executable eligible liquidity according to the exchange’s routing policy. Imagine: The router can evaluate: This becomes particularly valuable when the exchange operates as an aggregation layer rather than a single order book. The router should also preserve execution provenance. If 10,000 tonnes are sourced through four venues, the platform needs to know exactly where every tonne originated. 6. The Hard Part: Carbon Credit Partial Fill Settlement This is where many marketplace architectures become fragile. Suppose: Buyer order = 10,000 tonnes The engine executes: Total: 3,842 tonnes Settlement should operate on the 3,842-tonne execution set, not the original order. A simplified flow looks like: The settlement orchestrator should maintain a state machine rather than a single Boolean such as: settled = true A more useful model is: That distinction becomes essential when registry APIs are asynchronous or unreliable. 7. Registry Confirmation Should Not Be Treated as a Synchronous Assumption Carbon exchanges often depend on external registry infrastructure. The exchange might successfully execute a trade, but the registry transfer could: Therefore: Trade execution ≠ registry settlement. The platform needs a durable settlement workflow. For example: The exact ordering can vary depending on custody and counterparty-risk design, but the state transitions must be explicit. 8. Idempotency Is Mandatory Imagine the registry confirms a transfer. Your webhook receives the confirmation. The service processes it. Then the same webhook arrives again. If the system simply says: “Transfer confirmed → add 1,500 tonnes” you have a serious accounting problem. Instead, settlement events need unique evidence identifiers. For example: The settlement processor should verify whether that evidence has already been consumed. Conceptually: This is one of the most important