Dashboard

A visual snapshot across every workflow and account -- see the Results tab for the detailed, filterable send log. Click a number, segment, or bar below to see the underlying sends.

0
Total contacts
0
Emails sent
0%
Open rate
0%
Click rate
0
Emails failed

Open & click rate

Send outcome

Emails sent per day

Workflow performance

Account sending volume

Account health

Enrollment funnel (all workflows)

Contact → Lead → Customer pipeline

Leads by status

Customer engagement mix

Lists

Group contacts into lists, then associate a list with the Workflow tab so adding someone to that list is what triggers the email sequence.

List nameContacts

Add contacts

CSV or Excel (.xlsx/.xls), any columns — firstname, lastname, email, mobile, company are matched automatically; anything else (title, industry, LinkedIn URL, ...) you can map to a custom field on the next step and use in your emails. Header row required; column order doesn't matter. Which list(s) these contacts join is chosen on the next screen, right before they're actually imported.

Download sample CSV

Additional details (optional — same fields as the sample CSV; each becomes a {{placeholder}} you can use in emails)

Contacts (0)

Name Email Mobile Company Lists Enrollments Status
Page 1 of 1

Contacts flagged as a potential deal (use the Convert to Lead button on the Contacts tab). Move a lead through Qualification → Discovery → Proposal → Negotiation, then close it Won (becomes a Customer) or Lost (a reason is required).

Leads (0)

Name Email Company Status Lead since

Closed-won leads, with engagement details for reference across the team.

Customers (0)

Name Email Company Engagement Contract value Start date Account manager

Workflows

Every workflow you've created, active or draft. Only Active ones actually enroll and email contacts. "Rejected" is an SMTP-rejection proxy (the mail server refused the address at send time) -- this app doesn't parse bounce or reply email, so there's no true bounce/reply detection behind those-style columns.

Activate Name Trigger list Account Enrolled Not Sent Scheduled Finished Paused Rejected Delivered Opened Clicked % Complete

Tasks

Everything a workflow or a lead follow-up asks you to do by hand, in one place: calls, reminders and LinkedIn outreach. The contact's progress through the workflow does not wait on these. For a LinkedIn task, click Work on it to open the message, the LinkedIn page and the safety meter right here; setup, limits and history are on the Outreach Setup tab.

Contact Workflow Task LinkedIn Created
Page 1 of 1

Open & click tracking

Requires a public URL this app is reachable at — a tracking pixel/link pointing at localhost is invisible to a real recipient's mail client. Leave this blank while running locally; fill it in once you deploy somewhere with a real domain, and tracking turns on automatically for every email sent after that.

Worth knowing even once this is on: open tracking is industry-wide unreliable — Apple Mail Privacy Protection pre-loads images in every email regardless of whether it's actually opened, and some providers proxy/cache images too. Treat opens as a rough directional signal; clicks are a much stronger sign of real engagement.

Default sender mailing address

The CAN-SPAM Act requires a valid physical postal address in every commercial email you send. Shown in the same footer as the unsubscribe link, on every campaign email — never in your warm-up mail, since that's just between your own mailboxes. This is the default, used by any account that hasn't set its own -- if you run campaigns from mailboxes belonging to different business entities or domains, set each one's own address instead on that account's own editor ("Sender Mailing Address" step).

Company letterhead (SOW / Invoice PDFs)

Applied automatically to every generated SOW and Invoice, like a real printed letterhead -- a colored header band with your company name (and logo, if you upload one) on the first page only, and a footer with your address/website/phone on the last page only. Company name and address are reused from the "Default sender mailing address" card above.

No logo uploaded yet.

Email accounts

Every mailbox you can send from. Tag each workflow to one of these on the Workflow tab — different workflows can send from different accounts.

Name From email Configured Daily limit Warm-up Health Used by

Sending standards & why they matter

This tool follows the same guardrails cold-outreach platforms (Apollo, Zoho, Instantly, Lemlist, etc.) build in, so a mailbox doesn't get rate-limited or blacklisted:

  • One email at a time per account, spaced by the "Send every" minutes you set (1 by default). The scheduler checks every minute and only sends when that account is actually due — never a burst. Providers flag mailboxes that suddenly fire off dozens of emails in the same second.
  • A daily cap per account, shared across every active workflow that sends from it (not a separate budget per workflow) — because reputation is tied to the mailbox. 30–50/day is the safe range for a mailbox with no warm-up history; 50–150/day once the domain has weeks of consistent, low-bounce sending behind it. Start near the low end on a new domain and raise it gradually week over week.
  • Follow-ups are prioritized over new outreach. If an account's daily budget can't cover both, contacts already partway through a sequence (waiting on Email 2/3) get sent before brand-new contacts start Email 1.
  • Keep bounce rate low. Clean/verify your list where you can — a high bounce rate is one of the fastest ways to damage sender reputation, independent of volume.
  • SPF/DKIM/DMARC configured for your sending domain (see below, per account) — without this, mail can get accepted by your own server (looks "sent") but silently dropped or spam-foldered by the recipient's provider.
0
Total contacts
0
Emails sent (all time)
0
Emails failed
0
Opened
0
Clicked

Account sending volume

Account From email Configured Sent today / daily limit Warm-up today

Workflow performance

Workflow Trigger list Account Status Enrolled Completed Pending Failed Opened Clicked Replied

Send log

The scheduler checks every minute and sends at most one email per account per check (see Email Accounts → Sending standards) — that's what paces sends and enforces each account's daily cap. "Send next one now" runs one check immediately instead of waiting up to a minute, handy for testing.

Time Type Contact Workflow Step Status Message Opens Clicks
Page 1 of 1

Outreach Setup

Set up how Performdesk reaches people beyond email. Your day-to-day LinkedIn to-dos are on the Tasks tab.

LinkedIn Outreach

Assisted mode: you press Send every time

Performdesk reaches people on LinkedIn in the way you choose below. In the default Assisted mode it never signs in to LinkedIn and never sends for you: you press Send yourself, which is the lowest-risk way to use LinkedIn outreach.

Your LinkedIn to-dos are on the Tasks tab.

Safety guide: how to avoid LinkedIn limits (read this first)

Do

  • Use your own account, from your own computer and your normal internet connection.
  • Stay under the daily budget shown below. Stop when the meter turns amber or red.
  • Send only to people who plausibly want to hear from you, with a short, honest, personal note.
  • Wait about 3 to 5 minutes between items. Do not rush.
  • Reply to people yourself, promptly. Anyone who replies should not be contacted again from here.
  • Withdraw old pending invitations from time to time (LinkedIn: My Network, Manage, Sent).

Do not

  • Do not run other LinkedIn automation tools or browser extensions on the same account.
  • Do not use a VPN, proxy or cloud computer for this account.
  • Do not raise your limits to "catch up" after a pause.
  • Do not send the same message to hundreds of strangers, or anything misleading.
  • Do not ignore a warning from LinkedIn. If you see "weekly limit reached" or a security check, stop for the day and wait a few days before sending again.
  • Do not share your LinkedIn or Performdesk login with anyone.

No setting can make LinkedIn outreach completely risk-free: LinkedIn limits connection requests per week no matter who clicks Send. These budgets are set well under what we have seen LinkedIn tolerate. This is guidance, not legal advice.

Your LinkedIn account and today's budget

Adjust my limits (you can lower them freely; raising is capped at a safe ceiling)

How should Performdesk work on LinkedIn?

Assisted is the safest and is on for everyone: you press Send every time. Guided and Autonomous use a small program on your own computer that drives your own browser. LinkedIn prohibits that kind of automation, so each needs your written acknowledgment first.

Optional: let a browser helper type your messages

Optional: fill-assist helper Checking…

A small browser extension that types your message into the LinkedIn box for you, so you do not need to paste. It is off by default. It only types into an empty box on the right person's page. It never presses Send, never opens pages on its own, and never reads your clipboard. Without it, the message is copied for you to paste, which works the same.

Download the helper (.zip)
  1. Click Download the helper and unzip it (right-click, Extract All). You get a folder named performdesk-linkedin-helper. Keep it somewhere permanent: the browser loads the extension from that folder every time it starts.
  2. Click Copy the extensions address, open a new tab, paste it in the address bar and press Enter. (Browsers do not let a web page open this page for you.) Turn on Developer mode.
  3. Click Load unpacked and choose the unzipped folder. This is a one-time step, and a browser never lets a website do it for you.
  4. Turn it on (it is off until you do): click the puzzle-piece icon in your browser toolbar and pin Performdesk LinkedIn Fill Assist so it stays visible. Click it and tick Type my message into LinkedIn.
  5. Reload this page. The badge above should say On. If it says "Installed, turned off", the box in the previous step is not ticked yet. If it says "Not installed", the helper is not loaded or is not allowed for this address (see the last step).
  6. If you open Performdesk at an address other than http://localhost:3000, add that address in the extension's Settings.

LinkedIn changes its page layout from time to time. If the helper ever stops typing, just paste with Ctrl+V (or Cmd+V): the copy always happens.

Check against LinkedIn's Sent list (finds requests that did not really go through)

LinkedIn sometimes drops a connection request without any warning, most often after you reach its weekly limit. This check compares the requests you marked as sent with the people on your LinkedIn Sent invitations page. Anyone missing is flagged and is not counted toward your limits until you decide what happened. It needs the optional fill-assist helper (see above), turned on. It only reads names and "Sent ... ago" on that one page, and only while you run a check.

Accepted invitations leave the Sent list, so a person who already accepted can show up here as "not found". If that is the case, choose "They accepted it". Only requests from the last 21 days are checked. Messages and InMail cannot be checked this way.

Recent activity (what you did on LinkedIn, newest first)

How this works

The Contacts tab's "LinkedIn Outreach" action (and a workflow's own LinkedIn step) look up a contact's real LinkedIn profile by email. Add your own API key for one or more providers below -- we try them in the order you set, top to bottom, stopping at the very first one that finds a real profile. Your key is yours alone: no other tenant's usage ever touches your account's credits, and your key is never visible to anyone but you.

A real cost to be aware of: most of these are paid, credit-metered commercial APIs -- they typically offer a limited number of free lookups per month, then bill (or simply stop working) once that's used up. Check your own account's plan with each provider before relying on heavy usage; this app has no way to track or cap your spending with any of them.

Your providers

Reorder with the arrows to change which provider gets tried first. A provider with no key saved (or turned off) is simply skipped, at no cost.

Your match performance

Which of your own providers is actually bringing in LinkedIn contacts. This card never triggers a new lookup, and doesn't auto-refresh while you're looking at it -- use the button above after matching a few more contacts to see updated numbers.

Raise a ticket

Tell us what is wrong or what you need. We reply right here, and you will see a number on the Support tab when we have. Include what you expected to happen and what happened instead.

Your tickets

Looking for the right people for a client's requirement? Enter the skills and limits below. Best matches come first, with the matching skills highlighted.

Find candidates

NameTitleLocationExp.NoticeExpected comp.SkillsStatusPipelineUpdated
Page 1

Everyone you have added. Click a status to filter, tick people to change several at once, or open one to edit their details, make a client-ready CV and keep their history.

NameTitleLocationExp.NoticeExpected comp.SkillsStatusPipelineUpdated
Page 1

Upload CVs

Upload one or more CVs (PDF, DOCX or TXT, up to 5 MB each, 20 at a time). Each is scanned for contact details, skills, experience and education, and becomes a candidate. If the same person is already on file (same email or phone), you are asked what to do: nothing is added twice by accident.

Add a candidate by hand

No CV to upload? Enter the basics here. You can add the rest, and upload a CV later, from the candidate's page.

A quick picture of your candidate pool. For how candidates are moving through each client project (technical and managerial rounds, sent to client), open the Projects dashboard.

CVs by status

Click a bar to see those candidates.

CVs added per week

Tagged to a project

Most common skills

CV formats

A CV format is how a client-ready CV looks: header, footer, colors and company details. Most companies need just one. The default format is used for every candidate who does not have their own.

Assign formats to individual candidates (optional)

Most companies use one format for everyone and can skip this. Choose a format for each candidate, or tick several and set them together. "Default" means the candidate follows whichever format is the default.

CandidateTitleStatusCV format
Page 1

Your company details

Formats use these unless a format sets its own. They are the same details your SOWs and invoices use, so they are set in one place.

How candidates are moving through each project: sourced, technical interview, managerial interview, sent to the client, and the client's decision. Click any number to see the people behind it.

Needs attention

Candidates waiting on someone right now. Click one to see who.

Sourcing funnel

By position

Each position's own numbers. Click a position to focus the whole dashboard on it, or click a number to see the people.

PositionSourcedTechnicalManagerialSent to clientClient
InterviewedPassedInterviewedPassedSelectedRejected

CVs sourced per week

Who is sourcing

PersonSourcedPassed technicalPassed managerialSent to clientClient selected

Projects

A project is what a client wants: the positions to fill, the budget, the JD and any client-specific requirements. Candidates are tagged to a project and position as you source them.

Waiting for approval

Both internal interviews were positive. Check the profile and the feedback, then approve it so it can go to the client.

Ready to send to the client

Approved profiles. Download the CV in the company format, copy the client table, send them, then mark each one as sent.

Sent, waiting for the client

Record the client's decision when it comes. Everyone on the project then sees it.

Selected: offer and joining

The client chose these candidates. Keep the offer and the joining up to date; the sourcing team stays in touch until they join. Open one to record the offer, the answer, or the joining.

Sourcing team

Create a login

Who works on what

Each person with the positions assigned to them. Hold an assignment to pause it (they still see it, but cannot tag candidates to it), or detach it to take them off. The numbers show how loaded each person is.

NameRoleStatusLast sign-in

Assign work

Choose one or more people, then the positions they should work on. Use "all open positions" to give someone a whole project at once.

People
Positions

Flag requests

A teammate proposes marking a candidate as a proxy, blocked or blacklisted. Approving writes it to the candidate's history and stops them being tagged.

Your company's hiring workspace

Loading...

Recent changes

Rate card

Management only

What the company bills per hour for each role and experience band, and the company-wide numbers behind every position's budget. A project can apply its own discount and margin on top (Projects, edit a project, Commercials). When anything here changes, every budget and every candidate's margin changes with it.

Loading...

Your plan

Products

Performdesk Core -- the full Contact-to-Customer journey -- is free forever. Add-ons below unlock extra tabs and capabilities for a monthly fee.

Invoices

DateProductListDiscountAmount dueStatus

Payment methods

ProviderCardExpiresDefault

Billing notifications

Super Admin

Cross-tenant view — every user's data, read-only. Your own Contacts / Workflow / Results / Tasks tabs are unaffected by this and still show only your own account.

Users & activity summary

Email Role Verified Sign-in method Online now Last login Contacts Lists Workflows Active Accounts Sent Failed Tasks Pending Joined
Page 1 of 1

All contacts (every user)

Owner Name Email Mobile Company List(s) Workflow status
Page 1 of 1

All workflows (every user)

Owner Workflow Status Enrolled Sent Failed
Page 1 of 1
0
Total contacts
0
Emails sent
0%
Open rate
0%
Click rate
0
Emails failed

Open & click rate

Send outcome

Emails sent per day

Tenant performance

Contacts per tenant

Enrollment funnel (every workflow, every tenant)

All results (every user, most recent 1000)

Owner Time Type Contact Workflow Status Message Opens Clicks
Page 1 of 1

All tasks (every user)

Owner Contact Workflow Task Status Created
Page 1 of 1

Overview

Payment provider credentials

A provider only shows up as a checkout option on a tenant's own Billing tab once its real credentials are saved here -- until then, "Subscribe" correctly says "No payment provider is configured yet." These write-only fields never show a previously saved secret back (same convention as an email account's own SMTP password) -- to change any one field later, re-enter ALL of that provider's fields and save again; a partial resubmit isn't supported. Real Stripe/PayPal/Square developer accounts are required -- get test-mode credentials from that provider's own dashboard first.

Dodo is the seller of record: it collects and pays the sales tax and handles card disputes. Create the keys in the Dodo dashboard (Developer, API keys) and a webhook (Developer, Webhooks) pointing at with the events subscription.* and payment.succeeded. Leave a field blank to keep what is already saved.

Product catalog

Performdesk Core is the free flagship, auto-granted to every signup -- its list price is shown on every tenant's own invoice as a 100% discount, never actually charged. Every other row is a paid add-on; toggle "Active" once its real feature is actually built and ready to sell.

ProductList priceCharged priceActiveLive subs

Discounts

Drives Performdesk's own invoice records and reporting. A discount meant to actually reduce what a payment provider charges must also be created on that provider's own dashboard (Stripe Coupons, etc.) using the same code.

CodeDescriptionAmountPlanRedemptionsActive

Subscriptions (every tenant)

TenantProductProviderStatusStartedRenews / ends

Support tickets

#SubjectUserTopicStatusLast update

Business details

Shown on the public Privacy, Terms, Refunds, Contact and Data deletion pages that the footer links to. Until you save a business name, the pages say "Performdesk"; until you save a support email, they point people to the Support tab.

Send the app's own emails from your domain

Sign-up verification and notice emails go out as noreply@performdesk.com instead of the relay mailbox's own address, signed with your domain's DKIM key (the same method Clipper360 uses). No mailbox is needed on performdesk.com: the mail still travels through the existing mailbox's server. Steps: save the addresses, press Create signing key, add the three DNS records in Cloudflare, press Check DNS until all three are OK, send yourself a test, then tick "Send this way" and save.

LinkedIn-matching providers: read-only oversight

LinkedIn-matching API keys moved to a per-tenant, self-service setting -- every signed-in user manages their own provider keys/order on their own Integrations tab now, with no shared credentials and no admin gate. This panel is oversight only: aggregate match performance across every tenant, and how many tenants have actually set anything up.

LinkedIn match performance

Which provider is actually bringing in LinkedIn contacts -- across every tenant by default, or pick one tenant above to see just their own breakdown. Counts here reflect whatever matching has already happened elsewhere in the app (a workflow's own LinkedIn step, or a manual/bulk refresh) -- this card itself never triggers a new lookup, and doesn't auto-refresh while you're looking at it, so use the Refresh button after matching a few more contacts to see the updated numbers. "Unknown" is a contact that already had a LinkedIn profile URL before this tracking existed, so there's genuinely no record of which provider (if any) found it -- not guessed into any real provider or "Manual". "Unmatched" has no LinkedIn profile URL at all yet.