Case study, climate and certification technology

From unverifiable credit claims to a cryptographically signed carbon registry

A global testing, inspection and certification authority verified greenhouse-gas reduction projects and issued carbon credits through spreadsheets, emailed PDFs and manual review, with no separation of duties, no tamper-evidence, and no way for a third party to prove a credit was genuine.

Carbon markets
Cryptographic verification
Serverless, event-driven
Maker and checker audit

Sealed at issuanceRS256, in a managed vault

0

capability domains in the function tier

0

architecture zones, split by responsibility

0

decisions behind what it can be trusted to do

0

signing keys held in application code

The client

An international testing, inspection and certification body that validates greenhouse-gas reduction projects and issues the carbon credits those projects earn.

The challenge

No tamper-evidence, no separation of duties, and no way for a counterparty to check a credit short of calling the authority.

The platform

A dual-workflow registry: the customer ingests, an auditor approves through a defined lifecycle, and issuance seals the credit.

The outcome

Every credit signed in a managed key vault, with a public, hash-addressable opinion any third party can open without an account.

The client

A verification authority issuing credits it could not later prove

When they certify that a project removed a ton of CO2e, buyers, regulators and registries treat it as fact.

The client is an international testing, inspection and certification body that validates greenhouse-gas emission-reduction projects and issues the carbon credits those projects earn. Their name carries the weight.

But the process behind the signature was manual. Project documents arrived by email. Emission calculations lived in spreadsheets. Credits were recorded in disconnected files, and the verification opinion that vouched for a credit was a PDF, reproducible by anyone with the template.

The authority of the brand rested on evidence the system itself could not defend.

The challenge

A credit is only as good as the proof behind it

Carbon credits are financial instruments. A buyer retires them against emissions targets; an auditor may challenge them years later.

The moment a credit cannot be traced back to a validated project and an accountable reviewer, its value is in question. Three gaps made every issued credit a latent liability.

Gap one

No tamper-evidence

A credit record was a row in a document. Nothing proved it had not been altered after issuance, and nothing let an outside party confirm it independently.

Gap two

No separation of duties

The same manual process captured a project and blessed its credits. There was no system-enforced boundary between the person entering data and the auditor approving it.

Gap three

No independent verifiability

A counterparty who received a credit had no way, short of contacting the authority, to check that the verification opinion was authentic and unchanged.

A certification body's product is trust. If the platform that issues its credits cannot prove they are genuine, the brand is underwriting risk it cannot see.

The mandate

Four jobs the platform had to do

  1. Ingest with structure

    Let customers register projects, sites and credits as validated data objects, with documents attached, emission factors captured and provenance recorded, rather than as free-form files.

  2. Enforce a maker and checker workflow

    Route every project and credit through an auditor who moves it along a defined lifecycle, so approval is a deliberate, attributable act and never an assumption.

  3. Sign every credit

    Seal each issued credit and transaction with a cryptographic signature that makes tampering detectable and issuance non-repudiable.

  4. Make verification public

    Publish a read-only, hash-addressable verification opinion for every credit, so any third party can confirm authenticity without an account and without calling the authority.

The solution

A dual-workflow registry, gated by audit and sealed by signature

Nothing becomes a live credit by default. A credit is issued only after its parent project is approved.

The platform splits the world into two mirrored workflows. On the customer side, an organisation ingests projects with their emission-reduction methods and supporting documents, the sites those projects run on, and the carbon credits they generate. On the auditor side, a reviewer sees the same records and walks them through a controlled lifecycle.

At the moment of issuance the platform seals the credit: a cryptographic signature is applied, a PDF receipt is generated, and a public verification opinion, addressable by a content hash, is produced. A separate machine-to-machine tier lets partner systems submit projects, sites and sales programmatically, and receive signed callbacks when an audit completes.

The audit lifecycle

Inserted
Submitted
Started
Approved
or
Not approved
with
A revision loop back to the customer

What each role sees

Customer

A registry of projects, sites and credits filtered to their tenant. A project carries its methods, emission factors, validity dates and documents, and a credit is computed from its typology and emission factor.

Attachments and transaction certificates upload alongside the record, and everything submits for audit as one structured object.

Auditor

The same records in a validation queue, with a read-only detail view and every attachment downloadable as a bundle.

The reviewer moves the record along its lifecycle: start, approve, reject, or send back for revision with notes. Approval is the act that unlocks credit issuance.

Transaction manager

Carbon-credit sales and the customer registry. Sales consume credits oldest first, decrementing available balances.

Each transaction is sealed and given its own verification opinion, so a retired credit is as provable as an issued one.

Credits map to recognised methodologies

Reference standard, for example ISO 14064
Standard programme, such as Verra or Gold Standard
Certificate details recorded on the project

Architecture

Serverless, event-driven, and split by responsibility

A suite of independently deployable serverless functions, each owning one capability, behind a role-aware API surface.

Human users reach the platform through a single-page application authenticated against a managed identity provider; partner systems reach a parallel machine-to-machine surface authenticated per tenant. State lives in a document database, evidence in object storage, and signing keys never leave a managed vault.

End to end

A request enters through the web app or the machine-to-machine tier, is authenticated and checked against the user's role and tenant, and is handled by the function that owns that capability. Writes persist to the document store and object storage. An audit decision drops a message on a queue, which a separate function picks up to send notification emails and fire partner webhooks, so the reviewer's click and the downstream side-effects are decoupled.

Seven zones, seven responsibilities

Web application
Role-based single-page app for customers, auditors and transaction managers; embedded analytics dashboards; multi-language, white-labelled UI.
Identity and access
Managed cloud identity provider (OIDC and B2C) with per-tenant roles and feature-level permissions; tokens attached to every API call.
Function tier, human
Around 18 serverless functions covering credit, project, site, customer, tenant, transaction and audit-manager capabilities, split into ingestion against audit-manager endpoints.
Function tier, M2M
Parallel machine-to-machine endpoints for partner ingestion of projects, sites, credits and sales, authenticated by tenant header and vault-held secrets.
Data and evidence
Document database with segregated containers per entity, isolated by tenant, plus object storage for documents, certificates and signed PDF receipts.
Async and notify
Storage queue and a queue-triggered function that sends audit-decision emails and posts webhooks to external partner systems.
Trust services
Managed key vault performing all cryptographic signing (RS256), and a public verification site serving hash-addressable, read-only opinions.

Capabilities at a glance

The function tier is not one monolith. It is a set of capability-scoped services, each split between a human surface and, where partners integrate, a machine-to-machine one.

Carbon credits
Issue, manage and audit-review credits; bundle attachments for download
Human + M2M
Projects
Register projects, their methods and documents; drive the audit lifecycle
Human + M2M
Sites
Register operational sites; audit and suspend them
Human + M2M
Sales transactions
Record credit sales; allocate against balances oldest first
Human + M2M
Customer registry
Maintain buyer organizations
Human
Tenant registry
Organization profiles and their audit workflow
Human
Transaction manager
Sales lookup and certificate download
Human
Verification opinion
Public, read-only, hash-addressable proof pages
Public
Credential manager
W3C Verifiable Credentials in JSON-LD
Human / partner
Audit manager
Maker and checker approval endpoints, per domain
Auditor

Inside the build

Six decisions that shaped what the platform can be trusted to do

  1. Sign in the vault, never in the app

    The private key that seals a credit never enters application memory. Every signature is produced by a managed key vault performing RS256; the service holds only a reference.

    A leaked application server cannot forge a credit, and issuance is non-repudiable by design: the authority can always prove a credit was sealed by its own key.

  2. Separate ingestion endpoints from audit manager endpoints

    Data entry and approval are different functions with different permissions, not two states of one screen.

    The maker and the checker act through distinct endpoints governed by distinct roles, so separation of duties is enforced by the architecture rather than by policy or good behaviour.

  3. Serialize deterministically before signing

    Before a record is signed, its JSON is serialized with sorted keys, so the same data always produces the same bytes and therefore the same verifiable signature, whichever service or language reads it.

    Third parties can re-derive and check the signature independently, which is the whole point of a public verification opinion.

  4. Make verification opinions public and hash-addressable

    A credit's proof is not behind a login. Each verification opinion is a read-only page addressed by a SHA-256 hash of its evidence.

    Anyone holding the link can confirm the credit is authentic and unaltered without an account and without contacting the authority, which turns trust from a phone call into a URL.

  5. Decouple the audit decision from its consequences

    When an auditor approves or rejects a project, the platform does not send emails and call partner webhooks inline. It drops a message on a queue and a separate function delivers the notifications.

    The reviewer's action stays fast and reliable even when a downstream partner endpoint is slow or down, and delivery can be retried without re-running the decision.

  6. Validate at the schema boundary

    Every request is checked against a typed schema before it reaches business logic: dates must be ISO-8601, emails and VAT numbers must be well formed, and conditional rules fire where the data demands them. Certificate fields, for instance, are required only when a project is marked validated.

    Bad data is turned away at the edge, never discovered later inside a signed record.

End to end

The life of a carbon credit

One credit, traced from registration to independent verification. Every step below is a capability in the platform, not a manual handoff.

  1. A customer registers a project

    Its emission-reduction methods, emission factors and supporting documents. It enters the audit queue as inserted.

  2. An auditor moves through the lifecycle

    Submitted, then started, then approved, with a revision loop back to the customer when data needs correcting. Only a validated project can issue credits.

  3. The customer issues a credit against the approved project

    The platform computes it from the project's typology and emission factor.

  4. At issuance the credit is sealed

    Its record is serialized deterministically, signed in the managed key vault with RS256, and a PDF receipt is rendered server-side.

  5. A public verification opinion is published

    Read-only, and addressed by a SHA-256 hash of its evidence.

  6. When the credit is sold, the sale consumes it oldest first

    The balance is decremented and the transaction is sealed with its own verification opinion.

  7. Any third party opens the opinion URL and confirms the signature

    No account, and no call to the authority.

Every credit now carries its own proof. A buyer does not have to trust the spreadsheet. They can verify the signature.

Security and reliability

Trust the platform must earn, not assert

Because the product is a credit others will rely on, the controls are not add-ons. They are the same mechanisms that make a credit provable.

Authentication
Managed cloud identity (OIDC and Azure AD B2C); a token is attached to every API call.
Authorization
Per-tenant roles and feature-level permissions; route guards gate the UI and endpoints gate the API.
Secrets and keys
Signing keys and per-tenant secrets held in a managed key vault, never in application code.
Non-repudiation
Every credit and transaction is signed with RS256 over a deterministic serialization.
Input validation
A typed schema boundary (ISO-8601 dates, email and VAT formats, conditional rules) rejects bad data at the edge.
Tenant isolation
Data is segregated per tenant across document-store containers.
Separation of duties
Distinct ingestion and audit-manager endpoints keep maker and checker apart.
Fault tolerance
Audit side-effects run through a queue, decoupled from and retriable independently of the reviewer's action.

Outcomes

Before and after, measured the same way

The platform's value is structural: trust, traceability and separation of duties that the previous manual process could not provide.

Credit provenance
A row in a spreadsheet or PDF
A cryptographically signed record
Tamper-evidence
None, silent edits possible
RS256 signature; alteration detectable
Independent verification
Call the authority
Public, hash-addressable opinion (SHA-256)
Separation of duties
Same manual process for entry and approval
System-enforced maker and checker workflow
Audit trail
Ad hoc, in email and files
Defined lifecycle with timestamps per state
Partner onboarding
Manual data exchange
M2M API with per-tenant authentication
Key custody
Implicit or manual
Signing keys confined to a managed vault
Multi-organization
Single-org spreadsheets
Multi-tenant isolation, white-labelled UI

Delivered, against what is still a target

The capabilities below are delivered and verifiable in the codebase. The business metrics are the targets the platform is built to move, and they are published here as targets, to be measured once operational data is available.

Every issued credit cryptographically signed with RS256Capability in production code

Delivered

Public, hash-addressable verification opinionsSHA-256 addressable

Delivered

System-enforced maker and checker audit workflowSeparate ingestion and audit endpoints

Delivered

Signing keys never exposed to application codeAll signing in a managed vault

Delivered

Machine-to-machine partner integration tierPer-tenant authenticated endpoints

Delivered

Reduction in credit-verification turnaround timeTo be measured post go-live

Target

Elimination of unverifiable or disputed creditsTo be measured post go-live

Target

Partner systems onboarded through the M2M tierTo be confirmed with the client

Target

Beyond the measurable, and already true of the delivered system

An unverifiable manual process became a system-enforced maker and checker workflow.

Credit authenticity is checkable by any third party, without contacting the issuer.

Issuance is a non-repudiable, tamper-evident act. A credit can be defended after the fact.

Disconnected spreadsheets and PDFs consolidated into one multi-tenant registry.

What comes next

Deliberately left for later

Decentralized identity anchoring

Extend the signed-credential model with decentralized identifiers, so credits are verifiable against a public trust root rather than only the authority's own site.

Registry interoperability

Map issued credits to external carbon-standard registries for cross-registry recognition and retirement.

Analytics depth

Grow the embedded dashboards into portfolio-level KPIs: issuance, retirement, audit throughput, and reduction impact by programme and geography.

ML-assisted review

Flag anomalous emission calculations or documentation gaps for auditors before manual review, shortening the audit lifecycle.

What the repository already carries

Beyond the running platform, the codebase carries the scaffolding of a maintained delivery pipeline: a frontend unit-test setup with a coverage configuration, a CI pipeline definition, and a container build for the backend. These show how the system is built and shipped. Specific coverage levels or deployment cadence are not asserted here.

The stack, end to end

Frontend
Angular, NgRx, Angular Material, BootstrapRole-based single-page app, state management, UI
Auth
Managed cloud identity (OIDC and B2C)Single sign-on, per-tenant roles and feature permissions
Analytics
Embedded BI dashboardsReal-time issuance and audit KPIs
Localization
ngx-translateMulti-language UI
Backend
Python serverless functionsAround 18 capability-scoped HTTP and queue functions
Data
Document database, per-entity and per-tenant containersCredits, projects, sites, sales, registries
Evidence
Object and blob storageDocuments, certificates, signed PDF receipts
Messaging
Storage queue and a queue-triggered workerAsynchronous audit notifications and partner webhooks
Trust
Managed key vault (RS256) and a public verification siteSigning, non-repudiation, public proof
Documents
Server-side HTML to PDF renderingSigned receipts and verification documents
Standards
W3C Verifiable Credentials (JSON-LD)Portable, signed credential format
Next step

Could a buyer verify your certificate without calling you?

If the answer is no, the proof lives in your process rather than in your product. We can walk your issuance path end to end in a single session and show you where the evidence stops.