Overview
PSA (Professional Services Automation) is the service desk and billing hub for your MSP. It is where your team receives, tracks, and works tickets, where time is logged against clients, where contracts live, where invoices are created and sent, and where card payments are collected. It also manages inventory, serial-numbered hardware, purchase orders, assets, on-call schedules, CSAT surveys, approvals, and the client portal that your customers use to submit requests and pay their bills.
Finance → Payment Sync (/psa/admin/integrations). Connect QuickBooks Online (or Xero) and run invoice/payment sync here. These connections are owned by Bridge. You can also reach this page from Settings → Integrations & Migration → Integrations (same URL). Note: Finance → Billing Integration (/psa/finance/billing/settings) holds PSA's own billing settings. It does not set up the QuickBooks sync, so don't label it "QuickBooks."
PSA is the central product most MSP staff open first thing in the morning and close last at night. Tickets arrive from email, phone, the RMM, the client portal, and from THEO. SLAs count down in the background, automations respond to status changes, invoices go out on schedule, and autopay quietly charges saved cards so outstanding balances get cleared without anyone chasing them.
Key Features
Tickets and Queues
- Each ticket gets a sequential number (T-1, T-2, T-3, ...) assigned per organization.
- Tickets can be filtered by status, priority, assigned tech, company, or queue.
- Queues group tickets by team, responsibility, or escalation path. A default queue is provided, and new ones can be created with their own auto-assign rules and assigned team members.
- Notes can be marked internal (only visible to your team) or public (emailed to the customer and visible in the portal).
- Line items let you add parts, products, or labor to a ticket. Products tied to inventory decrement stock when added.
- Approvals block work until a designated approver signs off.
- Macros let you apply a set of standard actions (status change, note, assignee) with one click.
- Recurring ticket templates generate routine work (monthly maintenance, patch cycles) on a schedule.
SLAs
- Legacy per-ticket SLAs and rich per-priority SLA policies are both supported. Policies let you set separate response and resolution targets by priority, optionally restrict the policy to specific companies, pause the timer when the ticket is in certain statuses (waiting on customer, for example), and respect business hours.
- SLA warnings and breaches are detected every 5 minutes and surfaced on the ticket, on dashboards, and in reports. A breach event is fired to your automations and webhooks.
Time Tracking
- Log time directly on a ticket, to a company, or as a standalone entry.
- Time entries have start/end times, a duration, a billable flag, and an hourly rate.
- Billing codes organize the kinds of work you bill for (on-site, remote, after-hours) and carry default rates.
- Time that has not yet been billed is included automatically in the next billing run.
Contracts
- Contracts belong to a company and carry a name, type, value, start/end dates, billing frequency, and an SLA reference.
- Contract line items represent the things you bill for each cycle. They can be manual or pushed in automatically by Hub for resold products.
- Renewals can be created directly from an expiring contract.
- A daily job looks ahead 30 days and surfaces contracts due to renew.
Invoicing
- Invoices are numbered per-org (INV-1001, INV-1002, ...). They carry line items, subtotals, tax, a due date, and terms.
- Invoices can be created manually, produced by a billing run, or generated from a ticket.
- Billing runs sweep every active contract in a period, collect unbilled line items and unbilled time, create one invoice per contract per period, and push the invoice to QuickBooks Online if connected.
- Invoices can be sent, marked paid, partially paid, voided, or refunded. Status transitions are tracked.
- AR aging, MRR, and revenue summaries are built-in reports.
Client Portal
- Your customers log in at a branded portal to submit tickets via custom forms, view ticket status, download and pay invoices, and sign documents.
- Portal forms are configurable per-org. Each form has its own fields, default queue, default priority, default issue type, and success message. Forms can be public (no login) or require authentication.
- Inbound email becomes a ticket automatically. Email processors tell PSA which mailbox to watch, what queue and priority new tickets get, whether to auto-create a contact or company for unknown senders, and what confirmation reply to send.
Automations
- Ticket automation rules fire on ticket created or ticket updated events. Each rule has conditions (AND-ed) and actions. Rules run in priority order.
- Outbound webhooks subscribe to events (ticket.created, ticket.resolved, invoice.paid, autopay.failed, etc.) and deliver HMAC-signed POSTs to your URL. Failed deliveries retry with exponential backoff for up to 5 attempts.
CSAT
- When a ticket is resolved, PSA waits a short window, then emails the requester a one-click rating survey.
- Responses are stored with the ticket and aggregated in per-tech performance reports.
- Abandoned surveys are purged after 30 days.
Stripe and BNG Payments
- Connect a Stripe account, a BNG merchant account, or both.
- Generate hosted payment links for any invoice.
- Charge saved cards with one click.
- Store tokenized payment methods per contact.
- Refund (full or partial) from the invoice.
- Stripe and BNG send webhooks to PSA when a payment completes, fails, or is refunded; the invoice updates automatically.
Autopay
- Enroll a company (or a specific contact) in autopay.
- Choose the schedule (monthly, weekly, or on due date) and the application strategy (oldest invoice first, current month only, or all outstanding).
- Set a cap on the total that can be charged per run.
- Failures are retried; three consecutive failures pause the enrollment and notify you.
QuickBooks Online Sync
- Connect QBO via OAuth2 from the integrations page.
- Invoices, payments, and refunds sync live both ways so your accountant sees everything in QBO without double-entry.
- Non-connected organizations can export invoice and payment CSV/JSON files instead.
Inventory and Store
- Products carry SKU, barcode, cost, sell price, and reorder rules.
- Stock is tracked per location (warehouse, tech vans).
- Serial numbers are tracked for serialized products from purchase through sale, RMA, or disposal.
- Purchase orders capture what you ordered, from whom, at what price, and with what expected delivery date. Receipts match stock in and record serials.
- Requisitions let a tech ask for parts; they convert to a PO on approval.
- RMAs track returns to vendors.
- Auto-reorder runs nightly: any product below its reorder point on a preferred vendor gets a PO draft created.
- Label printing to a PrintNode-connected printer is built in.
Assets
- Hardware devices assigned to a company or contact, with warranty, purchase, OS, and network details.
- QR codes printable on label templates for quick lookups in the field.
Command Center
- Cross-product dashboard showing client health, alerts, and activity across PSA, RMM, Security, Voice, and more.
- Daily briefing summarizes your queue, SLAs, breaches, and priorities for the day.
How To: Create a Ticket
- Click the New Ticket button at the top of the tickets list.
- Enter a short title describing the problem.
- Select the company. Contacts for that company appear in the contact dropdown.
- Choose a priority (low, medium, high, or urgent). The SLA clock starts based on the priority and the company's SLA policy.
- Pick the queue (optional). If you skip this, the default queue is used.
- Assign the ticket to yourself or another technician (optional).
- Fill in the description. Attach files if needed.
- Click Save.
The ticket gets a number (T-###), its SLA response and resolution clocks start, any matching automation rules run, and webhook subscribers are notified.
How To: Log Time on a Ticket
- Open the ticket.
- Click the Time tab or the Log Time button.
- Enter start and end times, or a duration in minutes.
- Add a description of what you worked on.
- Confirm the billing rate (or use the default from the billing code).
- Check the Billable box if the customer should be charged.
- Click Save.
The entry is now attached to the ticket and the company. It will show up in the next billing run for that contract.
How To: Run a Billing Run
- Go to Billing > Billing Runs.
- Click New Billing Run.
- Pick the period (typically last month for monthly recurring).
- Review the preview. Every active contract in the period is listed, with its unbilled line items and unbilled time.
- Click Run.
PSA creates one invoice per contract per period. Each invoice gets a number (INV-####), its line items are marked billed so they do not appear in future runs, and the invoice is pushed to QuickBooks if connected. Invoices start in Draft status.
Review drafts and click Send to email them to customers.
How To: Accept Credit Card Payments
- Go to Settings > Payments.
- Click Connect Stripe (or Connect BNG). Follow the prompts to sign in and authorize.
- Open any unpaid invoice.
- Click Generate Payment Link to get a URL you can email or paste into the portal. The customer pays with any card.
- Or, if the customer already has a saved card, click Charge Card and pick the saved method.
Completed payments fire a webhook back to PSA. The invoice updates to Paid (or Partial for less-than-total payments), the payment shows under the invoice's payment history, and the data mirrors to QuickBooks if connected.
How To: Enroll a Customer in Autopay
- Open the company in PSA.
- Click the Autopay tab.
- Click Enroll.
- Pick a payment method (Stripe or BNG, and a card token on file for that customer).
- Choose a schedule (monthly, weekly, or on due date).
- Choose how to apply (oldest first, current month only, all outstanding).
- Set a maximum per-run charge amount if desired.
- Save.
Autopay runs every morning at 08:00 UTC. Each run looks for due/overdue invoices for that company, charges the saved card up to the cap, and marks paid invoices accordingly.
How To: Connect QuickBooks Online
- Go to Finance → Payment Sync.
- Click Connect to QuickBooks.
- Sign in to Intuit and authorize PSA to access your company file.
- PSA imports your customer list and stores an encrypted connection.
- New invoices and payments sync automatically going forward.
To push existing data, click Sync Invoices or Sync Payments from the QBO status page.
How To: Set Up an SLA Policy
- Go to Settings > SLA Policies.
- Click New Policy.
- Give it a name and description.
- Set per-priority response and resolution targets (for example, urgent: 15 minutes response / 4 hours resolution; low: 1 business day response / 5 business days resolution).
- Pick statuses that pause the clock (waiting on customer, on hold).
- Optionally restrict to specific companies, or leave blank to apply org-wide.
- Toggle business-hours mode if you only honor SLAs during configured business hours.
- Save. Mark as default if this is your standard policy.
Tickets created after the policy is saved use the new targets. An SLA breach detection job runs every 5 minutes.
How To: Configure an Inbound Email Processor
- Go to Settings > Email Processors.
- Click New Processor.
- Enter the mailbox address (for example, support@yourcompany.com).
- Choose the default queue, status, priority, and issue type for new tickets.
- Pick a default assignee if you want every ticket to land with a specific tech.
- Toggle Auto-create contact and Auto-create company if unknown senders should be added automatically.
- Pick a confirmation template for the auto-reply to the sender.
- Activate the processor and save.
Inbound mail gets matched against existing tickets first (via the In-Reply-To header). Matched mail becomes a note. Unmatched mail creates a new ticket.
How To: Build a Client Portal Form
- Go to Settings > Portal Forms.
- Click New Form.
- Give it a name (for example, "Request a Tech").
- Add fields: the built-in title and description fields are always included. Add custom text, dropdown, checkbox, or file-upload fields.
- Set default queue, priority, and issue type for submissions.
- Write a success message shown to the submitter.
- Choose whether the form requires login.
- Save and copy the share link.
How To: Track Inventory and Reorder Stock
- Go to Inventory > Products and add your products with SKU, cost, sell price, and a reorder point.
- Set up inventory locations (warehouse, each tech van). One is the default.
- Receive stock either by creating a Purchase Order and receiving it, or by doing a Stock Adjustment.
- As stock is sold on tickets, the product line item decrements inventory at the ticket's location.
- A nightly check looks at every tracked product. Any below its reorder point on an auto-reorder-enabled product creates a draft PO on the preferred vendor.
- Review drafts and submit them for approval or ordering.
How To: Send a CSAT Survey
You do not do anything. When a ticket is resolved, an automatic job runs every 15 minutes, picks up resolved tickets with no CSAT yet sent, and emails the primary contact a one-click survey. Responses post back into PSA and show up on the ticket and in the tech-performance report.
Frequently Asked Questions
Where does the T-### ticket number come from? PSA assigns the next number in sequence for your organization when a ticket is created. Each organization has its own counter, starting at 1.
What is the difference between an SLA and an SLA Policy? SLAs are simpler — a single response and resolution target. SLA Policies let you set different targets per priority, pause on specific statuses, use business hours, and restrict to certain companies. Use SLA Policies for most modern setups; the legacy SLA is kept for compatibility.
Why did my SLA not breach even though the clock ran out? The SLA may be paused. If the ticket is in a status listed in the policy's "Pause on statuses" field (like "waiting on customer"), the clock freezes. Move the ticket back to an active status to resume timing.
What happens when I mark a ticket resolved? The resolved timestamp is recorded. The CSAT auto-send job (running every 15 minutes) will send a survey within the next 15 minutes. SLA resolution-time calculations complete. Any automation rules listening for ticket.updated may run.
Can I edit an invoice after sending it? Draft invoices can be freely edited. After an invoice is sent, editing line items is disabled. To correct a sent invoice, void it and issue a new one, or use a credit memo.
How do I refund a payment? Open the invoice, find the payment under the payment history, and click Refund. You can refund the full amount or a partial amount. The refund goes through the original gateway (Stripe or BNG). A reversing entry is created and pushed to QuickBooks if connected.
Why did my QuickBooks sync fail? The most common cause is an expired OAuth token. Go to Finance → Payment Sync and click Reconnect. Other causes: a customer in PSA that has not been mapped to a QuickBooks customer yet (mapping happens automatically on first invoice push), a missing required field in the invoice, or a QuickBooks company file set to read-only.
Can I charge a card without saving it? Yes. Generate a hosted payment link for the invoice and send it. The customer enters the card on the link page; the payment processes without PSA saving the card.
Does PSA support ACH or only cards? Card processing through Stripe and BNG is the current path. ACH is not in PSA today — for ACH, ask the customer to pay by check or record a manual payment after the ACH clears at your bank.
What happens if autopay fails three times in a row? The enrollment is paused (status flips to "failed"), a notification fires, and the customer is not charged again until you investigate and re-enable it. Common failure causes are expired cards, insufficient funds, or a hold from the issuing bank.
How do I know if my outbound webhook is working? Go to Settings > Webhooks > open your webhook > Deliveries. Every attempted delivery logs the HTTP status, response snippet, and the request body. Failures retry automatically for up to 5 attempts; after that the delivery is marked dead. Click Rotate Secret if your receiving endpoint has been compromised.
Can my customers see internal notes on a ticket? No. Notes marked "internal" are only visible to your team. Public notes are shown in the client portal and emailed to the contact.
Why did my customer not receive the email for a public note? Check that the ticket has a contact with an email address, that your Relay email service is configured, and that the customer's address is not on a suppression list. Outbound mail uses the org's configured From address.
How do I print a label for a product or asset? From the product or asset page, click Print Label. You need a PrintNode account connected and at least one printer registered. Label templates (product, asset, serial, custom) are configurable under Settings > Label Templates.
Troubleshooting
Ticket creation returns a "No default queue" error The organization has no queues set up, or none is marked default. Go to Settings > Queues and mark one queue as default.
SLA is not computing on a new ticket The ticket has no priority set, or no SLA Policy applies. Either set a priority or create a default SLA Policy (leave the "restrict to companies" list empty).
Billing run created fewer invoices than expected Billing runs enforce a uniqueness constraint: one invoice per (contract, period). If a prior run already created an invoice for that contract in that period, the second run skips it. Check the run summary for skipped contracts and review existing invoices.
A customer paid via link but the invoice still shows unpaid The Stripe/BNG webhook that updates the invoice may have failed to reach PSA. Check Settings > Integrations > Stripe (or BNG) to see recent webhook activity. If the customer shows a successful charge in the Stripe/BNG dashboard but the PSA invoice is still unpaid, a replay of the webhook from the Stripe dashboard usually fixes it. Payments are idempotent, so replays are safe.
Autopay run charged the customer but the invoice is still open Most common cause: the customer had multiple unpaid invoices and the autopay cap (max per-run amount) was less than the total. Only as much as the cap allows is charged. Look at the autopay run history and the individual invoice payment rows.
Inbound email is not creating a ticket Check the email processor's configuration: is it active? is the address correct? Also check the inbound log; PSA deduplicates by message-id to prevent loops, so a message that has already been processed within 30 days is skipped. Make sure Relay is forwarding mail to PSA's internal endpoint.
A public note did not email the customer Verify the ticket has a contact with a valid email. Check that Relay's outbound email is configured. Public notes are only emailed when the ticket has a matched contact.
Serial number shows the wrong location Serial numbers move with inventory transactions. If a serial was sold on a ticket, it moves to the company. If it was transferred between locations, it moves to the destination. Check the inventory transaction log for that serial to see its full history.
QuickBooks keeps creating duplicate customers The QBO customer map links each PSA company to exactly one QBO customer. If two PSA companies have the same name but represent the same QBO customer, they will each create their own QBO entry. Merge the PSA companies, or manually edit the mapping.
Ticket automation rule did not fire Rules run in priority order (lower number first). Conditions are AND-ed. A single unmet condition prevents the whole rule from firing. Open the rule, check each condition against the ticket's actual values, and confirm the trigger event (ticket.created vs ticket.updated) matches.
CSAT surveys are not going out
The CSAT auto-send job runs every 15 minutes for tickets that were recently resolved. Make sure Relay is configured (CSAT emails route through Relay). Make sure the ticket has a contact with an email address. And check csat_sent_at on the ticket — if it already has a timestamp, PSA considers the survey sent and will not re-send.
I cannot find the client portal URL
The portal is served by Hub under your tenant's branded subdomain. Go to Settings → Client Portal → Branding & Identity (/settings/client-portal?section=branding) to see the portal link. The old /settings/branding link redirects to Settings → Organization.