<?xml version="1.0" encoding="utf-8"?>
<xbrl
  xml:lang="en-US"
  xmlns="http://www.xbrl.org/2003/instance"
  xmlns:dei="http://xbrl.sec.gov/dei/2023"
  xmlns:ecd="http://xbrl.sec.gov/ecd/2023"
  xmlns:iso4217="http://www.xbrl.org/2003/iso4217"
  xmlns:link="http://www.xbrl.org/2003/linkbase"
  xmlns:spsc="http://www.spscommerce.com/20240404"
  xmlns:us-gaap="http://fasb.org/us-gaap/2023"
  xmlns:xbrldi="http://xbrl.org/2006/xbrldi"
  xmlns:xlink="http://www.w3.org/1999/xlink">
    <link:schemaRef xlink:href="spsc-20240404.xsd" xlink:type="simple"/>
    <context id="c-1">
        <entity>
            <identifier scheme="http://www.sec.gov/CIK">0001092699</identifier>
        </entity>
        <period>
            <startDate>2023-01-01</startDate>
            <endDate>2023-12-31</endDate>
        </period>
    </context>
    <context id="c-2">
        <entity>
            <identifier scheme="http://www.sec.gov/CIK">0001092699</identifier>
            <segment>
                <xbrldi:explicitMember dimension="ecd:IndividualAxis">spsc:ArchieBlackMember</xbrldi:explicitMember>
            </segment>
        </entity>
        <period>
            <startDate>2023-01-01</startDate>
            <endDate>2023-12-31</endDate>
        </period>
    </context>
    <context id="c-3">
        <entity>
            <identifier scheme="http://www.sec.gov/CIK">0001092699</identifier>
            <segment>
                <xbrldi:explicitMember dimension="ecd:IndividualAxis">spsc:ChadCollinsMember</xbrldi:explicitMember>
            </segment>
        </entity>
        <period>
            <startDate>2023-01-01</startDate>
            <endDate>2023-12-31</endDate>
        </period>
    </context>
    <context id="c-4">
        <entity>
            <identifier scheme="http://www.sec.gov/CIK">0001092699</identifier>
            <segment>
                <xbrldi:explicitMember dimension="ecd:IndividualAxis">spsc:ArchieBlackMember</xbrldi:explicitMember>
            </segment>
        </entity>
        <period>
            <startDate>2022-01-01</startDate>
            <endDate>2022-12-31</endDate>
        </period>
    </context>
    <context id="c-5">
        <entity>
            <identifier scheme="http://www.sec.gov/CIK">0001092699</identifier>
        </entity>
        <period>
            <startDate>2022-01-01</startDate>
            <endDate>2022-12-31</endDate>
        </period>
    </context>
    <context id="c-6">
        <entity>
            <identifier scheme="http://www.sec.gov/CIK">0001092699</identifier>
            <segment>
                <xbrldi:explicitMember dimension="ecd:IndividualAxis">spsc:ArchieBlackMember</xbrldi:explicitMember>
            </segment>
        </entity>
        <period>
            <startDate>2021-01-01</startDate>
            <endDate>2021-12-31</endDate>
        </period>
    </context>
    <context id="c-7">
        <entity>
            <identifier scheme="http://www.sec.gov/CIK">0001092699</identifier>
        </entity>
        <period>
            <startDate>2021-01-01</startDate>
            <endDate>2021-12-31</endDate>
        </period>
    </context>
    <context id="c-8">
        <entity>
            <identifier scheme="http://www.sec.gov/CIK">0001092699</identifier>
            <segment>
                <xbrldi:explicitMember dimension="ecd:IndividualAxis">spsc:ArchieBlackMember</xbrldi:explicitMember>
            </segment>
        </entity>
        <period>
            <startDate>2020-01-01</startDate>
            <endDate>2020-12-31</endDate>
        </period>
    </context>
    <context id="c-9">
        <entity>
            <identifier scheme="http://www.sec.gov/CIK">0001092699</identifier>
        </entity>
        <period>
            <startDate>2020-01-01</startDate>
            <endDate>2020-12-31</endDate>
        </period>
    </context>
    <context id="c-10">
        <entity>
            <identifier scheme="http://www.sec.gov/CIK">0001092699</identifier>
            <segment>
                <xbrldi:explicitMember dimension="ecd:AdjToCompAxis">spsc:ValueOfStockAwardsInSummaryCompensationTableMember</xbrldi:explicitMember>
                <xbrldi:explicitMember dimension="ecd:IndividualAxis">spsc:ArchieBlackMember</xbrldi:explicitMember>
            </segment>
        </entity>
        <period>
            <startDate>2023-01-01</startDate>
            <endDate>2023-12-31</endDate>
        </period>
    </context>
    <context id="c-11">
        <entity>
            <identifier scheme="http://www.sec.gov/CIK">0001092699</identifier>
            <segment>
                <xbrldi:explicitMember dimension="ecd:AdjToCompAxis">spsc:ValueOfStockAwardsGrantedDuringTheYearAndUnvestedAsOfYearEndMember</xbrldi:explicitMember>
                <xbrldi:explicitMember dimension="ecd:IndividualAxis">spsc:ArchieBlackMember</xbrldi:explicitMember>
            </segment>
        </entity>
        <period>
            <startDate>2023-01-01</startDate>
            <endDate>2023-12-31</endDate>
        </period>
    </context>
    <context id="c-12">
        <entity>
            <identifier scheme="http://www.sec.gov/CIK">0001092699</identifier>
            <segment>
                <xbrldi:explicitMember dimension="ecd:AdjToCompAxis">spsc:ChangeInValueOfStockAwardsGrantedInPriorYearAndUnvestedAsOfYearEndMember</xbrldi:explicitMember>
                <xbrldi:explicitMember dimension="ecd:IndividualAxis">spsc:ArchieBlackMember</xbrldi:explicitMember>
            </segment>
        </entity>
        <period>
            <startDate>2023-01-01</startDate>
            <endDate>2023-12-31</endDate>
        </period>
    </context>
    <context id="c-13">
        <entity>
            <identifier scheme="http://www.sec.gov/CIK">0001092699</identifier>
            <segment>
                <xbrldi:explicitMember dimension="ecd:AdjToCompAxis">spsc:ChangeInValueOfStockAwardsGrantedInPriorYearAndVestedDuringTheYearMember</xbrldi:explicitMember>
                <xbrldi:explicitMember dimension="ecd:IndividualAxis">spsc:ArchieBlackMember</xbrldi:explicitMember>
            </segment>
        </entity>
        <period>
            <startDate>2023-01-01</startDate>
            <endDate>2023-12-31</endDate>
        </period>
    </context>
    <context id="c-14">
        <entity>
            <identifier scheme="http://www.sec.gov/CIK">0001092699</identifier>
            <segment>
                <xbrldi:explicitMember dimension="ecd:AdjToCompAxis">spsc:ValueOfStockAwardsInSummaryCompensationTableMember</xbrldi:explicitMember>
                <xbrldi:explicitMember dimension="ecd:IndividualAxis">spsc:ArchieBlackMember</xbrldi:explicitMember>
            </segment>
        </entity>
        <period>
            <startDate>2022-01-01</startDate>
            <endDate>2022-12-31</endDate>
        </period>
    </context>
    <context id="c-15">
        <entity>
            <identifier scheme="http://www.sec.gov/CIK">0001092699</identifier>
            <segment>
                <xbrldi:explicitMember dimension="ecd:AdjToCompAxis">spsc:ValueOfStockAwardsGrantedDuringTheYearAndUnvestedAsOfYearEndMember</xbrldi:explicitMember>
                <xbrldi:explicitMember dimension="ecd:IndividualAxis">spsc:ArchieBlackMember</xbrldi:explicitMember>
            </segment>
        </entity>
        <period>
            <startDate>2022-01-01</startDate>
            <endDate>2022-12-31</endDate>
        </period>
    </context>
    <context id="c-16">
        <entity>
            <identifier scheme="http://www.sec.gov/CIK">0001092699</identifier>
            <segment>
                <xbrldi:explicitMember dimension="ecd:AdjToCompAxis">spsc:ChangeInValueOfStockAwardsGrantedInPriorYearAndUnvestedAsOfYearEndMember</xbrldi:explicitMember>
                <xbrldi:explicitMember dimension="ecd:IndividualAxis">spsc:ArchieBlackMember</xbrldi:explicitMember>
            </segment>
        </entity>
        <period>
            <startDate>2022-01-01</startDate>
            <endDate>2022-12-31</endDate>
        </period>
    </context>
    <context id="c-17">
        <entity>
            <identifier scheme="http://www.sec.gov/CIK">0001092699</identifier>
            <segment>
                <xbrldi:explicitMember dimension="ecd:AdjToCompAxis">spsc:ChangeInValueOfStockAwardsGrantedInPriorYearAndVestedDuringTheYearMember</xbrldi:explicitMember>
                <xbrldi:explicitMember dimension="ecd:IndividualAxis">spsc:ArchieBlackMember</xbrldi:explicitMember>
            </segment>
        </entity>
        <period>
            <startDate>2022-01-01</startDate>
            <endDate>2022-12-31</endDate>
        </period>
    </context>
    <context id="c-18">
        <entity>
            <identifier scheme="http://www.sec.gov/CIK">0001092699</identifier>
            <segment>
                <xbrldi:explicitMember dimension="ecd:AdjToCompAxis">spsc:ValueOfStockAwardsInSummaryCompensationTableMember</xbrldi:explicitMember>
                <xbrldi:explicitMember dimension="ecd:IndividualAxis">spsc:ArchieBlackMember</xbrldi:explicitMember>
            </segment>
        </entity>
        <period>
            <startDate>2021-01-01</startDate>
            <endDate>2021-12-31</endDate>
        </period>
    </context>
    <context id="c-19">
        <entity>
            <identifier scheme="http://www.sec.gov/CIK">0001092699</identifier>
            <segment>
                <xbrldi:explicitMember dimension="ecd:AdjToCompAxis">spsc:ValueOfStockAwardsGrantedDuringTheYearAndUnvestedAsOfYearEndMember</xbrldi:explicitMember>
                <xbrldi:explicitMember dimension="ecd:IndividualAxis">spsc:ArchieBlackMember</xbrldi:explicitMember>
            </segment>
        </entity>
        <period>
            <startDate>2021-01-01</startDate>
            <endDate>2021-12-31</endDate>
        </period>
    </context>
    <context id="c-20">
        <entity>
            <identifier scheme="http://www.sec.gov/CIK">0001092699</identifier>
            <segment>
                <xbrldi:explicitMember dimension="ecd:AdjToCompAxis">spsc:ChangeInValueOfStockAwardsGrantedInPriorYearAndUnvestedAsOfYearEndMember</xbrldi:explicitMember>
                <xbrldi:explicitMember dimension="ecd:IndividualAxis">spsc:ArchieBlackMember</xbrldi:explicitMember>
            </segment>
        </entity>
        <period>
            <startDate>2021-01-01</startDate>
            <endDate>2021-12-31</endDate>
        </period>
    </context>
    <context id="c-21">
        <entity>
            <identifier scheme="http://www.sec.gov/CIK">0001092699</identifier>
            <segment>
                <xbrldi:explicitMember dimension="ecd:AdjToCompAxis">spsc:ChangeInValueOfStockAwardsGrantedInPriorYearAndVestedDuringTheYearMember</xbrldi:explicitMember>
                <xbrldi:explicitMember dimension="ecd:IndividualAxis">spsc:ArchieBlackMember</xbrldi:explicitMember>
            </segment>
        </entity>
        <period>
            <startDate>2021-01-01</startDate>
            <endDate>2021-12-31</endDate>
        </period>
    </context>
    <context id="c-22">
        <entity>
            <identifier scheme="http://www.sec.gov/CIK">0001092699</identifier>
            <segment>
                <xbrldi:explicitMember dimension="ecd:AdjToCompAxis">spsc:ValueOfStockAwardsInSummaryCompensationTableMember</xbrldi:explicitMember>
                <xbrldi:explicitMember dimension="ecd:IndividualAxis">spsc:ArchieBlackMember</xbrldi:explicitMember>
            </segment>
        </entity>
        <period>
            <startDate>2020-01-01</startDate>
            <endDate>2020-12-31</endDate>
        </period>
    </context>
    <context id="c-23">
        <entity>
            <identifier scheme="http://www.sec.gov/CIK">0001092699</identifier>
            <segment>
                <xbrldi:explicitMember dimension="ecd:AdjToCompAxis">spsc:ValueOfStockAwardsGrantedDuringTheYearAndUnvestedAsOfYearEndMember</xbrldi:explicitMember>
                <xbrldi:explicitMember dimension="ecd:IndividualAxis">spsc:ArchieBlackMember</xbrldi:explicitMember>
            </segment>
        </entity>
        <period>
            <startDate>2020-01-01</startDate>
            <endDate>2020-12-31</endDate>
        </period>
    </context>
    <context id="c-24">
        <entity>
            <identifier scheme="http://www.sec.gov/CIK">0001092699</identifier>
            <segment>
                <xbrldi:explicitMember dimension="ecd:AdjToCompAxis">spsc:ChangeInValueOfStockAwardsGrantedInPriorYearAndUnvestedAsOfYearEndMember</xbrldi:explicitMember>
                <xbrldi:explicitMember dimension="ecd:IndividualAxis">spsc:ArchieBlackMember</xbrldi:explicitMember>
            </segment>
        </entity>
        <period>
            <startDate>2020-01-01</startDate>
            <endDate>2020-12-31</endDate>
        </period>
    </context>
    <context id="c-25">
        <entity>
            <identifier scheme="http://www.sec.gov/CIK">0001092699</identifier>
            <segment>
                <xbrldi:explicitMember dimension="ecd:AdjToCompAxis">spsc:ChangeInValueOfStockAwardsGrantedInPriorYearAndVestedDuringTheYearMember</xbrldi:explicitMember>
                <xbrldi:explicitMember dimension="ecd:IndividualAxis">spsc:ArchieBlackMember</xbrldi:explicitMember>
            </segment>
        </entity>
        <period>
            <startDate>2020-01-01</startDate>
            <endDate>2020-12-31</endDate>
        </period>
    </context>
    <context id="c-26">
        <entity>
            <identifier scheme="http://www.sec.gov/CIK">0001092699</identifier>
            <segment>
                <xbrldi:explicitMember dimension="ecd:AdjToCompAxis">spsc:ValueOfStockAwardsInSummaryCompensationTableMember</xbrldi:explicitMember>
                <xbrldi:explicitMember dimension="ecd:IndividualAxis">spsc:ChadCollinsMember</xbrldi:explicitMember>
            </segment>
        </entity>
        <period>
            <startDate>2023-01-01</startDate>
            <endDate>2023-12-31</endDate>
        </period>
    </context>
    <context id="c-27">
        <entity>
            <identifier scheme="http://www.sec.gov/CIK">0001092699</identifier>
            <segment>
                <xbrldi:explicitMember dimension="ecd:AdjToCompAxis">spsc:ValueOfStockAwardsGrantedDuringTheYearAndUnvestedAsOfYearEndMember</xbrldi:explicitMember>
                <xbrldi:explicitMember dimension="ecd:IndividualAxis">spsc:ChadCollinsMember</xbrldi:explicitMember>
            </segment>
        </entity>
        <period>
            <startDate>2023-01-01</startDate>
            <endDate>2023-12-31</endDate>
        </period>
    </context>
    <context id="c-28">
        <entity>
            <identifier scheme="http://www.sec.gov/CIK">0001092699</identifier>
            <segment>
                <xbrldi:explicitMember dimension="ecd:AdjToCompAxis">spsc:ValueOfStockAwardsInSummaryCompensationTableMember</xbrldi:explicitMember>
                <xbrldi:explicitMember dimension="ecd:ExecutiveCategoryAxis">ecd:NonPeoNeoMember</xbrldi:explicitMember>
            </segment>
        </entity>
        <period>
            <startDate>2023-01-01</startDate>
            <endDate>2023-12-31</endDate>
        </period>
    </context>
    <context id="c-29">
        <entity>
            <identifier scheme="http://www.sec.gov/CIK">0001092699</identifier>
            <segment>
                <xbrldi:explicitMember dimension="ecd:AdjToCompAxis">spsc:ValueOfStockAwardsGrantedDuringTheYearAndUnvestedAsOfYearEndMember</xbrldi:explicitMember>
                <xbrldi:explicitMember dimension="ecd:ExecutiveCategoryAxis">ecd:NonPeoNeoMember</xbrldi:explicitMember>
            </segment>
        </entity>
        <period>
            <startDate>2023-01-01</startDate>
            <endDate>2023-12-31</endDate>
        </period>
    </context>
    <context id="c-30">
        <entity>
            <identifier scheme="http://www.sec.gov/CIK">0001092699</identifier>
            <segment>
                <xbrldi:explicitMember dimension="ecd:AdjToCompAxis">spsc:ChangeInValueOfStockAwardsGrantedInPriorYearAndUnvestedAsOfYearEndMember</xbrldi:explicitMember>
                <xbrldi:explicitMember dimension="ecd:ExecutiveCategoryAxis">ecd:NonPeoNeoMember</xbrldi:explicitMember>
            </segment>
        </entity>
        <period>
            <startDate>2023-01-01</startDate>
            <endDate>2023-12-31</endDate>
        </period>
    </context>
    <context id="c-31">
        <entity>
            <identifier scheme="http://www.sec.gov/CIK">0001092699</identifier>
            <segment>
                <xbrldi:explicitMember dimension="ecd:AdjToCompAxis">spsc:ChangeInValueOfStockAwardsGrantedInPriorYearAndVestedDuringTheYearMember</xbrldi:explicitMember>
                <xbrldi:explicitMember dimension="ecd:ExecutiveCategoryAxis">ecd:NonPeoNeoMember</xbrldi:explicitMember>
            </segment>
        </entity>
        <period>
            <startDate>2023-01-01</startDate>
            <endDate>2023-12-31</endDate>
        </period>
    </context>
    <context id="c-32">
        <entity>
            <identifier scheme="http://www.sec.gov/CIK">0001092699</identifier>
            <segment>
                <xbrldi:explicitMember dimension="ecd:AdjToCompAxis">spsc:ValueOfStockAwardsInSummaryCompensationTableMember</xbrldi:explicitMember>
                <xbrldi:explicitMember dimension="ecd:ExecutiveCategoryAxis">ecd:NonPeoNeoMember</xbrldi:explicitMember>
            </segment>
        </entity>
        <period>
            <startDate>2022-01-01</startDate>
            <endDate>2022-12-31</endDate>
        </period>
    </context>
    <context id="c-33">
        <entity>
            <identifier scheme="http://www.sec.gov/CIK">0001092699</identifier>
            <segment>
                <xbrldi:explicitMember dimension="ecd:AdjToCompAxis">spsc:ValueOfStockAwardsGrantedDuringTheYearAndUnvestedAsOfYearEndMember</xbrldi:explicitMember>
                <xbrldi:explicitMember dimension="ecd:ExecutiveCategoryAxis">ecd:NonPeoNeoMember</xbrldi:explicitMember>
            </segment>
        </entity>
        <period>
            <startDate>2022-01-01</startDate>
            <endDate>2022-12-31</endDate>
        </period>
    </context>
    <context id="c-34">
        <entity>
            <identifier scheme="http://www.sec.gov/CIK">0001092699</identifier>
            <segment>
                <xbrldi:explicitMember dimension="ecd:AdjToCompAxis">spsc:ChangeInValueOfStockAwardsGrantedInPriorYearAndUnvestedAsOfYearEndMember</xbrldi:explicitMember>
                <xbrldi:explicitMember dimension="ecd:ExecutiveCategoryAxis">ecd:NonPeoNeoMember</xbrldi:explicitMember>
            </segment>
        </entity>
        <period>
            <startDate>2022-01-01</startDate>
            <endDate>2022-12-31</endDate>
        </period>
    </context>
    <context id="c-35">
        <entity>
            <identifier scheme="http://www.sec.gov/CIK">0001092699</identifier>
            <segment>
                <xbrldi:explicitMember dimension="ecd:AdjToCompAxis">spsc:ChangeInValueOfStockAwardsGrantedInPriorYearAndVestedDuringTheYearMember</xbrldi:explicitMember>
                <xbrldi:explicitMember dimension="ecd:ExecutiveCategoryAxis">ecd:NonPeoNeoMember</xbrldi:explicitMember>
            </segment>
        </entity>
        <period>
            <startDate>2022-01-01</startDate>
            <endDate>2022-12-31</endDate>
        </period>
    </context>
    <context id="c-36">
        <entity>
            <identifier scheme="http://www.sec.gov/CIK">0001092699</identifier>
            <segment>
                <xbrldi:explicitMember dimension="ecd:AdjToCompAxis">spsc:ValueOfStockAwardsInSummaryCompensationTableMember</xbrldi:explicitMember>
                <xbrldi:explicitMember dimension="ecd:ExecutiveCategoryAxis">ecd:NonPeoNeoMember</xbrldi:explicitMember>
            </segment>
        </entity>
        <period>
            <startDate>2021-01-01</startDate>
            <endDate>2021-12-31</endDate>
        </period>
    </context>
    <context id="c-37">
        <entity>
            <identifier scheme="http://www.sec.gov/CIK">0001092699</identifier>
            <segment>
                <xbrldi:explicitMember dimension="ecd:AdjToCompAxis">spsc:ValueOfStockAwardsGrantedDuringTheYearAndUnvestedAsOfYearEndMember</xbrldi:explicitMember>
                <xbrldi:explicitMember dimension="ecd:ExecutiveCategoryAxis">ecd:NonPeoNeoMember</xbrldi:explicitMember>
            </segment>
        </entity>
        <period>
            <startDate>2021-01-01</startDate>
            <endDate>2021-12-31</endDate>
        </period>
    </context>
    <context id="c-38">
        <entity>
            <identifier scheme="http://www.sec.gov/CIK">0001092699</identifier>
            <segment>
                <xbrldi:explicitMember dimension="ecd:AdjToCompAxis">spsc:ChangeInValueOfStockAwardsGrantedInPriorYearAndUnvestedAsOfYearEndMember</xbrldi:explicitMember>
                <xbrldi:explicitMember dimension="ecd:ExecutiveCategoryAxis">ecd:NonPeoNeoMember</xbrldi:explicitMember>
            </segment>
        </entity>
        <period>
            <startDate>2021-01-01</startDate>
            <endDate>2021-12-31</endDate>
        </period>
    </context>
    <context id="c-39">
        <entity>
            <identifier scheme="http://www.sec.gov/CIK">0001092699</identifier>
            <segment>
                <xbrldi:explicitMember dimension="ecd:AdjToCompAxis">spsc:ChangeInValueOfStockAwardsGrantedInPriorYearAndVestedDuringTheYearMember</xbrldi:explicitMember>
                <xbrldi:explicitMember dimension="ecd:ExecutiveCategoryAxis">ecd:NonPeoNeoMember</xbrldi:explicitMember>
            </segment>
        </entity>
        <period>
            <startDate>2021-01-01</startDate>
            <endDate>2021-12-31</endDate>
        </period>
    </context>
    <context id="c-40">
        <entity>
            <identifier scheme="http://www.sec.gov/CIK">0001092699</identifier>
            <segment>
                <xbrldi:explicitMember dimension="ecd:AdjToCompAxis">spsc:ValueOfStockAwardsInSummaryCompensationTableMember</xbrldi:explicitMember>
                <xbrldi:explicitMember dimension="ecd:ExecutiveCategoryAxis">ecd:NonPeoNeoMember</xbrldi:explicitMember>
            </segment>
        </entity>
        <period>
            <startDate>2020-01-01</startDate>
            <endDate>2020-12-31</endDate>
        </period>
    </context>
    <context id="c-41">
        <entity>
            <identifier scheme="http://www.sec.gov/CIK">0001092699</identifier>
            <segment>
                <xbrldi:explicitMember dimension="ecd:AdjToCompAxis">spsc:ValueOfStockAwardsGrantedDuringTheYearAndUnvestedAsOfYearEndMember</xbrldi:explicitMember>
                <xbrldi:explicitMember dimension="ecd:ExecutiveCategoryAxis">ecd:NonPeoNeoMember</xbrldi:explicitMember>
            </segment>
        </entity>
        <period>
            <startDate>2020-01-01</startDate>
            <endDate>2020-12-31</endDate>
        </period>
    </context>
    <context id="c-42">
        <entity>
            <identifier scheme="http://www.sec.gov/CIK">0001092699</identifier>
            <segment>
                <xbrldi:explicitMember dimension="ecd:AdjToCompAxis">spsc:ChangeInValueOfStockAwardsGrantedInPriorYearAndUnvestedAsOfYearEndMember</xbrldi:explicitMember>
                <xbrldi:explicitMember dimension="ecd:ExecutiveCategoryAxis">ecd:NonPeoNeoMember</xbrldi:explicitMember>
            </segment>
        </entity>
        <period>
            <startDate>2020-01-01</startDate>
            <endDate>2020-12-31</endDate>
        </period>
    </context>
    <context id="c-43">
        <entity>
            <identifier scheme="http://www.sec.gov/CIK">0001092699</identifier>
            <segment>
                <xbrldi:explicitMember dimension="ecd:AdjToCompAxis">spsc:ChangeInValueOfStockAwardsGrantedInPriorYearAndVestedDuringTheYearMember</xbrldi:explicitMember>
                <xbrldi:explicitMember dimension="ecd:ExecutiveCategoryAxis">ecd:NonPeoNeoMember</xbrldi:explicitMember>
            </segment>
        </entity>
        <period>
            <startDate>2020-01-01</startDate>
            <endDate>2020-12-31</endDate>
        </period>
    </context>
    <unit id="usd">
        <measure>iso4217:USD</measure>
    </unit>
    <dei:EntityCentralIndexKey contextRef="c-1" id="f-1">0001092699</dei:EntityCentralIndexKey>
    <dei:AmendmentFlag contextRef="c-1" id="f-2">false</dei:AmendmentFlag>
    <dei:DocumentType contextRef="c-1" id="f-3">DEF 14A</dei:DocumentType>
    <dei:EntityRegistrantName contextRef="c-1" id="f-4">SPS COMMERCE, INC.</dei:EntityRegistrantName>
    <ecd:PvpTableTextBlock contextRef="c-1" id="f-5">&lt;div style="margin-bottom:0.1pt"&gt;&lt;table style="border-collapse:collapse;display:inline-table;margin-bottom:5pt;vertical-align:text-bottom;width:99.519%"&gt;&lt;tr&gt;&lt;td style="width:1.0%"&gt;&lt;/td&gt;&lt;td style="width:5.502%"&gt;&lt;/td&gt;&lt;td style="width:0.1%"&gt;&lt;/td&gt;&lt;td style="width:0.1%"&gt;&lt;/td&gt;&lt;td style="width:0.444%"&gt;&lt;/td&gt;&lt;td style="width:0.1%"&gt;&lt;/td&gt;&lt;td style="width:1.0%"&gt;&lt;/td&gt;&lt;td style="width:6.468%"&gt;&lt;/td&gt;&lt;td style="width:0.1%"&gt;&lt;/td&gt;&lt;td style="width:0.1%"&gt;&lt;/td&gt;&lt;td style="width:0.444%"&gt;&lt;/td&gt;&lt;td style="width:0.1%"&gt;&lt;/td&gt;&lt;td style="width:1.0%"&gt;&lt;/td&gt;&lt;td style="width:6.468%"&gt;&lt;/td&gt;&lt;td style="width:0.1%"&gt;&lt;/td&gt;&lt;td style="width:0.1%"&gt;&lt;/td&gt;&lt;td style="width:0.444%"&gt;&lt;/td&gt;&lt;td style="width:0.1%"&gt;&lt;/td&gt;&lt;td style="width:1.0%"&gt;&lt;/td&gt;&lt;td style="width:6.468%"&gt;&lt;/td&gt;&lt;td style="width:0.1%"&gt;&lt;/td&gt;&lt;td style="width:0.1%"&gt;&lt;/td&gt;&lt;td style="width:0.444%"&gt;&lt;/td&gt;&lt;td style="width:0.1%"&gt;&lt;/td&gt;&lt;td style="width:1.0%"&gt;&lt;/td&gt;&lt;td style="width:6.468%"&gt;&lt;/td&gt;&lt;td style="width:0.1%"&gt;&lt;/td&gt;&lt;td style="width:0.1%"&gt;&lt;/td&gt;&lt;td style="width:0.444%"&gt;&lt;/td&gt;&lt;td style="width:0.1%"&gt;&lt;/td&gt;&lt;td style="width:1.0%"&gt;&lt;/td&gt;&lt;td style="width:9.689%"&gt;&lt;/td&gt;&lt;td style="width:0.1%"&gt;&lt;/td&gt;&lt;td style="width:0.1%"&gt;&lt;/td&gt;&lt;td style="width:0.444%"&gt;&lt;/td&gt;&lt;td style="width:0.1%"&gt;&lt;/td&gt;&lt;td style="width:1.0%"&gt;&lt;/td&gt;&lt;td style="width:9.689%"&gt;&lt;/td&gt;&lt;td style="width:0.1%"&gt;&lt;/td&gt;&lt;td style="width:0.1%"&gt;&lt;/td&gt;&lt;td style="width:0.444%"&gt;&lt;/td&gt;&lt;td style="width:0.1%"&gt;&lt;/td&gt;&lt;td style="width:1.0%"&gt;&lt;/td&gt;&lt;td style="width:6.629%"&gt;&lt;/td&gt;&lt;td style="width:0.1%"&gt;&lt;/td&gt;&lt;td style="width:0.1%"&gt;&lt;/td&gt;&lt;td style="width:0.927%"&gt;&lt;/td&gt;&lt;td style="width:0.1%"&gt;&lt;/td&gt;&lt;td style="width:1.0%"&gt;&lt;/td&gt;&lt;td style="width:6.629%"&gt;&lt;/td&gt;&lt;td style="width:0.1%"&gt;&lt;/td&gt;&lt;td style="width:0.1%"&gt;&lt;/td&gt;&lt;td style="width:0.444%"&gt;&lt;/td&gt;&lt;td style="width:0.1%"&gt;&lt;/td&gt;&lt;td style="width:1.0%"&gt;&lt;/td&gt;&lt;td style="width:7.756%"&gt;&lt;/td&gt;&lt;td style="width:0.1%"&gt;&lt;/td&gt;&lt;td style="width:0.1%"&gt;&lt;/td&gt;&lt;td style="width:0.927%"&gt;&lt;/td&gt;&lt;td style="width:0.1%"&gt;&lt;/td&gt;&lt;td style="width:1.0%"&gt;&lt;/td&gt;&lt;td style="width:8.728%"&gt;&lt;/td&gt;&lt;td style="width:0.1%"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height:33pt"&gt;&lt;td colspan="3" style="padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="9" style="padding:2px 1pt;text-align:left;vertical-align:bottom"&gt;&lt;div style="margin-bottom:0.1pt;text-align:center"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:700;line-height:120%"&gt;Summary Compensation Table Total for PEO &lt;/span&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:4.55pt;font-weight:700;line-height:120%;position:relative;top:-2.44pt;vertical-align:baseline"&gt;(1)&lt;/span&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:700;line-height:120%"&gt; ($)&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="9" style="padding:2px 1pt;text-align:left;vertical-align:bottom"&gt;&lt;div style="margin-bottom:0.1pt;text-align:center"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:700;line-height:120%"&gt;Compensation Actually Paid to PEO &lt;/span&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:4.55pt;font-weight:700;line-height:120%;position:relative;top:-2.44pt;vertical-align:baseline"&gt;(2)&lt;/span&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:700;line-height:120%"&gt; ($)&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" rowspan="2" style="padding:2px 1pt;text-align:left;vertical-align:bottom"&gt;&lt;div style="margin-bottom:0.1pt;text-align:center"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:700;line-height:120%"&gt;Average Summary Compensation Table Total for Non-PEO NEOs&lt;/span&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:4.55pt;font-weight:700;line-height:120%;position:relative;top:-2.44pt;vertical-align:baseline"&gt;(1)&lt;/span&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:700;line-height:120%"&gt; ($)&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" rowspan="2" style="padding:2px 1pt;text-align:left;vertical-align:bottom"&gt;&lt;div style="margin-bottom:0.1pt;text-align:center"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:700;line-height:120%"&gt;Average Compensation Actually Paid to Non-PEO NEOs&lt;/span&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:4.55pt;font-weight:700;line-height:120%;position:relative;top:-2.44pt;vertical-align:baseline"&gt;(2)&lt;/span&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:700;line-height:120%"&gt; ($)&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="9" style="padding:2px 1pt;text-align:left;vertical-align:bottom"&gt;&lt;div style="margin-bottom:0.1pt;text-align:center"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:700;line-height:120%"&gt;Value of Initial Fixed $100 Investment Based On&lt;/span&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:4.55pt;font-weight:700;line-height:120%;position:relative;top:-2.44pt;vertical-align:baseline"&gt;(3)&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" rowspan="2" style="padding:2px 1pt;text-align:center;vertical-align:bottom"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:700;line-height:120%"&gt;Net Income ($)&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" rowspan="2" style="padding:2px 1pt;text-align:left;vertical-align:bottom"&gt;&lt;div style="margin-bottom:0.1pt;text-align:center"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:700;line-height:120%"&gt;Company Selected Measure: Adjusted EBITDA&lt;/span&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:4.55pt;font-weight:700;line-height:120%;position:relative;top:-2.44pt;vertical-align:baseline"&gt;(5)&lt;/span&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:700;line-height:120%"&gt; ($)&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height:26pt"&gt;&lt;td colspan="3" style="padding:2px 1pt;text-align:center;vertical-align:bottom"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:700;line-height:120%"&gt;Year&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="border-top:1pt solid #000;padding:2px 1pt;text-align:left;vertical-align:bottom"&gt;&lt;div style="margin-bottom:0.1pt;text-align:center"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:700;line-height:120%"&gt;Former PEO (Black)&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan="3" style="border-top:1pt solid #000;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="border-top:1pt solid #000;padding:2px 1pt;text-align:left;vertical-align:bottom"&gt;&lt;div style="margin-bottom:0.1pt;text-align:center"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:700;line-height:120%"&gt;Current PEO (Collins)&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="border-top:1pt solid #000;padding:2px 1pt;text-align:left;vertical-align:bottom"&gt;&lt;div style="margin-bottom:0.1pt;text-align:center"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:700;line-height:120%"&gt;Former PEO (Black)&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan="3" style="border-top:1pt solid #000;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="border-top:1pt solid #000;padding:2px 1pt;text-align:left;vertical-align:bottom"&gt;&lt;div style="margin-bottom:0.1pt;text-align:center"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:700;line-height:120%"&gt;Current PEO (Collins)&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="border-top:1pt solid #000;padding:2px 1pt;text-align:center;vertical-align:bottom"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:700;line-height:120%"&gt;Company TSR ($)&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="border-top:1pt solid #000;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="border-top:1pt solid #000;padding:2px 1pt;text-align:left;vertical-align:bottom"&gt;&lt;div style="margin-bottom:0.1pt;text-align:center"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:700;line-height:120%"&gt;Peer Group TSR&lt;/span&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:4.55pt;font-weight:700;line-height:120%;position:relative;top:-2.44pt;vertical-align:baseline"&gt;(4)&lt;/span&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:700;line-height:120%"&gt; ($)&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:0 1pt"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="3" style="background-color:#dbdbdb;border-top:1pt solid #000;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;2023&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;border-top:1pt solid #000;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;9,616,696&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;border-top:1pt solid #000;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;6,752,127&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;border-top:1pt solid #000;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;26,705,325&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;border-top:1pt solid #000;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;7,973,866&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;border-top:1pt solid #000;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;4,535,894&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;border-top:1pt solid #000;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;16,538,822&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;border-top:1pt solid #000;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;350&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;border-top:1pt solid #000;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;221&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;border-top:1pt solid #000;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;65,824,000&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;border-top:1pt solid #000;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;157,630,000&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;2022&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;6,066,081&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;&#x2014;&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;4,501,154&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;&#x2014;&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;3,632,052&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;2,919,066&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;232&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;133&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;55,134,000&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;132,268,000&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;2021&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;6,693,464&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;&#x2014;&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;14,052,465&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;&#x2014;&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;3,829,274&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;7,227,613&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;257&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;207&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;44,597,000&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;107,015,000&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;2020&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;4,810,804&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;&#x2014;&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;18,046,825&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;&#x2014;&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;2,283,243&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;8,625,426&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;196&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;150&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;45,586,000&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;86,994,000&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;</ecd:PvpTableTextBlock>
    <ecd:CoSelectedMeasureName contextRef="c-1" id="f-6">Company Selected Measure: Adjusted EBITDA(5) ($)</ecd:CoSelectedMeasureName>
    <ecd:PeoTotalCompAmt contextRef="c-2" decimals="0" id="f-7" unitRef="usd">9616696</ecd:PeoTotalCompAmt>
    <ecd:PeoTotalCompAmt contextRef="c-3" decimals="0" id="f-8" unitRef="usd">6752127</ecd:PeoTotalCompAmt>
    <ecd:PeoActuallyPaidCompAmt contextRef="c-2" decimals="0" id="f-9" unitRef="usd">26705325</ecd:PeoActuallyPaidCompAmt>
    <ecd:PeoActuallyPaidCompAmt contextRef="c-3" decimals="0" id="f-10" unitRef="usd">7973866</ecd:PeoActuallyPaidCompAmt>
    <ecd:NonPeoNeoAvgTotalCompAmt contextRef="c-1" decimals="0" id="f-11" unitRef="usd">4535894</ecd:NonPeoNeoAvgTotalCompAmt>
    <ecd:NonPeoNeoAvgCompActuallyPaidAmt contextRef="c-1" decimals="0" id="f-12" unitRef="usd">16538822</ecd:NonPeoNeoAvgCompActuallyPaidAmt>
    <ecd:TotalShareholderRtnAmt contextRef="c-1" decimals="0" id="f-13" unitRef="usd">350</ecd:TotalShareholderRtnAmt>
    <ecd:PeerGroupTotalShareholderRtnAmt contextRef="c-1" decimals="0" id="f-14" unitRef="usd">221</ecd:PeerGroupTotalShareholderRtnAmt>
    <us-gaap:NetIncomeLoss contextRef="c-1" decimals="0" id="f-15" unitRef="usd">65824000</us-gaap:NetIncomeLoss>
    <ecd:CoSelectedMeasureAmt contextRef="c-1" decimals="0" id="f-16" unitRef="usd">157630000</ecd:CoSelectedMeasureAmt>
    <ecd:PeoTotalCompAmt contextRef="c-4" decimals="0" id="f-17" unitRef="usd">6066081</ecd:PeoTotalCompAmt>
    <ecd:PeoActuallyPaidCompAmt contextRef="c-4" decimals="0" id="f-18" unitRef="usd">4501154</ecd:PeoActuallyPaidCompAmt>
    <ecd:NonPeoNeoAvgTotalCompAmt contextRef="c-5" decimals="0" id="f-19" unitRef="usd">3632052</ecd:NonPeoNeoAvgTotalCompAmt>
    <ecd:NonPeoNeoAvgCompActuallyPaidAmt contextRef="c-5" decimals="0" id="f-20" unitRef="usd">2919066</ecd:NonPeoNeoAvgCompActuallyPaidAmt>
    <ecd:TotalShareholderRtnAmt contextRef="c-5" decimals="0" id="f-21" unitRef="usd">232</ecd:TotalShareholderRtnAmt>
    <ecd:PeerGroupTotalShareholderRtnAmt contextRef="c-5" decimals="0" id="f-22" unitRef="usd">133</ecd:PeerGroupTotalShareholderRtnAmt>
    <us-gaap:NetIncomeLoss contextRef="c-5" decimals="0" id="f-23" unitRef="usd">55134000</us-gaap:NetIncomeLoss>
    <ecd:CoSelectedMeasureAmt contextRef="c-5" decimals="0" id="f-24" unitRef="usd">132268000</ecd:CoSelectedMeasureAmt>
    <ecd:PeoTotalCompAmt contextRef="c-6" decimals="0" id="f-25" unitRef="usd">6693464</ecd:PeoTotalCompAmt>
    <ecd:PeoActuallyPaidCompAmt contextRef="c-6" decimals="0" id="f-26" unitRef="usd">14052465</ecd:PeoActuallyPaidCompAmt>
    <ecd:NonPeoNeoAvgTotalCompAmt contextRef="c-7" decimals="0" id="f-27" unitRef="usd">3829274</ecd:NonPeoNeoAvgTotalCompAmt>
    <ecd:NonPeoNeoAvgCompActuallyPaidAmt contextRef="c-7" decimals="0" id="f-28" unitRef="usd">7227613</ecd:NonPeoNeoAvgCompActuallyPaidAmt>
    <ecd:TotalShareholderRtnAmt contextRef="c-7" decimals="0" id="f-29" unitRef="usd">257</ecd:TotalShareholderRtnAmt>
    <ecd:PeerGroupTotalShareholderRtnAmt contextRef="c-7" decimals="0" id="f-30" unitRef="usd">207</ecd:PeerGroupTotalShareholderRtnAmt>
    <us-gaap:NetIncomeLoss contextRef="c-7" decimals="0" id="f-31" unitRef="usd">44597000</us-gaap:NetIncomeLoss>
    <ecd:CoSelectedMeasureAmt contextRef="c-7" decimals="0" id="f-32" unitRef="usd">107015000</ecd:CoSelectedMeasureAmt>
    <ecd:PeoTotalCompAmt contextRef="c-8" decimals="0" id="f-33" unitRef="usd">4810804</ecd:PeoTotalCompAmt>
    <ecd:PeoActuallyPaidCompAmt contextRef="c-8" decimals="0" id="f-34" unitRef="usd">18046825</ecd:PeoActuallyPaidCompAmt>
    <ecd:NonPeoNeoAvgTotalCompAmt contextRef="c-9" decimals="0" id="f-35" unitRef="usd">2283243</ecd:NonPeoNeoAvgTotalCompAmt>
    <ecd:NonPeoNeoAvgCompActuallyPaidAmt contextRef="c-9" decimals="0" id="f-36" unitRef="usd">8625426</ecd:NonPeoNeoAvgCompActuallyPaidAmt>
    <ecd:TotalShareholderRtnAmt contextRef="c-9" decimals="0" id="f-37" unitRef="usd">196</ecd:TotalShareholderRtnAmt>
    <ecd:PeerGroupTotalShareholderRtnAmt contextRef="c-9" decimals="0" id="f-38" unitRef="usd">150</ecd:PeerGroupTotalShareholderRtnAmt>
    <us-gaap:NetIncomeLoss contextRef="c-9" decimals="0" id="f-39" unitRef="usd">45586000</us-gaap:NetIncomeLoss>
    <ecd:CoSelectedMeasureAmt contextRef="c-9" decimals="0" id="f-40" unitRef="usd">86994000</ecd:CoSelectedMeasureAmt>
    <ecd:PeoName contextRef="c-2" id="f-41">Archie Black</ecd:PeoName>
    <ecd:PeoName contextRef="c-3" id="f-42">Chad Collins</ecd:PeoName>
    <ecd:NamedExecutiveOfficersFnTextBlock contextRef="c-1" id="f-43">For all periods presented, Kimberly Nelson and James Frome served as our non-PEO NEOs.</ecd:NamedExecutiveOfficersFnTextBlock>
    <ecd:AdjToPeoCompFnTextBlock contextRef="c-1" id="f-44">&lt;div style="margin-bottom:0.1pt;padding-left:18pt;padding-right:0.8pt"&gt;&lt;table style="border-collapse:collapse;display:inline-table;margin-bottom:5pt;vertical-align:text-bottom;width:96.153%"&gt;&lt;tr&gt;&lt;td style="width:1.0%"&gt;&lt;/td&gt;&lt;td style="width:6.066%"&gt;&lt;/td&gt;&lt;td style="width:0.1%"&gt;&lt;/td&gt;&lt;td style="width:1.0%"&gt;&lt;/td&gt;&lt;td style="width:4.900%"&gt;&lt;/td&gt;&lt;td style="width:0.1%"&gt;&lt;/td&gt;&lt;td style="width:0.1%"&gt;&lt;/td&gt;&lt;td style="width:0.466%"&gt;&lt;/td&gt;&lt;td style="width:0.1%"&gt;&lt;/td&gt;&lt;td style="width:1.0%"&gt;&lt;/td&gt;&lt;td style="width:12.733%"&gt;&lt;/td&gt;&lt;td style="width:0.1%"&gt;&lt;/td&gt;&lt;td style="width:0.1%"&gt;&lt;/td&gt;&lt;td style="width:0.466%"&gt;&lt;/td&gt;&lt;td style="width:0.1%"&gt;&lt;/td&gt;&lt;td style="width:1.0%"&gt;&lt;/td&gt;&lt;td style="width:13.566%"&gt;&lt;/td&gt;&lt;td style="width:0.1%"&gt;&lt;/td&gt;&lt;td style="width:0.1%"&gt;&lt;/td&gt;&lt;td style="width:0.466%"&gt;&lt;/td&gt;&lt;td style="width:0.1%"&gt;&lt;/td&gt;&lt;td style="width:1.0%"&gt;&lt;/td&gt;&lt;td style="width:13.733%"&gt;&lt;/td&gt;&lt;td style="width:0.1%"&gt;&lt;/td&gt;&lt;td style="width:0.1%"&gt;&lt;/td&gt;&lt;td style="width:0.466%"&gt;&lt;/td&gt;&lt;td style="width:0.1%"&gt;&lt;/td&gt;&lt;td style="width:1.0%"&gt;&lt;/td&gt;&lt;td style="width:12.733%"&gt;&lt;/td&gt;&lt;td style="width:0.1%"&gt;&lt;/td&gt;&lt;td style="width:0.1%"&gt;&lt;/td&gt;&lt;td style="width:0.466%"&gt;&lt;/td&gt;&lt;td style="width:0.1%"&gt;&lt;/td&gt;&lt;td style="width:1.0%"&gt;&lt;/td&gt;&lt;td style="width:13.400%"&gt;&lt;/td&gt;&lt;td style="width:0.1%"&gt;&lt;/td&gt;&lt;td style="width:0.1%"&gt;&lt;/td&gt;&lt;td style="width:0.466%"&gt;&lt;/td&gt;&lt;td style="width:0.1%"&gt;&lt;/td&gt;&lt;td style="width:1.0%"&gt;&lt;/td&gt;&lt;td style="width:10.073%"&gt;&lt;/td&gt;&lt;td style="width:0.1%"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="3" style="padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:2px 1pt;text-align:center;vertical-align:bottom"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-style:italic;font-weight:400;line-height:120%"&gt;Base&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:2px 1pt;text-align:center;vertical-align:bottom"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-style:italic;font-weight:400;line-height:120%"&gt;Less&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:2px 1pt;text-align:center;vertical-align:bottom"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-style:italic;font-weight:400;line-height:120%"&gt;Plus&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:2px 1pt;text-align:center;vertical-align:bottom"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-style:italic;font-weight:400;line-height:120%"&gt;Plus or (Less)&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:2px 1pt;text-align:center;vertical-align:bottom"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-style:italic;font-weight:400;line-height:120%"&gt;Plus or (Less)&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:2px 1pt;text-align:center;vertical-align:bottom"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-style:italic;font-weight:400;line-height:120%"&gt;Total&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="3" style="padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:2px 1pt;text-align:center;vertical-align:bottom"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:700;line-height:120%"&gt;Year&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:2px 1pt;text-align:center;vertical-align:bottom"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:700;line-height:120%"&gt;Summary Compensation Table - Total Compensation ($)&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:2px 1pt;text-align:center;vertical-align:bottom"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:700;line-height:120%"&gt;Grant Date Fair Value of Stock Awards and Option Awards Granted in Fiscal Year ($)&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:2px 1pt;text-align:center;vertical-align:bottom"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:700;line-height:120%"&gt;Fair Value at Fiscal Year-End of Outstanding and Unvested Stock Awards and Option Awards Granted in Fiscal Year ($)&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:2px 1pt;text-align:center;vertical-align:bottom"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:700;line-height:120%"&gt;Change in Fair Value of Outstanding and Unvested Stock Awards and Option Awards Granted in Prior Fiscal Years ($)&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:2px 1pt;text-align:center;vertical-align:bottom"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:700;line-height:120%"&gt;Change in Fair Value as of Vesting Date of Stock Awards and Option Awards Granted in Prior Fiscal Years For Which Applicable Vesting Conditions Were Satisfied During Fiscal Year ($)&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:2px 1pt;text-align:center;vertical-align:bottom"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:700;line-height:120%"&gt;Compensation Actually Paid ($)&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height:14pt"&gt;&lt;td colspan="3" rowspan="4" style="padding:2px 1pt;text-align:left;vertical-align:middle"&gt;&lt;div style="margin-bottom:0.1pt;text-align:center"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:700;line-height:120%"&gt;Former PEO (Black)&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;border-top:1pt solid #000;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;2023&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;border-top:1pt solid #000;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;9,616,696&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;border-top:1pt solid #000;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;(8,315,596)&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;border-top:1pt solid #000;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;14,299,748&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;border-top:1pt solid #000;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;4,395,649&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;border-top:1pt solid #000;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;6,708,828&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;border-top:1pt solid #000;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;border-top:1pt solid #000;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;26,705,325&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height:14pt"&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;2022&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;6,066,081&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;(5,089,381)&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;5,376,891&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;(835,723)&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;(1,016,714)&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;4,501,154&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height:15pt"&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;2021&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;6,693,464&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;(5,241,434)&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;7,196,040&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;5,349,429&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;54,966&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;14,052,465&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height:14pt"&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;2020&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;4,810,804&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;(3,892,234)&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;10,643,528&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;5,921,853&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;562,874&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;18,046,825&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height:14pt"&gt;&lt;td colspan="3" rowspan="3" style="padding:2px 1pt;text-align:left;vertical-align:middle"&gt;&lt;div style="margin-bottom:0.1pt;text-align:center"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:700;line-height:120%"&gt;Current PEO (Collins)&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:0 1pt"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height:20pt"&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;2023&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;6,752,127&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;(6,499,877)&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;7,721,616&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;&#x2014;&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;&#x2014;&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;7,973,866&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height:14pt"&gt;&lt;td colspan="3" style="padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="padding:0 1pt"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height:14pt"&gt;&lt;td colspan="3" rowspan="4" style="padding:2px 1pt;text-align:left;vertical-align:middle"&gt;&lt;div style="margin-bottom:0.1pt;text-align:center"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:700;line-height:120%"&gt;Non-PEO NEO Average&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;2023&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;4,535,894&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;(3,591,994)&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;10,151,683&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;4,752,143&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;691,096&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;16,538,822&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height:14pt"&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;2022&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;3,632,052&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;(2,937,683)&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;3,103,639&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;(295,785)&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;(583,157)&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;2,919,066&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height:14pt"&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;2021&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;3,829,274&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;(2,821,974)&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;3,874,330&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;2,301,858&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;44,125&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;7,227,613&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height:14pt"&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;2020&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;2,283,243&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;(1,658,387)&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;4,317,603&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;3,379,146&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;303,821&lt;/span&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:0 1pt"&gt;&lt;/td&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:2px 1pt;text-align:center;vertical-align:middle"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7pt;font-weight:400;line-height:120%"&gt;8,625,426&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;</ecd:AdjToPeoCompFnTextBlock>
    <ecd:PeoTotalCompAmt contextRef="c-2" decimals="0" id="f-45" unitRef="usd">9616696</ecd:PeoTotalCompAmt>
    <ecd:AdjToCompAmt contextRef="c-10" decimals="0" id="f-46" unitRef="usd">-8315596</ecd:AdjToCompAmt>
    <ecd:AdjToCompAmt contextRef="c-11" decimals="0" id="f-47" unitRef="usd">14299748</ecd:AdjToCompAmt>
    <ecd:AdjToCompAmt contextRef="c-12" decimals="0" id="f-48" unitRef="usd">4395649</ecd:AdjToCompAmt>
    <ecd:AdjToCompAmt contextRef="c-13" decimals="0" id="f-49" unitRef="usd">6708828</ecd:AdjToCompAmt>
    <ecd:PeoActuallyPaidCompAmt contextRef="c-2" decimals="0" id="f-50" unitRef="usd">26705325</ecd:PeoActuallyPaidCompAmt>
    <ecd:PeoTotalCompAmt contextRef="c-4" decimals="0" id="f-51" unitRef="usd">6066081</ecd:PeoTotalCompAmt>
    <ecd:AdjToCompAmt contextRef="c-14" decimals="0" id="f-52" unitRef="usd">-5089381</ecd:AdjToCompAmt>
    <ecd:AdjToCompAmt contextRef="c-15" decimals="0" id="f-53" unitRef="usd">5376891</ecd:AdjToCompAmt>
    <ecd:AdjToCompAmt contextRef="c-16" decimals="0" id="f-54" unitRef="usd">-835723</ecd:AdjToCompAmt>
    <ecd:AdjToCompAmt contextRef="c-17" decimals="0" id="f-55" unitRef="usd">-1016714</ecd:AdjToCompAmt>
    <ecd:PeoActuallyPaidCompAmt contextRef="c-4" decimals="0" id="f-56" unitRef="usd">4501154</ecd:PeoActuallyPaidCompAmt>
    <ecd:PeoTotalCompAmt contextRef="c-6" decimals="0" id="f-57" unitRef="usd">6693464</ecd:PeoTotalCompAmt>
    <ecd:AdjToCompAmt contextRef="c-18" decimals="0" id="f-58" unitRef="usd">-5241434</ecd:AdjToCompAmt>
    <ecd:AdjToCompAmt contextRef="c-19" decimals="0" id="f-59" unitRef="usd">7196040</ecd:AdjToCompAmt>
    <ecd:AdjToCompAmt contextRef="c-20" decimals="0" id="f-60" unitRef="usd">5349429</ecd:AdjToCompAmt>
    <ecd:AdjToCompAmt contextRef="c-21" decimals="0" id="f-61" unitRef="usd">54966</ecd:AdjToCompAmt>
    <ecd:PeoActuallyPaidCompAmt contextRef="c-6" decimals="0" id="f-62" unitRef="usd">14052465</ecd:PeoActuallyPaidCompAmt>
    <ecd:PeoTotalCompAmt contextRef="c-8" decimals="0" id="f-63" unitRef="usd">4810804</ecd:PeoTotalCompAmt>
    <ecd:AdjToCompAmt contextRef="c-22" decimals="0" id="f-64" unitRef="usd">-3892234</ecd:AdjToCompAmt>
    <ecd:AdjToCompAmt contextRef="c-23" decimals="0" id="f-65" unitRef="usd">10643528</ecd:AdjToCompAmt>
    <ecd:AdjToCompAmt contextRef="c-24" decimals="0" id="f-66" unitRef="usd">5921853</ecd:AdjToCompAmt>
    <ecd:AdjToCompAmt contextRef="c-25" decimals="0" id="f-67" unitRef="usd">562874</ecd:AdjToCompAmt>
    <ecd:PeoActuallyPaidCompAmt contextRef="c-8" decimals="0" id="f-68" unitRef="usd">18046825</ecd:PeoActuallyPaidCompAmt>
    <ecd:PeoTotalCompAmt contextRef="c-3" decimals="0" id="f-69" unitRef="usd">6752127</ecd:PeoTotalCompAmt>
    <ecd:AdjToCompAmt contextRef="c-26" decimals="0" id="f-70" unitRef="usd">-6499877</ecd:AdjToCompAmt>
    <ecd:AdjToCompAmt contextRef="c-27" decimals="0" id="f-71" unitRef="usd">7721616</ecd:AdjToCompAmt>
    <ecd:PeoActuallyPaidCompAmt contextRef="c-3" decimals="0" id="f-72" unitRef="usd">7973866</ecd:PeoActuallyPaidCompAmt>
    <ecd:NonPeoNeoAvgTotalCompAmt contextRef="c-1" decimals="0" id="f-73" unitRef="usd">4535894</ecd:NonPeoNeoAvgTotalCompAmt>
    <ecd:AdjToCompAmt contextRef="c-28" decimals="0" id="f-74" unitRef="usd">-3591994</ecd:AdjToCompAmt>
    <ecd:AdjToCompAmt contextRef="c-29" decimals="0" id="f-75" unitRef="usd">10151683</ecd:AdjToCompAmt>
    <ecd:AdjToCompAmt contextRef="c-30" decimals="0" id="f-76" unitRef="usd">4752143</ecd:AdjToCompAmt>
    <ecd:AdjToCompAmt contextRef="c-31" decimals="0" id="f-77" unitRef="usd">691096</ecd:AdjToCompAmt>
    <ecd:NonPeoNeoAvgCompActuallyPaidAmt contextRef="c-1" decimals="0" id="f-78" unitRef="usd">16538822</ecd:NonPeoNeoAvgCompActuallyPaidAmt>
    <ecd:NonPeoNeoAvgTotalCompAmt contextRef="c-5" decimals="0" id="f-79" unitRef="usd">3632052</ecd:NonPeoNeoAvgTotalCompAmt>
    <ecd:AdjToCompAmt contextRef="c-32" decimals="0" id="f-80" unitRef="usd">-2937683</ecd:AdjToCompAmt>
    <ecd:AdjToCompAmt contextRef="c-33" decimals="0" id="f-81" unitRef="usd">3103639</ecd:AdjToCompAmt>
    <ecd:AdjToCompAmt contextRef="c-34" decimals="0" id="f-82" unitRef="usd">-295785</ecd:AdjToCompAmt>
    <ecd:AdjToCompAmt contextRef="c-35" decimals="0" id="f-83" unitRef="usd">-583157</ecd:AdjToCompAmt>
    <ecd:NonPeoNeoAvgCompActuallyPaidAmt contextRef="c-5" decimals="0" id="f-84" unitRef="usd">2919066</ecd:NonPeoNeoAvgCompActuallyPaidAmt>
    <ecd:NonPeoNeoAvgTotalCompAmt contextRef="c-7" decimals="0" id="f-85" unitRef="usd">3829274</ecd:NonPeoNeoAvgTotalCompAmt>
    <ecd:AdjToCompAmt contextRef="c-36" decimals="0" id="f-86" unitRef="usd">-2821974</ecd:AdjToCompAmt>
    <ecd:AdjToCompAmt contextRef="c-37" decimals="0" id="f-87" unitRef="usd">3874330</ecd:AdjToCompAmt>
    <ecd:AdjToCompAmt contextRef="c-38" decimals="0" id="f-88" unitRef="usd">2301858</ecd:AdjToCompAmt>
    <ecd:AdjToCompAmt contextRef="c-39" decimals="0" id="f-89" unitRef="usd">44125</ecd:AdjToCompAmt>
    <ecd:NonPeoNeoAvgCompActuallyPaidAmt contextRef="c-7" decimals="0" id="f-90" unitRef="usd">7227613</ecd:NonPeoNeoAvgCompActuallyPaidAmt>
    <ecd:NonPeoNeoAvgTotalCompAmt contextRef="c-9" decimals="0" id="f-91" unitRef="usd">2283243</ecd:NonPeoNeoAvgTotalCompAmt>
    <ecd:AdjToCompAmt contextRef="c-40" decimals="0" id="f-92" unitRef="usd">-1658387</ecd:AdjToCompAmt>
    <ecd:AdjToCompAmt contextRef="c-41" decimals="0" id="f-93" unitRef="usd">4317603</ecd:AdjToCompAmt>
    <ecd:AdjToCompAmt contextRef="c-42" decimals="0" id="f-94" unitRef="usd">3379146</ecd:AdjToCompAmt>
    <ecd:AdjToCompAmt contextRef="c-43" decimals="0" id="f-95" unitRef="usd">303821</ecd:AdjToCompAmt>
    <ecd:NonPeoNeoAvgCompActuallyPaidAmt contextRef="c-9" decimals="0" id="f-96" unitRef="usd">8625426</ecd:NonPeoNeoAvgCompActuallyPaidAmt>
    <ecd:PeerGroupIssuersFnTextBlock contextRef="c-1" id="f-97">&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:8pt;font-weight:400;line-height:100%;padding-left:8.68pt"&gt;Our selected Peer Group is the Nasdaq Computer Index, an independently prepared market capitalization weighted index, and which is the same industry index used in our stock price performance graph in our Form 10-K for the fiscal year ended December 31, 2023.&lt;/span&gt;</ecd:PeerGroupIssuersFnTextBlock>
    <ecd:CompActuallyPaidVsCoSelectedMeasureTextBlock contextRef="c-1" id="f-99">&lt;div style="margin-bottom:0.1pt;text-align:center"&gt;&lt;img alt="2151" src="spsc-20240404_g48.jpg" style="height:380px;margin-bottom:5pt;vertical-align:text-bottom;width:613px"/&gt;&lt;/div&gt;</ecd:CompActuallyPaidVsCoSelectedMeasureTextBlock>
    <ecd:CompActuallyPaidVsNetIncomeTextBlock contextRef="c-1" id="f-98">&lt;div style="margin-bottom:0.1pt;text-align:center"&gt;&lt;img alt="2151" src="spsc-20240404_g48.jpg" style="height:380px;margin-bottom:5pt;vertical-align:text-bottom;width:613px"/&gt;&lt;/div&gt;</ecd:CompActuallyPaidVsNetIncomeTextBlock>
    <ecd:CompActuallyPaidVsTotalShareholderRtnTextBlock contextRef="c-1" id="f-100">&lt;div style="margin-bottom:0.1pt;text-align:center"&gt;&lt;img alt="2153" src="spsc-20240404_g49.jpg" style="height:380px;margin-bottom:5pt;vertical-align:text-bottom;width:613px"/&gt;&lt;/div&gt;</ecd:CompActuallyPaidVsTotalShareholderRtnTextBlock>
    <ecd:Additional402vDisclosureTextBlock contextRef="c-1" id="f-101">&lt;div style="margin-bottom:0.1pt;text-indent:36pt"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:10pt;font-weight:400;line-height:120%"&gt;We believe the Compensation Actually Paid in each of the years reported above and over the cumulative period are reflective of the Compensation &amp;amp; Talent Committee&#x2019;s emphasis on &#x201c;pay-for-performance&#x201d; as the Compensation Actually Paid fluctuated year-over-year, primarily due our stock price and varying levels of achievement against pre-established performance goals under our Management Incentive Plan and equity program, including our Adjusted EBITDA and TSR performance.&lt;/span&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:12pt;font-weight:400;line-height:120%"&gt; &lt;/span&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:10pt;font-weight:400;line-height:120%"&gt;Due to the leverage of our executive compensation program toward long-term incentives through grants of PSUs and RSUs, the Compensation Actually Paid is most significantly impacted by changes in our stock price over the vesting period of the awards. The Compensation Discussion and Analysis section of this Proxy Statement describes in greater detail the Compensation &amp;amp; Talent Committee&#x2019;s emphasis on &#x201c;pay-for-performance&#x201d; and how our executive compensation program is designed to link executive compensation with the achievement of our financial and strategic objectives as well as stockholder value creation.&lt;/span&gt;&lt;/div&gt;</ecd:Additional402vDisclosureTextBlock>
    <ecd:TabularListTableTextBlock contextRef="c-1" id="f-102">&lt;div style="margin-bottom:0.1pt;text-align:center"&gt;&lt;table style="border-collapse:collapse;display:inline-table;margin-bottom:5pt;vertical-align:text-bottom;width:26.442%"&gt;&lt;tr&gt;&lt;td style="width:1.0%"&gt;&lt;/td&gt;&lt;td style="width:98.900%"&gt;&lt;/td&gt;&lt;td style="width:0.1%"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:2px 1pt;text-align:center;vertical-align:bottom"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:11pt;font-weight:400;line-height:120%"&gt;TSR&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="3" style="background-color:#ffffff;padding:2px 1pt;text-align:left;vertical-align:bottom"&gt;&lt;div style="margin-bottom:0.1pt;text-align:center"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:11pt;font-weight:400;line-height:120%"&gt;Adjusted EBITDA&lt;/span&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:7.15pt;font-weight:400;line-height:120%;position:relative;top:-3.85pt;vertical-align:baseline"&gt;(1)&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="3" style="background-color:#dbdbdb;padding:2px 1pt;text-align:center;vertical-align:bottom"&gt;&lt;span style="color:#000000;font-family:'Times New Roman',sans-serif;font-size:11pt;font-weight:400;line-height:120%"&gt;Revenue&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;</ecd:TabularListTableTextBlock>
</xbrl>
