1. Add a Custom Column to the Sales Invoice Table
Create a Setup Upgrade Schema to add a custom column.You Can use the db_schema.xml as well to create the column.
Create app/code/Vendor/Module/Setup/UpgradeSchema.php
<?php namespace Vendor\Module\Setup; use Magento\Framework\DB\Ddl\Table; use Magento\Framework\Setup\UpgradeSchemaInterface; use Magento\Framework\Setup\ModuleContextInterface; use Magento\Framework\Setup\SchemaSetupInterface; class UpgradeSchema implements UpgradeSchemaInterface { public function upgrade(SchemaSetupInterface $setup, ModuleContextInterface $context) { $setup->startSetup(); if (version_compare($context->getVersion(), '1.0.1', '<')) { $connection = $setup->getConnection(); $tableName = $setup->getTable('sales_invoice'); if (!$connection->tableColumnExists($tableName, 'custom_column')) { $connection->addColumn( $tableName, 'custom_column', [ 'type' => Table::TYPE_TEXT, 'nullable' => true, 'length' => 255, 'comment' => 'Custom Column for Invoice' ] ); } } $setup->endSetup(); } }
Run the Upgrade Command
php bin/magento setup:upgrade
2. Create an Extension Attribute for the Invoice
Extension attributes allow you to add custom fields to Magento's core APIs.
Create app/code/Vendor/Module/etc/extension_attributes.xml
<?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Api/etc/extension_attributes.xsd"> <extension_attributes for="Magento\Sales\Api\Data\InvoiceInterface"> <attribute code="custom_column" type="string"/> </extension_attributes> </config>
3. Create a Plugin to Handle Extension Attribute Save
We need a plugin to save the data in the custom column when an invoice is created via REST API.
Create app/code/Vendor/Module/Plugin/InvoiceRepositoryPlugin.php
<?php namespace Vendor\Module\Plugin; use Magento\Sales\Api\Data\InvoiceExtensionFactory; use Magento\Sales\Api\Data\InvoiceInterface; use Magento\Sales\Api\InvoiceRepositoryInterface; use Magento\Framework\Api\SearchResultsInterface; class InvoiceRepositoryPlugin { protected $extensionFactory; public function __construct(InvoiceExtensionFactory $extensionFactory) { $this->extensionFactory = $extensionFactory; } /** * Load custom column into invoice extension attribute */ public function afterGet( InvoiceRepositoryInterface $subject, InvoiceInterface $result ) { $extensionAttributes = $result->getExtensionAttributes() ?? $this->extensionFactory->create(); $result->setExtensionAttributes($extensionAttributes); $extensionAttributes->setCustomColumn($result->getData('custom_column')); return $result; } /** * Load custom column into invoice extension attributes in getList */ public function afterGetList( InvoiceRepositoryInterface $subject, SearchResultsInterface $searchResults ) { foreach ($searchResults->getItems() as $invoice) { $this->afterGet($subject, $invoice); } return $searchResults; } /** * Save custom column from extension attribute */ public function beforeSave( InvoiceRepositoryInterface $subject, InvoiceInterface $invoice ) { $extensionAttributes = $invoice->getExtensionAttributes(); if ($extensionAttributes && $extensionAttributes->getCustomColumn()) { $invoice->setData('custom_column', $extensionAttributes->getCustomColumn()); } } }
4. Expose the Extension Attribute in di.xml
Create app/code/Vendor/Module/etc/di.xml
<?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework/ObjectManager/etc/config.xsd"> <type name="Magento\Sales\Api\Data\InvoiceInterface"> <plugin name="add_custom_column_invoice_repository_plugin" type="Vendor\Module\Plugin\InvoiceRepositoryPlugin" sortOrder="10"/> </type> </config>
5. Verify the REST API
Now, when you fetch an invoice via API, your custom column will be included.
GET Invoice API Example
GET /rest/V1/invoices/:invoice_id
Response Example
{ "entity_id": 10, "increment_id": "100000001", "custom_column": "Custom Data", "extension_attributes": { "custom_column": "Custom Data" } }
POST Invoice API Example (Save Custom Data)
POST /rest/V1/invoices
Request Body
{ "entity": { "order_id": 1, "extension_attributes": { "custom_column": "My Custom Value" } } }
6. Flush Cache & Test
Run:
php bin/magento cache:flush
Then test the API via Postman or cURL.