Commercial Credit Template
Overview
Commercial credit card products support revolving lines of credit, which require account holders to make minimum payments by their billing cycle due date. Additionally, you can assess interest charges on revolving balances.
Highnote supports the following configurations for commercial credit card products:
| Configuration | Description |
|---|---|
| Unsecured credit card products | These credit card products are not backed by an account holder deposit and require adequate capital to fund lines of credit. You can provide capital on your behalf or through a debt facility. |
| Secured credit card products | These credit card products are backed by an account holder's secure deposit. |
| Credit processing-only model | This model uses the Highnote platform to fund credit products on-demand, bypassing full ledger capabilities and repayment services. For more information on this model, contact support@highnote.com. |
This guide provides an overview of creating and setting up an unsecured commercial credit card product using the Highnote API in the Test environment. In the Live environment, the Highnote team will assist with creating your card product.
Create card product
Use the following mutation to create an unsecured commercial credit card product in the Test environment. Use COMMERCIAL_CREDIT as the vertical input variable:
CreateCardProduct
Query
mutation CreateCardProduct($input: CreateCardProductInput!) {
createCardProduct(input: $input) {
__typename
... on CardProduct {
id
name
usage
vertical
}
... on UserError {
errors {
errorPath
code
description
}
}
}
}
Variables
{ "input": { "cardProduct": { "name": "Commercial Credit Card", "usage": "MULTI_USE", "vertical": "COMMERCIAL_CREDIT" } } }
Result
{
"data": {
"createCardProduct": {
"__typename": "CardProduct",
"id": "CARD_PRODUCT_ID",
"name": "Commercial Credit Card",
"usage": "MULTI_USE",
"vertical": "COMMERCIAL_CREDIT"
}
},
"extensions": {
"requestId": "REQUEST_ID"
}
}
Add credit feature
After creating a COMMERCIAL_CREDIT card product, use the following mutation to add the REVOLVING feature. This feature enables minimum payment terms and revolving balance capabilities for financial accounts:
EnableCreditCardFeature
Query
mutation EnableCreditCardFeature($input: EnableCreditCardFeatureInput!) {
enableCreditCardFeature(input: $input) {
__typename
... on CardProduct {
id
features {
__typename
enabled
}
}
... on UserError {
errors {
errorPath
code
description
}
}
}
}
Variables
{ "input": { "cardProductId": "CARD_PRODUCT_ID", "feature": "REVOLVING" } }
Result
{
"data": {
"enableCreditCardFeature": {
"__typename": "CardProduct",
"id": "CARD_PRODUCT_ID",
"features": [
{
"__typename": "RevolvingCardProductFeature",
"enabled": true
}
]
}
},
"extensions": {
"requestId": "REQUEST_ID",
"rateLimit": {
"cost": 11,
"limit": 60060,
"remaining": 60045
}
}
}
View credit features
In the Test environment, credit and charge card products are automatically assigned credit features and settings. These features and settings are similar to a live program's credit policies, which are configured by the Highnote team during program setup.
The following table outlines the default features and settings for consumer credit card products in the Test environment:
| Credit policy | Description | Test Environment Default Setting |
|---|---|---|
delinquentInDays | This setting controls your Test environment's delinquency policy. | Delinquent when totalDaysDelinquent >= 30 days |
suspendedInDays | This setting controls your Test environment's policy for account suspension. | Suspended when totalDaysDelinquent >= 90 days |
chargeOffInDays | This setting controls your Test environment's charge-off policy. | Balance charged off when totalDaysDelinquent >= 180 days |
minimumPayment | This setting controls the minimum payment for account holders. The minimum payment is the greater of $25 or 1% of the statement balance, plus interest charges, fees, and any past amount due. If the balance is less than $25, the minimum payment is equal to the statement balance. | Minimum payment is percentage = 1%, thresholdAmount = $25 |
Use the following query to view credit features for your credit card product in the Test environment:
GetCardProductWithCreditConfiguration
Query
query GetCardProductWithCreditConfiguration($id: ID!) {
node(id: $id) {
__typename
... on CardProduct {
id
creditConfiguration {
... on CreditCardProductConfiguration {
accountAging {
delinquentInDays
suspendedInDays
chargeOffInDays
lateFeeGracePeriodInDays
}
minimumPayment {
percentage
thresholdAmount {
value
currencyCode
}
includesPastDueAmount
includesInterestAmount
includesFeesCharged
}
repayment {
repaymentWaterfall
}
interest {
includesPurchase
includesFees
}
billingCycleConfiguration {
billingCyclePeriod
billingCycleGracePeriodType
billingCycleGracePeriodInDays
}
}
}
}
}
}
Variables
{
"id": "CARD_PRODUCT_ID"
}
Result
{
"data": {
"node": {
"__typename": "CardProduct",
"id": "CARD_PRODUCT_ID",
"creditConfiguration": {
"accountAging": {
"delinquentInDays": 30,
"suspendedInDays": 60,
"chargeOffInDays": 90,
"lateFeeGracePeriodInDays": 10
},
"minimumPayment": {
"percentage": 10,
"thresholdAmount": {
"value": 2000,
"currencyCode": "USD"
},
"includesPastDueAmount": true,
"includesInterestAmount": false,
"includesFeesCharged": true
},
"repayment": {
"repaymentWaterfall": [
"PURCHASE",
"INTEREST",
"FEES"
]
},
"interest": {
"includesPurchase": true,
"includesFees": true
},
"billingCycleConfiguration": {
"billingCyclePeriod": "MONTHLY",
"billingCycleGracePeriodType": "FLOATING",
"billingCycleGracePeriodInDays": 10
}
}
}
},
"extensions": {
"requestId": "REQUEST_ID",
"rateLimit": {
"cost": 8
}
}
}
Fund your card program
Some card products use a product funding account to transfer funds to financial accounts. In the Test environment, you can simulate depositing funds into your product funding account. Simulating deposits doesn't require connecting a verified external bank account.
Funding your product funding account requires the following steps:
- Retrieve the product funding account ID.
- Initiate a wire transfer to the product funding account.
Find product funding account ID
Use the following query to find your product funding account ID:
GetCardProductwithAccounts
Query
query GetCardProductwithAccounts($id: ID!) {
node(id: $id) {
... on CardProduct {
__typename
id
name
usage
accounts {
edges {
node {
id
name
features {
__typename
enabled
}
accountStatus
owner {
__typename
}
}
}
}
}
}
}
Variables
{
"id": "'CARD_PRODUCT_ID"
}
Result
{
"data": {
"node": {
"id": "CARD_PRODUCT_ID",
"accounts": {
"edges": [
{
"node": {
"id": "FINANCIAL_ACCOUNT_ID",
"features": [
{
"enabled": true,
"__typename": "ProductFundingFinancialAccountFeature"
}
]
}
}
]
}
}
},
"extensions": {
"requestId": "REQUEST_ID",
"rateLimit": {
"cost": 13,
"limit": 60060,
"remaining": 60041
}
}
}
Initiate a wire transfer
Using the following mutation, simulate a wire transfer in the Test environment using the product funding account ID as the toFinancialAccountId input variable:
SimulateDeposit
Query
mutation SimulateDeposit($input: SimulateDepositInput!) {
simulateDeposit(input: $input) {
__typename
... on Transfer {
id
status
statusReason
amount {
value
currencyCode
}
createdAt
updatedAt
ledgers {
name
}
}
... on UserError {
errors {
code
}
}
... on AccessDeniedError {
message
}
}
}
Variables
{ "input": { "amount": { "value": 10000000, "currencyCode": "USD" }, "source": "WIRE", "toFinancialAccountId": "PRODUCT_FUNDING_ACCOUNT_ID", "memo": "Consumer Credit product funding wire deposit" } }
Result
{
"data": {
"simulateDeposit": {
"__typename": "Transfer",
"id": "WIRE_TRANSFER_ID",
"status": "PENDING",
"statusReason": null,
"amount": {
"value": 10000000,
"currencyCode": "USD"
},
"createdAt": "2023-09-01T22:26:43.629Z",
"updatedAt": "2023-09-01T22:26:43.629Z",
"ledgers": null
}
},
"extensions": {
"requestId": "REQUEST_ID",
"rateLimit": {
"cost": 12,
"limit": 60060,
"remaining": 60040
}
}
}
Create credit plans
Credit plans allows you to meet unique needs of your account holders by providing flexible and configurable terms on credit card products. Credit plans define the following:
- Interest rate
- Interest rate type
- Interest accrual method
- Pricing and policy terms for specific balance types
You can create credit plans in the Test environment to test your card product. For more information on creating credit plans, see Create Credit Plans. The Highnote team will create credit plans for your card product in the Live environment.
Create an account holder
Your credit policy dictates the data required to issue a line of credit in the Live environment.
Before issuing lines of credit, you will want to consider which businessCreditRiskAttribute fields you want to collect from an account holder. For example, you may want to collect annualBusinessRevenue for use during application decisioning.
There are two recommended methods for collecting this information:
- Collect from the account holder when they are completing their application.
- Update the account holder with the necessary details after they've submitted their application.
Use the following mutation to create a business account holder. Provide businessCreditRiskAttributes as needed:
createUSBusinessAccountHolder
Query
mutation CreateUSBusinessAccountHolder(
$input: CreateUSBusinessAccountHolderInput!
) {
createUSBusinessAccountHolder(input: $input) {
__typename
... on UserError {
errors {
errorPath
code
description
}
}
... on USBusinessAccountHolder {
externalId
id
createdAt
updatedAt
primaryAuthorizedPerson {
id
email
dateOfBirth
percentageOwnership
authorizingPersonTitle
createdAt
updatedAt
name {
givenName
familyName
title
suffix
middleName
}
homeAddress {
streetAddress
extendedAddress
postalCode
region
locality
countryCodeAlpha3
}
phoneNumbers {
countryCode
number
label
}
identificationDocument {
socialSecurityNumber {
numberHash
countryCodeAlpha3
}
}
}
businessProfile {
id
website
businessType
businessCreditRiskAttributes {
annualRevenue {
value
currencyCode
}
}
createdAt
updatedAt
name {
legalBusinessName
doingBusinessAsName
}
billingAddress {
streetAddress
extendedAddress
postalCode
region
locality
countryCodeAlpha3
}
phoneNumbers {
countryCode
number
label
}
identificationDocument {
employerIdentificationNumber {
numberHash
countryCodeAlpha3
}
}
ultimateBeneficialOwners {
id
percentageOwnership
dateOfBirth
email
createdAt
updatedAt
name {
givenName
familyName
title
suffix
middleName
}
homeAddress {
streetAddress
extendedAddress
postalCode
region
locality
countryCodeAlpha3
}
phoneNumbers {
countryCode
number
label
}
identificationDocument {
socialSecurityNumber {
numberHash
countryCodeAlpha3
}
}
}
}
}
}
}
Variables
{ "input": { "externalId": "bluejay", "primaryAuthorizedPerson": { "name": { "givenName": "Gerry", "familyName": "Wolfe" }, "email": "gerrytest1@example.com", "phoneNumber": { "countryCode": "1", "number": "5555555555", "label": "MOBILE", "extension": "312" }, "homeAddress": { "streetAddress": "123 Main Street", "postalCode": "95121", "locality": "San Jose", "region": "CA", "countryCodeAlpha3": "USA" }, "identificationDocument": { "socialSecurityNumber": { "number": "111-67-1111", "countryCodeAlpha3": "USA" } }, "dateOfBirth": "1980-09-01", "authorizingPersonTitle": "PRESIDENT" }, "businessProfile": { "name": { "legalBusinessName": "HIGHNOTE", "doingBusinessAsName": "BlueJay Inc" }, "billingAddress": { "streetAddress": "123 Main Street", "postalCode": "95121", "locality": "San Jose", "region": "CA", "countryCodeAlpha3": "USA" }, "phoneNumber": { "countryCode": "1", "number": "5555555555", "label": "MOBILE", "extension": "312" }, "identificationDocument": { "employerIdentificationNumber": { "number": "11-2343256", "countryCodeAlpha3": "USA" } }, "businessCreditRiskAttributes": { "annualRevenue": { "value": "1000", "currencyCode": "USD" } }, "businessType": "PARTNERSHIP", "ultimateBeneficialOwners": [ { "name": { "givenName": "James", "familyName": "Smith" }, "email": "james@example.com", "phoneNumber": { "countryCode": "1", "number": "5555555555", "label": "MOBILE", "extension": "312" }, "homeAddress": { "streetAddress": "123 Main Street", "postalCode": "95121", "locality": "San Jose", "region": "CA", "countryCodeAlpha3": "USA" }, "identificationDocument": { "socialSecurityNumber": { "number": "111-67-1325", "countryCodeAlpha3": "USA" } }, "dateOfBirth": "1982-09-01", "percentageOwnership": 25 } ] } } }
Result
{
"data": {
"createUSBusinessAccountHolder": {
"__typename": "USBusinessAccountHolder",
"externalId": "bluejay",
"id": "BUSINESS_ACCOUNT_HOLDER_ID",
"createdAt": "2024-08-26T20:34:54.819Z",
"updatedAt": "2024-08-26T20:34:54.887Z",
"primaryAuthorizedPerson": {
"id": "PRIMARY_AUTHORIZED_PERSON_ID",
"email": "gerrytest1@example.com",
"dateOfBirth": "1980-09-01",
"percentageOwnership": null,
"authorizingPersonTitle": "PRESIDENT",
"createdAt": "2024-08-26T20:34:54.821Z",
"updatedAt": "2024-08-26T20:34:54.889Z",
"name": {
"givenName": "Gerry",
"familyName": "Wolfe",
"title": "",
"suffix": "",
"middleName": ""
},
"homeAddress": {
"streetAddress": "123 Main Street",
"extendedAddress": "",
"postalCode": "95121",
"region": "CA",
"locality": "San Jose",
"countryCodeAlpha3": "USA"
},
"phoneNumbers": [
{
"countryCode": "1",
"number": "5555555555",
"label": "MOBILE"
}
],
"identificationDocument": {
"socialSecurityNumber": {
"numberHash": "HASH",
"countryCodeAlpha3": "USA"
}
}
},
"businessProfile": {
"id": "BUSINESS_ACCOUNT_HOLDER_ID",
"website": "",
"businessType": "PARTNERSHIP",
"businessCreditRiskAttributes": {
"annualRevenue": [
{
"value": 1000,
"currencyCode": "USD"
}
]
},
"createdAt": "2024-08-26T20:34:54.819Z",
"updatedAt": "2024-08-26T20:34:54.887Z",
"name": {
"legalBusinessName": "HIGHNOTE",
"doingBusinessAsName": "BlueJay Inc"
},
"billingAddress": {
"streetAddress": "123 Main Street",
"extendedAddress": "",
"postalCode": "95121",
"region": "CA",
"locality": "San Jose",
"countryCodeAlpha3": "USA"
},
"phoneNumbers": [
{
"countryCode": "1",
"number": "5555555555",
"label": "MOBILE"
}
],
"identificationDocument": {
"employerIdentificationNumber": {
"numberHash": "HASH",
"countryCodeAlpha3": "USA"
}
},
"ultimateBeneficialOwners": [
{
"id": "BENEFICIAL_OWNER_ID",
"percentageOwnership": 25,
"dateOfBirth": "1982-09-01",
"email": "james@example.com",
"createdAt": "2024-08-26T20:34:54.821Z",
"updatedAt": "2024-08-26T20:34:54.889Z",
"name": {
"givenName": "James",
"familyName": "Smith",
"title": "",
"suffix": "",
"middleName": ""
},
"homeAddress": {
"streetAddress": "123 Main Street",
"extendedAddress": "",
"postalCode": "95121",
"region": "CA",
"locality": "San Jose",
"countryCodeAlpha3": "USA"
},
"phoneNumbers": [
{
"countryCode": "1",
"number": "5555555555",
"label": "MOBILE"
}
],
"identificationDocument": {
"socialSecurityNumber": {
"numberHash": "HASH",
"countryCodeAlpha3": "USA"
}
}
}
]
}
}
},
"extensions": {
"requestId": "REQUEST_ID",
"rateLimit": {
"cost": 30,
"limit": 2500,
"remaining": 2469
}
}
}
Account holder applications
Application approval for credit card products in the Live environment uses one of the following workflows:
- Highnote runs your credit policy for you and approves or denies applications based on your credit policy.
- You participate in collaborative application decisioning to provide a recommended approval or denied application response.
Enable collaborative application decisioning
By default, in the Test environment, you can simulate credit application decisions with various values. These simulation values are used when onboarding an account holder. Use this default setting if Highnote will be executing your credit policy on your behalf. For more information, see the Simulate Underwriting Decision guide.
Alternatively, you or your underwriter can use collaborative application decisioning. This feature allows you to recommend an approval or denial based on your credit policy. For more information, see Collaborative Application Decisioning.
Enable collaborative application decisioning in the Highnote dashboard, or using the API with the following mutation:
EnableCollaborativeApplicationUnderwritingFeature
Query
mutation EnableCollaborativeApplicationUnderwritingFeature(
$input: EnableCollaborativeApplicationUnderwritingFeatureInput!
) {
enableCollaborativeApplicationUnderwritingFeature(input: $input) {
__typename
... on CardProduct {
id
features {
__typename
enabled
}
}
... on UserError {
errors {
errorPath
code
description
}
}
}
}
Variables
{ "input": { "cardProductId": "CARD_PRODUCT_ID" } }
Result
{
"data": {
"enableCollaborativeApplicationUnderwritingFeature": {
"__typename": "CardProduct",
"id": "CARD_PRODUCT_ID",
"features": [
{
"__typename": "CollaborativeApplicationUnderwritingCardProductFeature",
"enabled": true
}
]
}
},
"extensions": {
"requestId": "REQUEST_ID"
}
}
Open an application
When an account holder application is submitted, it triggers an application decision request. If you use collaborative application decisioning, you can respond with a recommended APPROVED or DENIED decision.
In some cases, additional documents may be required to approve an application. For more information on collecting additional documents, see Request Documents for Application Review.
Use the following mutation to open an application for an account holder:
createAccountHolderCardProductApplication
Query
mutation createAccountHolderCardProductApplication(
$input: CreateAccountHolderCardProductApplicationInput!
) {
createAccountHolderCardProductApplication(input: $input) {
__typename
... on AccountHolderCardProductApplication {
id
applicationState {
status
}
updatedAt
createdAt
}
... on UserError {
errors {
errorPath
code
description
}
}
}
}
Variables
{ "input": { "accountHolderId": "ACCOUNT_HOLDER_ID", "cardProductId": "CARD_PRODUCT_ID", "cardHolderAgreementConsent": { "primaryAuthorizedPersonId": "PRIMARY_AUTHORIZED_PERSON_ID", "consentTimestamp": "2021-12-22T17:10:55.662Z" } } }
Result
{
"data": {
"createAccountHolderCardProductApplication": {
"__typename": "AccountHolderCardProductApplication",
"id": "APPLCATION_ID",
"applicationState": {
"status": "PENDING"
},
"cardProduct": {
"id": "CARD_PRODUCT_ID"
},
"accountHolderSnapshot": {
"accountHolderCurrent": {
"id": "ACCOUNT_HOLDER_ID"
},
"name": {
"givenName": "Gerry",
"familyName": "Wolfe"
},
"billingAddress": {
"streetAddress": "123 Main Street",
"locality": "Chicago",
"region": "IL",
"countryCodeAlpha3": "USA",
"postalCode": "60654"
},
"currentVerification": {
"reason": "PENDING",
"results": [],
"status": "PENDING"
}
},
"updatedAt": "2023-09-01T22:27:06.896Z",
"createdAt": "2023-09-01T22:27:06.760Z"
}
},
"extensions": {
"requestId": "REQUEST_ID",
"rateLimit": {
"cost": 19,
"limit": 60060,
"remaining": 60023
}
}
}
Simulate application decision
The Test environment does not run identity verification checks on applications. During testing, you can simulate application approvals or denials using simulation values. These simulation values product tags that result in the following application statuses:
APPROVEDIN_REVIEWDENIED
For more information on using this simulation, see Simulate Underwriting Decision.
Issue a financial account
With an APPROVED application, create a financial account by providing the applicationId as an input variable in the following mutation:
IssueFinancialAccountForApplication
Query
mutation IssueFinancialAccountForApplication(
$input: IssueFinancialAccountForApplicationInput!
) {
issueFinancialAccountForApplication(input: $input) {
... on FinancialAccount {
id
name
createdAt
updatedAt
cardProductApplication {
... on AccountHolderCardProductApplication {
applicationState {
status
}
}
}
cardProduct {
id
vertical
}
activeBillingCycleConfiguration {
billingCycleStartDayOfMonth
paymentDueDayOfMonth
id
__typename
}
features {
__typename
enabled
createdAt
updatedAt
}
owner {
__typename
... on USPersonAccountHolder {
id
}
}
}
}
}
Variables
{ "input": { "applicationId": "APPLICATION_ID", "name": "Test Commercial Revolving Credit Account", "externalId": "ABC123456" } }
Result
{
"data": {
"issueFinancialAccountForApplication": {
"id": "FINANCIAL_ACCOUNT_ID",
"name": "Test Commercial Revolving Credit Account",
"createdAt": "2024-08-09T16:50:45.647Z",
"updatedAt": "2024-08-09T16:50:45.647Z",
"application": {
"id": "APPLICATION_ID",
"createdAt": "2024-08-07T19:51:59.225Z"
},
"cardProduct": {
"id": "CARD_PRODUCT_ID",
"vertical": "COMMERCIAL_CREDIT"
},
"activeBillingCycleConfiguration": null,
"features": [
{
"__typename": "CreditPaymentCardFinancialAccountFeature",
"enabled": true,
"createdAt": "2024-08-09T16:50:45.647Z",
"updatedAt": "2024-08-09T16:50:45.647Z"
},
{
"__typename": "CreditCardAccountFeature",
"enabled": true,
"createdAt": "2024-08-09T16:50:45.647Z",
"updatedAt": "2024-08-09T16:50:45.647Z"
}
],
"owner": {
"__typename": "USBusinessAccountHolder"
}
}
},
"extensions": {
"requestId": "REQUEST_ID",
"rateLimit": {
"cost": 15
}
}
}
Set a credit limit
Setting or updating a credit limit is an asynchronous process to ensure your ledger balances and validations are in check.
You can set or update a financial account’s credit limit by providing the financialAccountID and the credit limit you want to assign to the financial account. Your product funding financial account must have funds equal to or exceeding any credit limit you extend to your account holders.
Use the following mutation to set or update a credit limit:
InitiateFinancialAccountCreditLimitUpdateFromProductFunding
Query
mutation InitiateFinancialAccountCreditLimitUpdateFromProductFunding(
$input: InitiateFinancialAccountCreditLimitUpdateFromProductFundingInput!
) {
initiateFinancialAccountCreditLimitUpdateFromProductFunding(input: $input) {
__typename
... on FinancialAccountCreditLimitUpdateFromProductFunding {
id
status
statusReason
createdAt
updatedAt
memo
amount {
value
currencyCode
}
}
... on UserError {
errors {
code
}
}
... on AccessDeniedError {
message
}
}
}
Variables
{ "input": { "amount": { "value": 450000, "currencyCode": "USD" }, "financialAccountId": "FINANCIAL_ACCOUNT_ID", "memo": "Assign Credit Limit to Financial Account" } }
Result
{
"data": {
"initiateFinancialAccountCreditLimitUpdateFromProductFunding": {
"__typename": "FinancialAccountCreditLimitUpdateFromProductFunding",
"id": "ACCOUNT_TRANSFER_ID",
"status": "PENDING",
"statusReason": null,
"createdAt": "2022-09-26T23:26:36.887Z",
"updatedAt": "2022-09-26T23:26:36.887Z",
"memo": "Assign Credit Limit to Financial Account",
"amount": {
"value": 450000,
"currencyCode": "USD"
}
}
},
"extensions": {
"requestId": "REQUEST_ID"
}
}
Issue a payment card
Once you have created a financial account, you can issue a payment card. By default, all payment cards start as virtual cards. After you issue a virtual card, you can create a physical card order if needed.
Use the following mutation to issue a virtual card:
IssuePaymentCardForFinancialAccount
Query
mutation IssuePaymentCardForFinancialAccount(
$input: IssuePaymentCardForFinancialAccountInput!
) {
issuePaymentCardForFinancialAccount(input: $input) {
... on PaymentCard {
id
bin
last4
expirationDate
network
status
financialAccounts {
id
name
}
restrictedDetails {
... on PaymentCardRestrictedDetails {
cvv
number
}
... on AccessDeniedError {
message
}
}
}
... on UserError {
errors {
errorPath
code
description
}
}
}
}
Variables
{ "input": { "financialAccountId": "FINANCIAL_ACCOUNT_ID", "options": { "activateOnCreate": true, "expirationDate": "2023-01-01T23:59:59Z" } } }
Result
{
"data": {
"issuePaymentCardForFinancialAccount": {
"id": "PAYMENT_CARD_ID",
"bin": "489661",
"last4": "9602",
"expirationDate": "2025-01-01T23:59:59Z",
"network": "MASTERCARD",
"status": "ACTIVE",
"financialAccounts": [
{
"id": "FINANCIAL_ACCOUNT_ID",
"name": "Test Consumer Credit Account"
}
],
"restrictedDetails": {
"message": "Access is denied"
}
}
},
"extensions": {
"requestId": "REQUEST_ID"
}
}
Display payment card data
Highnote recommends using the Card Viewer SDK to securely display payment card data and and reduce PCI non-compliance.
There are two methods for displaying payment card data on your website or application:
- Fetching the data from the Highnote API
- Use the Card Viewer SDK to ensure PCI compliance
To fetch payment card data from the API, use the following query:
FindPaymentCard
Query
query FindPaymentCard($id: ID!) {
node(id: $id) {
... on PaymentCard {
bin
last4
expirationDate
restrictedDetails {
... on PaymentCardRestrictedDetails {
cvv
number
}
}
}
}
}
Variables
{
"id": "PAYMENT_CARD_ID"
}
Result
{
"data": {
"node": {
"bin": "BIN",
"last4": "LAST_4",
"expirationDate": "EXPIRATION_DATE",
"restrictedDetails": {
"cvv": "CVV",
"number": "NUMBER"
}
}
}
}
Schedule repayments
Charge card products account holders to repay their balance in full. An account holder needs to connect a verified external bank account to Highnote to schedule a repayment. Once a verified account is linked, the account holder can use ACH transfers to schedule payments.
Highnote supports the following types of payment schedules:
- Recurring payments
- One-time payments
Connect a verified external bank account
Account holders must have a verified external bank account connected to Highnote to schedule repayments. For more information on connecting external accounts, see Connect External Accounts.
Create a payment schedule
Payment due dates are determined by (1) the financial account's creation date, and (2) the card product's grace period.
You can establish one-time or recurring payment schedules, enabling your customers to schedule payments on their monthly due date or a customized calendar day. Recurring payment schedules are based on a point-in-time balance, such as an outstanding balance, and the ACH transfer amount will be calculated on the scheduled date.
See the scheduled repayments guide for more information on managing, viewing, and canceling payment schedules.
Generate a billing statement
Highnote provides essential data for generating billing statements for financial accounts. To create a billing statement, we recommend creating a template and using the data Highnote provides to fill in the template. For more information on billing statements, see Deliver Statements.
Refer to the following guidelines for creating a billing statement:
- Billing statement data is available at the close of a billing cycle. Credit card product billing period end dates may vary across financial accounts. Typically, statement data is available within 48 hours after the billing period ends.
- To retrieve the current amount due for your card product, reference the
CommercialRevolvingCardFinancialAccountStatementSnapshot. This balance can be presented to your customers outside the billing statement, for example, on your website or application's "account page".
Use the following query to fetch billing statement data:
FindFinancialAccount
Query
fragment statement on CommercialRevolvingCardFinancialAccountStatement {
id
__typename
periodStart
periodEnd
openedAt
closedAt
paymentDueOn
pastDueAmount {
value
currencyCode
}
periodMinimumPaymentDue {
value
currencyCode
}
primaryLedger {
id
name
normalBalance
creditBalance {
value
currencyCode
}
debitBalance {
value
currencyCode
}
}
startingPrimaryCreditBalance {
value
currencyCode
}
startingPrimaryDebitBalance {
value
currencyCode
}
endingPrimaryCreditBalance {
value
currencyCode
}
endingPrimaryDebitBalance {
value
currencyCode
}
periodInterestCharges {
value
currencyCode
}
periodPurchaseCreditPlan {
balanceType
balanceSubjectToInterestAmount {
value
currencyCode
}
interestChargedAmount {
value
currencyCode
}
apr
}
payOffWarning {
paymentCycles {
payOffType
paymentDetails {
periodPayment {
value
currencyCode
}
estimatedTotal {
value
currencyCode
}
estimatedPayOffDays
}
}
}
secondaryLedger {
id
name
normalBalance
creditBalance {
value
currencyCode
}
debitBalance {
value
currencyCode
}
}
startingSecondaryCreditBalance {
value
currencyCode
}
startingSecondaryDebitBalance {
value
currencyCode
}
endingSecondaryCreditBalance {
value
currencyCode
}
endingSecondaryDebitBalance {
value
currencyCode
}
}
query FindFinancialAccount($id: ID!) {
node(id: $id) {
... on FinancialAccount {
id
statementSnapshot {
... on ConsumerRevolvingCardFinancialAccountStatementSnapshot {
currentAmountDue {
value
}
}
... on FinancialAccountStatementSnapshot {
asOf
currentOpenStatement {
...statement
}
latestClosedStatement {
...statement
}
}
}
}
}
}
Variables
{
"id": "FINANCIAL_ACCOUNT_ID"
}
Result
{
"data": {
"node": {
"id": "FINANCIAL_ACCOUNT_ID",
"statementSnapshot": {
"asOf": "2024-08-07T19:58:15.560Z",
"currentOpenStatement": {
"id": "STATEMENT_ID",
"__typename": "CommercialRevolvingCardFinancialAccountStatement",
"periodStart": "2024-08-07T04:00:00.000Z",
"periodEnd": "2024-09-07T04:00:00.000Z",
"openedAt": "2024-08-07T19:58:15.280Z",
"closedAt": null,
"paymentDueOn": "2024-09-17T04:00:00.000Z",
"pastDueAmount": null,
"periodMinimumPaymentDue": null,
"primaryLedger": {
"id": "LEDGER_ID",
"name": "OUTSTANDING_BALANCE_PAYABLE",
"normalBalance": "CREDIT",
"creditBalance": {
"value": 150000,
"currencyCode": "USD"
},
"debitBalance": {
"value": 0,
"currencyCode": "USD"
}
},
"startingPrimaryCreditBalance": {
"value": 150000,
"currencyCode": "USD"
},
"startingPrimaryDebitBalance": {
"value": 0,
"currencyCode": "USD"
},
"endingPrimaryCreditBalance": {
"value": 0,
"currencyCode": "USD"
},
"endingPrimaryDebitBalance": {
"value": 0,
"currencyCode": "USD"
},
"periodInterestCharges": null,
"periodPurchaseCreditPlan": [],
"payOffWarning": {
"paymentCycles": []
},
"secondaryLedger": {
"id": "LEDGER_ID",
"name": "AVAILABLE_CREDIT",
"normalBalance": "CREDIT",
"creditBalance": {
"value": 50000,
"currencyCode": "USD"
},
"debitBalance": {
"value": 0,
"currencyCode": "USD"
}
},
"startingSecondaryCreditBalance": {
"value": 50000,
"currencyCode": "USD"
},
"startingSecondaryDebitBalance": {
"value": 0,
"currencyCode": "USD"
},
"endingSecondaryCreditBalance": {
"value": 0,
"currencyCode": "USD"
},
"endingSecondaryDebitBalance": {
"value": 0,
"currencyCode": "USD"
}
},
"latestClosedStatement": {
"id": "STATEMENT_ID",
"__typename": "CommercialRevolvingCardFinancialAccountStatement",
"periodStart": "2024-02-07T04:00:00.000Z",
"periodEnd": "2024-03-07T04:00:00.000Z",
"openedAt": "2024-08-07T19:53:59.517Z",
"closedAt": "2024-08-07T19:58:15.280Z",
"paymentDueOn": "2024-03-17T04:00:00.000Z",
"pastDueAmount": null,
"periodMinimumPaymentDue": {
"value": 2500,
"currencyCode": "USD"
},
"primaryLedger": {
"id": "LEDGER_ID",
"name": "OUTSTANDING_BALANCE_PAYABLE",
"normalBalance": "CREDIT",
"creditBalance": {
"value": 150000,
"currencyCode": "USD"
},
"debitBalance": {
"value": 0,
"currencyCode": "USD"
}
},
"startingPrimaryCreditBalance": {
"value": 0,
"currencyCode": "USD"
},
"startingPrimaryDebitBalance": {
"value": 0,
"currencyCode": "USD"
},
"endingPrimaryCreditBalance": {
"value": 150000,
"currencyCode": "USD"
},
"endingPrimaryDebitBalance": {
"value": 0,
"currencyCode": "USD"
},
"periodInterestCharges": {
"value": 0,
"currencyCode": "USD"
},
"periodPurchaseCreditPlan": [
{
"balanceType": "PURCHASE",
"balanceSubjectToInterestAmount": {
"value": 150000,
"currencyCode": "USD"
},
"interestChargedAmount": {
"value": 0,
"currencyCode": "USD"
},
"apr": 19.56
}
],
"payOffWarning": {
"paymentCycles": [
{
"payOffType": "MINIMUM_PAY_OFF",
"paymentDetails": {
"periodPayment": {
"value": 2500,
"currencyCode": "USD"
},
"estimatedTotal": {
"value": 272925,
"currencyCode": "USD"
},
"estimatedPayOffDays": 3030
}
},
{
"payOffType": "THREE_YEAR_PAY_OFF",
"paymentDetails": {
"periodPayment": {
"value": 5255,
"currencyCode": "USD"
},
"estimatedTotal": {
"value": 195839,
"currencyCode": "USD"
},
"estimatedPayOffDays": 1095
}
}
]
},
"secondaryLedger": {
"id": "LEDGER_ID",
"name": "AVAILABLE_CREDIT",
"normalBalance": "CREDIT",
"creditBalance": {
"value": 50000,
"currencyCode": "USD"
},
"debitBalance": {
"value": 0,
"currencyCode": "USD"
}
},
"startingSecondaryCreditBalance": {
"value": 0,
"currencyCode": "USD"
},
"startingSecondaryDebitBalance": {
"value": 0,
"currencyCode": "USD"
},
"endingSecondaryCreditBalance": {
"value": 50000,
"currencyCode": "USD"
},
"endingSecondaryDebitBalance": {
"value": 0,
"currencyCode": "USD"
}
}
}
}
},
"extensions": {
"requestId": "REQUEST_ID",
"rateLimit": {
"cost": 55,
"limit": 60060,
"remaining": 60005
}
}
}
Simulate transactions
After configuring your card product, we recommend simulating transactions. Simulating transactions is useful for testing your card program's configuration and settings.
For more information on simulating transactions, see Simulate Transactions.
Simulate delinquency
Highnote's delinquency simulator lets you view a financial account's current delinquency status and receivables by simulating past purchase and payment scenarios. In the Test environment, this helps with understanding delinquency scenarios and testing notification events.
Use the Simulate Delinquency guide for more information on using the Highnote API to simulate delinquency in the Test environment.
Expand your integration
After configuring your card product and simulating transactions, you can use the following features to further expand your integration:
- Create authorization controls to manage spending.
- Create a rewards program for your card product.
- Set up notifications to automate your integration.