Skip to main content
PlaneConnection’s maintenance billing system calculates work order costs from configurable labor rates and parts markup rules, generates formal estimates, and tracks those estimates through approval and invoicing. This page is the technical reference for all billing configuration and lifecycle rules.
Billing configuration is managed in Maintenance > Billing Settings. For step-by-step setup instructions, see the billing settings how-to guide. For the API reference, see Maintenance API Endpoints.

Labor Rate Structure

Labor rates are defined per workspace and determine how technician time is priced on billing estimates. Each rate has a base hourly rate plus optional multipliers for overtime and AOG (Aircraft on Ground) situations.

Mechanic Types

Mechanic TypeAPI ValueDescription
A&P MechanicapAirframe and Powerplant certificate holder. Standard maintenance labor.
IA InspectoriaInspection Authorization holder. Higher rate reflecting inspection authority per 14 CFR 43.7.
AvionicsavionicsAvionics technician. Specialized rate for electronic and instrument work.
Sheet Metalsheet_metalStructural repair specialist. Rate for airframe structural work.
GeneralgeneralGeneral labor (cleaning, ground handling, non-certificated tasks).

Rate Multipliers

Each labor rate includes two optional multipliers applied to the base hourly rate:
MultiplierDefaultDescription
Overtime1.5xApplied to labor hours worked outside normal business hours.
AOG1.5xApplied when the work order priority is aog (Aircraft on Ground). Reflects the urgency premium for grounding events.
Effective cost calculation:
standard_cost   = hours x hourly_rate
overtime_cost   = hours x hourly_rate x overtime_multiplier
aog_cost        = hours x hourly_rate x aog_multiplier

Rate Configuration Fields

FieldTypeRequiredDescription
rate_nameStringYesDisplay name for the rate (e.g., “Standard A&P Rate”).
mechanic_typeEnumYesOne of: ap, ia, avionics, sheet_metal, general.
hourly_rateNumberYesBase hourly rate in USD. Must be greater than zero.
overtime_multiplierNumberNoMultiplier for overtime hours. Defaults to 1.5.
aog_multiplierNumberNoMultiplier for AOG priority work orders. Defaults to 1.5.
effective_dateDateYesDate from which this rate applies. Allows rate versioning.
expires_atDateNoOptional expiration date. Null means the rate is active indefinitely.
is_defaultBooleanNoIf true, this rate is used when no specific rate is assigned to an estimate line item.
Only one rate per workspace should be marked as the default (is_default = true). When generating an estimate, the system uses the most recent default rate if no rate is explicitly assigned. If no default rate exists, a system fallback rate is applied.

Parts Markup Tiers

Parts markup rules define the profit margin applied to parts costs on billing estimates. Rules are configured as tiered cost ranges, allowing different markup percentages for different part price points.

How Markup Tiers Work

When an estimate is generated, each parts line item’s unit cost is evaluated against the markup rules in sort order. The first rule whose cost range matches the unit cost determines the markup percentage. Example tier structure: Markup tiers are fully configurable. A typical setup uses tiered cost ranges with higher markup percentages on lower-cost parts and lower percentages on major components. You can create as many tiers as needed to match your shop’s pricing strategy.

Markup Rule Fields

FieldTypeRequiredDescription
rule_nameStringYesDisplay name for the rule (e.g., “Small Parts 100%”).
rule_typeStringYesparts_markup for parts tiers, shop_supplies for shop supply charges.
cost_floorNumberNoMinimum unit cost for this tier (inclusive). Null means no lower bound.
cost_ceilingNumberNoMaximum unit cost for this tier (exclusive). Null means no upper bound.
markup_percentNumberYesPercentage markup applied to unit cost.
basis_typeStringNoFor shop supply rules: labor_total (percentage of labor) or flat (fixed amount).
flat_amountNumberNoFor flat-rate shop supply rules: the fixed dollar amount.
sort_orderNumberYesEvaluation order. Lower numbers are evaluated first.
is_activeBooleanYesOnly active rules are applied during estimate generation.

Shop Supply Rules

In addition to parts markup, operators can configure shop supply charges that cover consumables (safety wire, sealant, hardware, rags, etc.) not individually tracked as inventory items. Shop supply rules support two basis types:
Basis TypeCalculationExample
labor_totalPercentage of total labor cost5% of 2,000labor=2,000 labor = 100 shop supplies
flatFixed dollar amount per estimate$75 flat shop supply charge

Billing Types

Each estimate is assigned a billing type that determines how the final invoice is calculated:
Billing TypeAPI ValueDescription
Time and Materialstime_and_materialsCustomer pays actual labor hours at the applicable rate plus actual parts cost with markup. The standard billing method.
Flat Rateflat_rateCustomer pays a fixed price regardless of actual hours or parts consumed. Used for standard inspections or published service pricing.
HybridhybridCombination of flat-rate labor and time-and-materials parts, or vice versa.
Not to Exceednot_to_exceedTime and materials billing with a maximum cap (NTE amount). Customer pays actual costs up to the NTE ceiling.

NTE (Not to Exceed) Amounts

When billing type is not_to_exceed, the estimate includes an nte_amount field representing the maximum the customer will be invoiced. If actual costs exceed the NTE amount, the operator absorbs the difference.

Estimate Statuses

Billing estimates follow a lifecycle from creation through customer approval to final invoicing.
StatusAPI ValueDescription
DraftdraftEstimate created and under internal review. Not yet visible to the customer.
SentsentEstimate has been sent to the customer for review and approval.
ApprovedapprovedCustomer has approved the estimate. Work may proceed or continue.
RejectedrejectedCustomer has declined the estimate. Work scope may need revision.
InvoicedinvoicedEstimate has been converted to an invoice. Final billing record.

Estimate Lifecycle

Estimate Generation

When a billing estimate is generated for a work order, the system performs the following calculation:
1
Collect work order items
2
The system queries all items attached to the work order, classifying each as either a labor task (has estimated_hours) or a parts item (has quantity and unit_cost).
3
Calculate labor costs
4
For each labor item:
5
  • Look up the applicable labor rate (default rate for the workspace if none specified)
  • Multiply estimated hours by the hourly rate
  • Sum all labor line items into labor_total
  • 6
    Calculate parts costs with markup
    7
    For each parts item:
    8
  • Evaluate the unit cost against active markup rules (in sort order)
  • Apply the matching tier’s markup percentage to compute the unit price
  • Multiply unit price by quantity for the line total
  • Sum base parts costs into parts_total
  • Sum markup amounts into parts_markup_total
  • 9
    Calculate shop supplies
    10
    Evaluate shop supply rules against the labor total or as flat amounts. Sum into shop_supplies_total.
    11
    Compute totals
    12
    subtotal     = labor_total + parts_total + parts_markup_total + shop_supplies_total
    tax_amount   = subtotal x tax_rate  (if applicable)
    total_amount = subtotal + tax_amount
    

    Estimate Fields

    FieldTypeDescription
    estimate_numberStringAuto-generated identifier (format: EST-{unique_id}).
    work_order_idStringReference to the associated work order.
    billing_typeEnumOne of: time_and_materials, flat_rate, hybrid, not_to_exceed.
    nte_amountNumberMaximum billable amount (NTE billing type only).
    labor_totalNumberSum of all labor line item costs.
    parts_totalNumberSum of all parts line item base costs (before markup).
    parts_markup_totalNumberTotal markup applied to parts.
    shop_supplies_totalNumberTotal shop supply charges.
    outside_services_totalNumberCosts for outsourced work (vendor invoices).
    subtotalNumberSum of all cost categories before tax.
    tax_rateNumberApplicable tax rate (decimal, e.g., 0.08 for 8%).
    tax_amountNumberCalculated tax amount.
    total_amountNumberFinal estimate total including tax.
    customer_nameStringCustomer or aircraft owner name for the estimate.
    customer_emailStringCustomer contact email for estimate delivery.
    payment_termsStringPayment terms (e.g., “Net 30”, “Due on receipt”).
    notesTextInternal or customer-facing notes.
    statusEnumCurrent estimate status (see Estimate Statuses above).

    Billing Events

    Every significant action on an estimate is recorded as a billing event for audit trail purposes:
    Event TypeDescription
    estimate_createdNew estimate generated from work order data.
    estimate_sentEstimate sent to customer.
    estimate_approvedCustomer approved the estimate.
    estimate_rejectedCustomer rejected the estimate.
    estimate_revisedEstimate was modified after initial creation.
    invoice_createdEstimate converted to a final invoice.
    payment_receivedPayment recorded against the invoice.

    Work Order Statuses

    Lifecycle of work orders that billing estimates are attached to.

    Maintenance API Endpoints

    REST API for creating rates, generating estimates, and retrieving billing data.

    Maintenance Data Model

    How billing fits into the broader maintenance data flow.

    Financial Reports

    Financial reporting that incorporates maintenance billing data.
    Last modified on April 5, 2026