The Rossum extraction schema described is designed to satisfy common needs of the customers in the US. There is a separate schema for the Europe and APAC region. The difference between the two is mainly in handling of the taxation where Rossum uses line level taxation with Tax Codes to the Europe and APAC whilst the header level taxation without Tax Codes in the US (this schema).
ℹ️ Key (color coding of the fields in the schema)Captured fields - Fields that are extracted from the document using Rossum AI predictions and ORC reading.
Matching fields - Fields that are result of matching using master data maintained in the Rossum’s Master Data Hub. Majority of the datasets are replicated from Coupa directly.
Calculated/Manual fields - Fields that are calculated based on values of other fields or default values. Formula fields are fields that hold the business logic.
For details about the Coupa fields please refer to the API documentation:
Header Fields
Name | Properties | Description | Coupa mapping |
---|---|---|---|
General Information | |||
Document Type | "id": "document_type", "type": "enum", "required": true | Trainable (AI predicted) classification enumerator to recognize two standard document types: Tax Invoice and Credit Note. There is special logic related to the Credit Note document type that depends on the value of this field. Business rules:
| No direct mapping, but Coupa fields document-type and is-credit-note are set based on the value. |
Invoice Number | "id": "document_id", "type": "string", "required": false | Invoice Number extracted from the document. Business rules:
| |
Invoice Number (manual) | "id": "document_id_manual", "type": "string", "required": true | The value from the extracted field Invoice Number is copied to this field and it can be manually modified by the user if needed. Business rules:
| invoice-number |
Invoice Date | "id": "date_issue", "type": "date", "required": true | Invoice Date extracted from the document. | |
Invoice Date (manual) | "id": "date_issue_manual", "type": "string", "required": true | The value from the extracted field Invoice Date is copied to this field and it can be manually modified by the user if needed. Business rules:
| invoice-date |
Due Date | "id": "date_due", "type": "date", "required": false | Due Date extracted from the document. | |
Payment Terms | "id": "terms", "type": "string", "required": false | Invoice Number extracted from the document. | |
Payment Terms (calculated) | "id": "terms_normalized", "type": "string", ”source”: “formula“, ”hidden”: true, "required": false | Calculated value of the payment terms. Rossum tries to calculate the payment terms (in days) in the following order (the first calculation returning a value ends the evaluation):
| |
Payment Terms Match | "id": "payment_terms_match", "type": "enum", "required": false | Match of the existing active payment term object replicated from Coupa. The matching is based on the Payment Terms (calculated) number of days. If there are multiple terms found user can select one manually. The field is by default not mandatory in Rossum, but can be easily made mandatory if required by the customer. Business rules:
Dataset: payment_terms | payment-term The payment-term is object in Coupa linked to the Invoice on the header level. The mapping is based on the id of the object. |
Description | "id": "header_description", "type": "string", "required": false | Description that can be captured from the header level of the document. Relates to the Fallback Line Item logic and serves as a description for the cases when there are no actual line items extracted from the documents. | |
Description (export) | "id": "description_export", "type": "string", ”hidden”: false, ”source”: “formula“, "required": false |
The field is editable by the user. Relates to the Fallback Line Item logic and serves as a description for the cases when there are no actual line items extracted from the documents. | description The field in Coupa is on the item level and the value of this field is used only when there are no actual line items extracted from the document in Rossum and fallback line item is create using header level values. |
Supplier Part Number | "id": "code", "type": "string", "required": false | Supplier Part Number that can be captured from the header level of the document. Relates to the Fallback Line Item logic and it is used for the PO line matching for the cases when there are no actual line items extracted from the documents. | |
Notes | "id": "notes_manual", "type": "string", "required": false | Manual entry field. Usually used by AP teams to leave notes on documents that cannot be immediately confirmed (postpone reasons, exceptions handling notes, …). There is by default no mapping to Coupa, but it is common requirement to map the value a custom field there. | |
Customer Section | |||
Customer Name | "id": "recipient_name", "type": "string", "required": false | Customer (entity/subsidiary) name extracted from the document. It is not directly mapped to Coupa, but it is used in the matching logic to find the customer (Chart of Accounts) record replicated from Coupa (See Customer Match field below). | |
Customer Address | "id": "recipient_address", "type": "string", "required": false | Customer (entity/subsidiary) address extracted from the document. It is not directly mapped to Coupa, but it is used in the matching logic to find the customer (Chart of Accounts) record replicated from Coupa (See Customer Match field below). | |
Customer Tax Number | "id": "recipient_tax_id", "type": "string", "required": false | Customer (entity/subsidiary) tax id (VAT Number in Europe) extracted from the document. It is not directly mapped to Coupa, but it is used in the matching logic to find the customer (Chart of Accounts) record replicated from Coupa (See Customer Match field below). | |
Customer Tax Number (normalized) | "id": "recipient_tax_id_normalized", "type": "string", ”hidden”: true, "required": false | Normalized value of the Customer Tax Number. The normalization removes all non-alphanumeric characters from the value. | |
Customer Match | "id": "recipient_match", "type": "enum", "required": false | Match of the active Customer in the data replicated from the Coupa database. The replicated object from Coupa is Account Type. The customer is referred to as Chart of Accounts on the header level of the invoice in the Coupa UI. The high level description of the matching logic if following (the first query that returns one or more records ends the evaluation):
The field is mandatory and if there is no unique match found user is forced to manually select one either from prefiltered list (result of fuzzy matching) or from the full list of the customer. Please note that the field is not directly mapped to Coupa. It is because Rossum logic prefers information from the PO on the PO backed documents. The logic is evaluated on the level of the Customer (export) field. See description below. Business rules:
Dataset: account_types | |
Customer Ship-To Match | "id": "recipient_ship_to_match", "type": "enum", "required": false | Match of the header level Ship To address based on the extracted Customer Address. On PO backed invoices the Ship To address is prefilled based on the PO data. The high level description of the matching logic if following (the first query that returns one or more records ends the evaluation):
Dataset: addresses | ship-to-address The ship-to-address is object in Coupa linked to the Invoice on the header level. The mapping is based on the id of the object. |
Customer Name Match | "id": "recipient_name_match", "type": "enum", ”hidden”: true, "required": false | The value is propagated from the Customer that is matched in the Customer Match field. This is so called “additional mapping“ field and it has no matching logic of its own. Dataset: account_types | |
Customer Primary Address Match | "id": "recipient_primary_address_match", "type": "enum", ”hidden”: true, "required": false | The value is propagated from the Customer that is matched in the Customer Match field. The value is used for filtering of the Tax Registrations described in the Customer Tax Reg. Match field below. This is so called “additional mapping“ field and it has no matching logic of its own. Dataset: account_types | |
Customer Tax Reg. Match | "id": "recipient_tax_registration_match", "type": "enum", ”hidden”: false, "required": false | Match of the object that is linked in the header level Buyer VAT ID in Coupa. Customers in Coupa can have multiple tax registrations even from different countries. The high level description of the matching logic if following (the first query that returns one or more records ends the evaluation):
The matching logic is only triggered if Customer Match is not empty as it depends on the Customer Primary Address Match which links the tax registrations and the account types in Coupa. Only active tax registrations of the matched customer are part of the logic described above. Dataset: tax_registrations | buyer-tax-registration The buyer-tax-registration is object in Coupa linked to the Invoice on the header level. The mapping is based on the number of the tax registration. |
Customer Country Code Match | "id": "recipient_country_code_match", "type": "enum", ”hidden”: true, "required": false | The value is propagated from the Customer’s Tax Registration that is matched in the Customer Tax Reg. Match field. It represents country of the matched Tax Registration of the customer. The value is used for filtering of the tax codes described in the Tax Code Match field below. This is so called “additional mapping“ field and it has no matching logic of its own. Dataset: tax_registrations | |
Customer Entity Country Code Match | "id": "recipient_entity_country_code_match", "type": "enum", ”hidden”: true, "required": false | The value is propagated from the Customer that is matched in the Customer Match field. It represents country of the matched customer. The value is used for filtering of the tax codes described in the Tax Code Match field below. This is so called “additional mapping“ field and it has no matching logic of its own. Dataset: account_types | |
Customer ID (export) | "id": "recipient_export", "type": "string", ”hidden”: true, ”source”: “formula“, "required": true | The logic in Rossum prefers information from the POs on the PO backed documents. It is the case also for the Customer (Chart of Accounts). Logic implemented in this field ensures that the customer that is linked to the first item of the first PO matched on this document is used as invoice Chart of Accounts in Coupa. The order of the priority for the evaluation of this field is following:
| account-type The account-type is object in Coupa linked to the Invoice on the header level. The mapping is based on the id of the object. |
Customer (export) | "id": "recipient_name_export", "type": "string", ”hidden”: false, ”source”: “formula“, "required": true | The field value is visible representation of the exported customer name and itself is not mapped to Coupa. The logic in Rossum prefers information from the POs on the PO backed documents. It is the case also for the Customer (Chart of Accounts). Logic implemented in this field ensures that the customer that is linked to the first item of the first PO matched on this document is used as invoice Chart of Accounts in Coupa. The order of the priority for the evaluation of this field is following:
| |
Supplier Section | |||
Supplier Name | "id": "sender_name", "type": "string", "required": false | Supplier name extracted from the document. It is not directly mapped to Coupa, but it is used in the matching logic to find the customer record replicated from Coupa (See Customer Match field below). | |
Supplier Address | "id": "sender_address", "type": "string", "required": false | Supplier address extracted from the document. It is not directly mapped to Coupa, but it is used in the matching logic to find the supplier record replicated from Coupa (See Supplier Match field below). | |
Supplier Tax Number | "id": "sender_tax_id", "type": "string", "required": false | Supplier tax id (VAT Number in Europe) extracted from the document. It is not directly mapped to Coupa, but it is used in the matching logic to find the supplier record replicated from Coupa (See Supplier Match field below). | |
Supplier Tax Number (normalized) | "id": "sender_tax_id_normalized", "type": "string", ”hidden”: true, ”source”: “formula“, "required": false | Normalized value of the Supplier Tax Number. The normalization removes all non-alphanumeric characters from the value. Link to formula field with code: Rossum | |
Supplier Match | "id": "sender_match", "type": "enum", "required": false | Match of the active supplier record in the data replicated from the Coupa database. The high level description of the matching logic if following (the first query that returns one or more records ends the evaluation):
The field is mandatory and if there is no unique match found user is forced to manually select one either from prefiltered list (result of fuzzy matching) or from the full list of the customer. Please note that the field is not directly mapped to Coupa. It is because Rossum logic prefers information from the PO on the PO backed documents. The logic is evaluated on the level of the Customer (export) field. See description below. Business rules:
Dataset: suppliers | |
Supplier Country Code Match | "id": "sender_country_code_match", "type": "enum", ”hidden”: true, "required": false | The value is propagated from the supplier record that is matched in the Supplier Match field. It represents country of the matched supplier. This is so called “additional mapping“ field and it has no matching logic of its own. Dataset: suppliers | |
Supplier Payment Days Match | "id": "sender_payment_days_match", "type": "enum", ”hidden”: true, "required": false | The value is propagated from the supplier record that is matched in the Supplier Match field. It represents number of days from the supplier’s default payment terms in Coupa. It is used in the Payment Terms (calculated) logic described above. This is so called “additional mapping“ field and it has no matching logic of its own. Business rules:
Dataset: suppliers | |
Supplier Display Name Match | "id": "sender_display_name_match", "type": "enum", ”hidden”: true, "required": false | The value is propagated from the supplier record that is matched in the Supplier Match field. It represents number of days from the supplier’s default payment terms in Coupa. It is used in the Payment Terms (calculated) logic described above. The field is used in the This is so called “additional mapping“ field and it has no matching logic of its own. Dataset: suppliers | |
Supplier Number (export) | "id": "sender_export", "type": "string", ”hidden”: true, "required": false | The logic in Rossum prefers information from the POs on the PO backed documents. It is the case also for the supplier. Logic implemented in this field ensures that the supplier that is linked to the PO matched on this document is used as invoice Supplier in Coupa. The order of the priority for the evaluation of this field is following:
| supplier The supplier is object in Coupa linked to the Invoice on the header level. The mapping is based on the id of the object. |
Supplier (export) | "id": "sender_name_export", "type": "string", ”hidden”: false, "required": true | The field value is visible representation of the exported supplier name and itself is not mapped to Coupa. The logic in Rossum prefers information from the POs on the PO backed documents. It is the case also for the supplier. Logic implemented in this field ensures that the supplier that is linked to the PO matched on this document is used as invoice Supplier in Coupa. The order of the priority for the evaluation of this field is following:
| |
Bank Details | |||
IBAN | "id": "iban", "type": "string", "required": false | IBAN provided by the supplier on the document. | |
BIC/SWIFT | "id": "bic", "type": "string", "required": false | BIC/SWIFT provided by the supplier on the document. | |
Account Number | "id": "account_num", "type": "string", "required": false | Account Number provided by the supplier on the document. | |
Bank Code | "id": "bank_num", "type": "string", "required": false | Bank Code provided by the supplier on the document. | |
Credit Note | |||
Original Invoice Number | "id": "original_document_id", "type": "string", "required": false | Value captured as it appears on the document, non-editable by users | |
Original Invoice Date | "id": "original_date_issue", "type": "string", "required": false | Value captured as it appears on the document, non-editable by users | |
Credit note amounts | "id": "credit_notes_amounts", "type": "string", ”hidden”: true, "required": false ”default_value”: “negative“ | Hidden field for configuration of Rossum behavior on credit notes. The field is configured through the default value and following values are expected:
| |
Taxes & Amounts | |||
Amount Due | "id": "amount_total", "type": "number", "required": false | Value captured as it appears on the document, non-editable by users. Business rules:
If any of the conditions above does not match there is a warning and automation is blocked. | gross-total, total-with-taxes |
Subtotal | "id": "amount_total_base", "type": "number", "required": false | Value captured as it appears on the document, non-editable by users. Business rules:
If any of the conditions above does not match there is a warning and automation is blocked. | |
Subtotal (calculated) | "id": "amount_total_base_calculated", "type": "number", ”hidden”: true, ”source”: “formula“, "required": false |
| |
Tax Amount | "id": "amount_total_tax", "type": "number", "required": false | List of values captured as they appear on the document, non-editable by users. | |
Tax Amount (calculated) | "id": "amount_total_tax_calculated", "type": "number", ”hidden”: true, ”source”: “formula“, "required": false |
The calculated value is rounded to the 2 decimal places. Business rules:
If any of the conditions above does not match there is a warning and automation is blocked. | |
Tax Rate (calculated) | "id": "tax_rate_calculated", "type": "number", ”hidden”: true, ”source”: “formula“, "required": false |
The resulting value is rounded to 2 decimal places. | |
Shipping Charges | "id": "shipping_charge", "type": "number", "required": false | List of values captured as they appear on the document, non-editable by users. | |
Charges (calculated) | "id": "charges_calculated", "type": "number", ”hidden”: true, ”source”: “formula“, "required": false |
From the line items rounded to 2 decimal places. | Exported as part of the |
Currency | "id": "currency", "type": "enum", "required": true | Value is predicted based on the document content (classifier), selectable by users (the currency is not extracted from document using bounding box, but based on user selection = classifier) The currency is verified against the currency on the matched PO line. There is a warning shown and automation is blocked if there is a discrepancy. Business rules:
| exported to Coupa in the currency field |
Coupa Total (calculated) | "id": "coupa_total_calculated", "type": "number", ”hidden”: true, ”source”: “formula“, "required": false | If line items are extracted:
If there are no line items extracted:
Because Coupa does its own calculation using the values provided by Rossum it could theoretically end up with different value that the total mentioned on the document. Rossum simulates the calculation in Coupa and checks the consistency with the document content to avoid incorrect data export to Coupa. Business rules:
| |
Purchase Order | |||
PO Number | “id”: “order_id” "type": "string", ”hidden”: false, ”source”: “captured“, "required": false | Value captured as it appears on the document, non-editable by users. | order-header-num |
PO Status | "id": "order_header_status_match", "type": "enum", ”hidden”: false, ”source”: “data“, "required": false | Status of the PO matched on the line. Business rules:
If the formula above does not match there is an error and document cannot be confirmed. Dataset: purchase_orders | |
PO Line Match | “id”: “order_item_match” "type": "enum", ”hidden”: false, "required": false | The field is not visible if there are line items extracted from the document. If there are not lines it serves as a PO line match for the fallback line that will be created in Coupa based on the header level values extracted in Rossum (see Coupa Integration Baseline (CIB) | Line items extraction and export to Coupa ). Lines of the PO extracted in field PO Number or selected in the Blanket PO Match field are taken into consideration. The matching logic is following:
Business rules:
Dataset: purchase_order_lines | order-line-num |
PO Line Status | "id": "po_line_status_match", "type": "enum", ”hidden”: false, ”source”: “data“, "required": false | Status of the matched PO line. Business rules:
If the formula above does not match there is an error and document cannot be confirmed. Dataset: purchase_order_lines | |
PO Line Currency (Coupa) | "id": "po_line_currency_match", "type": "enum", ”hidden”: false, ”source”: “data“, "required": false | Currency propagated from the PO line matched in the PO Line Match field. Business rules:
If the formula above does not match there is a warning message and automation is blocked. Dataset: purchase_order_lines | |
Line Items | Line Items are extracted as a separate table. See description of the fields in the Line Items chapter below. | ||
Coupa Technical Fields | |||
Submit For Approval | "id": "sf_submit_for_approval", "type": "number", ”hidden”: true, ”source”: “formula“, "required": false | Read only field that will automatically evaluate based on values of other fields in the document:
| |
Enforce Draft | "id": "enforce_draft", "type": "enum", ”hidden”: false, ”source”: “manual“, "required": false | There are cases when the document is set for submission by the rules implemented in the Submit For Approval field, however the user has a reason not to submit directly from Rossum (manual adjustment or check in Coupa is needed before the submission). By setting value of this field to Yes user can enforce drafting of the document Coupa. Yes or no, manual selection. | |
PO x Invoice CoA Mismatch Tag | "id": "coa_mismatch_tag", "type": "enum", ”hidden”: false, ”source”: “formula“, "required": false | If the CoA (customer’s entity) on the invoice does not match the CoA on any of the matched PO lines (Coupa stores this information on the line level of the PO) this tag is set and sent to Coupa. Rossum will follow the information on the PO so the invoice in Coupa will be created with the CoA defined on the PO. | |
PO x Invoice Supplier Mismatch Tag | "id": "supplier_mismatch_tag", "type": "enum", ”hidden”: false, ”source”: “formula“, "required": false | If the Supplier on the invoice does not match the Supplier on any of the matched POs (there can be different POs used on one document in Rossum on different line items) this tag is set and sent to Coupa. Rossum will follow the information on the PO so the invoice in Coupa will be created with the supplier defined on the PO. | |
PO Line Inactive Tag | "id": "inactive_po_line_tag", "type": "enum", ”hidden”: false, ”source”: “formula“, "required": false | The tag is set if any of the matched PO lines is in status that is considered closed or inactive by Rossum. By default Rossum considers the PO line to be closed if it is not in ['partially_received', 'received', 'soft_closed_for_receiving','created'] statuses. | |
Coupa Invoices Statuses | "id": "coupa_invoices_statuses", "type": "string", ”hidden”: false, ”source”: “data“, "required": false | Technical field for indication of the statuses of duplicate invoices already existing in Coupa. See full description of Duplicate Documents in Coupa. The value contains distinct list of statuses of documents with the same Invoice Number for the same supplier existing in Coupa. Business rules:
| |
Coupa API Base URL | "id": "coupa_api_base_url", "type": "string", ”hidden”: true, ”source”: “formula“, "required": false | Configuration field. The formula should be configured to return static value of base URL (with / at the end) of the Coupa of the customer. Example: "https://rossum-czech-coupalink.coupacloud.com/" | |
OAuth Client ID | "id": "oauth_client_id", "type": "true", ”hidden”: false, ”source”: “formula“, "required": false | Configuration field. The formula must be configured to return static value of the Client ID of the oAuth client created in Customer’s Coupa for purposes of Rossum integration. Example: "kf7968x7424a019ec6eb1178c38e1a0c" |
Line Items
Description | "id": "item_description", "type": "string", ”hidden”: false, ”source”: “captured“, "required": false | Item description captured from the document. | |
Description (export) | "id": "item_description_export", "type": "string", ”hidden”: false, ”source”: “formula“, "required": false |
The field is editable by the user. | description |
Quantity | “id”: “item_quantity” "type": "number", ”hidden”: false, ”source”: “captured“, "required": false | Value captured as it appears on the document. Business rules:
If the formula above does not match there is a warning and automation is blocked. | |
Quantity (calculated) | "id": "item_quantity_calculated", "type": "number", ”hidden”: true, ”source”: “formula“, "required": false |
| |
Unit Price Net | "id": "item_amount_base", "type": "number", ”hidden”: false, ”source”: “captured“, "required": false | Value captured from the line item on the document. Business rules:
If the formula above does not match there is a warning and automation is blocked. | |
Unit Price Net (calculated) | "id": "item_amount_base_calculated", "type": "number", ”hidden”: true, ”source”: “formula“, "required": false |
| |
Line Total Net | "id": "item_total_base", "type": "number", ”hidden”: false, ”source”: “captured“, "required": false | Value captured from the line item on the document. Business rules:
If the formula above does not match there is a warning and automation is blocked. | |
Line Total Net (calculated) | "id": "item_total_base_calculated", "type": "number", ”hidden”: true, ”source”: “formula“, "required": false |
| |
PO Number | "id": "item_order_id", "type": "string", ”hidden”: false, ”source”: “captured“, "required": false | Value captured from the line item on the document. | |
PO Number (calculated) | "id": "item_order_id_calculated", "type": "number", ”hidden”: true, ”source”: “formula“, "required": false | The PO number for purposes of the PO line matching is evaluated on the Invoice line from multiple sources. In general the header level captured or selected PO number is used if there is no line item level PO Number or Blanket PO Match. This allows both header and line level specification of the PO number and also for multiple different PO numbers on different line items. | |
PO Line Match | "id": "item_order_item_match", "type": "enum", ”hidden”: false, ”source”: “data“, "required": false | Lines of the PO evaluated in the PO Number (calculated) field are taken into consideration. The matching logic is following:
Dataset: purchase_order_lines | |
PO Line Currency (Coupa) | "id": "item_po_line_currency_match", "type": "enum", ”hidden”: false, ”source”: “data“, "required": false | Currency propagated from the PO line matched in the PO Line Match field. Business rules:
If the formula above does not match there is a warning message and automation is blocked. Dataset: purchase_order_lines | |
PO Status | "id": "item_order_header_status_match", "type": "enum", ”hidden”: false, ”source”: “data“, "required": false | Status of the PO matched on the line. Business rules:
If the formula above does not match there is an error and document cannot be confirmed. Dataset: purchase_orders | |
Item Quantity (Coupa) | "id": "item_quantity_export", "type": "number", ”hidden”: false, ”source”: “formula“, "required": false |
| quantity |
Item Price (Coupa) | "id": "item_price_export", "type": "number", ”hidden”: false, ”source”: “formula“, "required": false |
| price |