PPC TNT — Help & Documentation
PPC TNT connects your ad platforms, call tracking and CRM, matches every lead to the job it became, and shows what each campaign actually returned — then feeds that back to Google Ads. This guide explains every part of the product: the performance dashboard, integrations, call tracking and attribution, the Intelligence suite, Google and Meta Ads Reporting, the Business Profile, the Bulk Pages landing-page builder, agency multi-workspace, the Task Manager, and the AI connector.
Getting Started
What is PPC TNT?
PPC TNT is an ad-performance platform for local service businesses and the agencies that run them. It joins three data sets that normally never meet: what you spent on ads, the calls and forms that spend produced, and the jobs your CRM actually invoiced. Once they are joined you get a real monthly P&L per account, and qualified leads can be pushed back to Google Ads as offline conversions carrying their true revenue value — so Smart Bidding optimises toward the leads that book rather than the ones that merely dial.
Bulk Pages is the landing-page half of the platform: enter the company info once and it generates a unique, conversion-focused page for every service/city combination, each usable as the Final URL of a matching ad group. It is a module, not a prerequisite — the tracking side works just as well against a website you already have.
Product surfaces (left sidebar)
| Section | What it does |
|---|---|
| Dashboard | Cross-channel performance view — calls, jobs, revenue, ad spend, P&L, closing rate. Pulls from your CRM and ad platforms. |
| AI | AI-written executive summary, ranked recommendations, and alerts for the active workspace. |
| Business Profile | One editable doc about your business that every AI feature reads for grounded, on-brand output. |
| Bulk Pages | Sites, pages, leads, files, prospecting, stats, and per-site editing. Includes uploading your own static site to host. |
| Intelligence | Ad Library (Meta), Keywords/SERP (DataForSEO), Research wizard, the Meta & Google Ads chat Agents, Google and Meta Ads Reporting, the Meta Ads Uploader, Negative Keywords, Spend Optimizer, and the Conversion Troubleshooter. |
| Integrations | OAuth / API connections to Google Ads (per workspace or once at the agency MCC), CRMs (incl. Zoho, Jobber, FieldPulse, FareHarbor), call tracking (CallRail + built-in DNI with Five9), ecommerce, and the AI connector plus your own key from any supported AI provider. |
| Agency | Sub-account / workspace switcher, portfolio reporting with per-client budgets and target CPA, reusable onboarding forms, white-label branding, and member management for agency owners. |
| Tasks | The agency's own work tracker — client → service line → task, with My work, list, board and calendar views, comments, templates and a Jira importer. Agency staff and platform admins only. |
| Admin | Staff-only tenant management, impersonation, editable agent prompts, and the error-log tracker. |
| Help / Knowledge / Training | Docs, knowledge base, and onboarding videos. |
Reporting a problem
There is a floating Submit Feedback button in the bottom-right corner of every signed-in page. It captures the screen before the dialog opens, so the screenshot shows what you were looking at rather than the dialog itself — then you add a comment and send. Including the screenshot is optional. Submissions reach the team directly, and the button is deliberately absent from the login, landing-page preview and connector screens.
Performance Dashboard
The top-level Dashboard combines call data (CallRail / CRM), job outcomes (Housecall Pro, ServiceTitan, Jobber), and ad spend (Google Ads, Meta Ads) into a monthly P&L view per workspace. Each row shows Calls, Forms, Total Leads, Booked, Sold, Ad Spend, Revenue, P&L, Closing Rate, and ROAS — with 6-month sparklines for each metric.
- Calls / Forms — Top-of-funnel volume from your call tracking, split into tracked phone calls and CallRail form submissions.
- Total Leads — Calls + Forms. This is the denominator behind closing rate and cost per lead.
- Booked / Sold — How many calls became appointments and how many appointments became invoiced jobs.
- Ad Spend & Revenue — Pulled directly from your ad platform and CRM/QuickBooks integrations.
- P&L & Closing Rate — Calculated. P&L = revenue − ad spend. Closing rate = sold / total leads.
See the public Dashboard guide for a metric-by-metric breakdown.
Integrations
The Integrations page (sidebar → Integrations) is where you connect external systems. Each integration uses OAuth where supported; tokens are stored on the backend.
| Integration | What it powers |
|---|---|
| Google Ads | Pulls ad spend, campaigns, and quality score data into the Dashboard, and receives offline conversions. Agencies can connect once at the MCC level under Agency → Integrations and then pick each client's account from a dropdown, instead of a separate OAuth per workspace. |
| Meta Ads | Ad-spend rollups, the Meta Ads Agent, Meta Ads Reporting and the Meta Ads Uploader. Also carries the Conversions API (qualified calls reported back to Meta) and Meta Lead Ads ingestion — see Meta Conversions & Lead Ads below. |
| Housecall Pro / ServiceTitan / Jobber / FieldPulse / Zoho / HubSpot / GoHighLevel / FareHarbor | CRM data — calls, jobs, revenue. Used by the Dashboard and AI report. Jobber and Zoho connect via OAuth; FareHarbor arrives by webhook; FieldPulse uses a single static API key (it has no OAuth) and optionally a read-only webhook URL for near-real-time job and invoice updates. |
| QuickBooks / Stripe | Revenue without a CRM. QuickBooks is one-click — “Connect with QuickBooks”, sign in to Intuit, done; the Client ID / Secret / Refresh Token / Realm ID path still exists under Advanced for anyone connecting through their own Intuit app. Stripe syncs payments and customer phone numbers. |
| CallRail | Third-party inbound call tracking — feeds Total Calls and source attribution. |
| Call Tracking (built-in) | PPC TNT's own DNI call tracking with Duration / Five9 / Manual call sources and Google Ads conversion sync — set up under Vendors → Call Tracking. |
| Five9 | A call source rather than a CRM: PPC TNT hands out the numbers and your agents' dispositions decide which calls convert. Configured per tracking pool. |
| Shopify | Ecommerce revenue for stores running Google Ads. Set the workspace’s business type to Ecommerce and the app rescopes: the dashboard reports orders, new vs repeat, AOV and ROAS instead of leads, cost per order replaces cost per lead, Shopify orders are uploaded to Google Ads as conversions carrying their real value, and surfaces built around a per-lead call log are hidden. |
| AI Connector | Adds PPC TNT to Claude, ChatGPT, Cursor or any MCP client as a custom connector so you can ask about every client at once. Read-only unless you grant it permission to comment on your task board. |
| Your own AI provider | Optional. Connect a key from Anthropic, OpenAI, xAI, Google, Mistral, DeepSeek, Groq or OpenRouter and every AI feature runs on it instead of our platform AI. |
| GTM / GA4 | Site-wide tracking on every Bulk Pages site (set in Info → Google Manager ID). |
Step-by-step setup is in the public Integrations guide.
Call Tracking & Attribution
PPC TNT includes its own call tracking so you can tie inbound phone calls back to the Google Ads click that drove them — and push those calls to Google as offline conversions — without paying for a separate call-tracking vendor. Set it up under Vendors → Call Tracking.
- Dynamic number insertion (DNI) — a small script on your site swaps in a tracking number and remembers the visitor's Google click (gclid).
- Call sources — choose how call outcomes are reported: Duration (a call counts as a conversion once it runs past a minimum length), Five9 (auto-pulls dispositioned calls from your Five9 contact center), or Manual (CSV upload). An uploaded value is stored as a manual value — the same field as the value box on the call log — which the CRM matcher never overwrites, so it survives the next sync. On a workspace with no CRM those values feed Revenue, Sold and Close Rate on the dashboard and reach CallRail on the nightly push.
- Google Ads conversion sync — qualifying calls are uploaded to Google Ads as offline conversions so Smart Bidding optimizes toward calls that actually book. If a lead is later marked bad, PPC TNT can retract the conversion so Google stops chasing lookalikes of junk leads.
- Call log — each pool has a call log with a date range (today / 7 / 30 days / all time, in your own timezone), the raw click id per call, a counts strip, per-row detail, and Download CSV for the whole range.
- Duplicate pool — copies a pool's destination number, session TTL, call source and its config, Google Ads IDs and backup recipients. Phone numbers are never copied, because a number belongs to exactly one pool — the copy starts empty by design.
- Email backups — a pool can mail an attributed-call CSV for a date range to the recipients configured on that pool. On demand only. That file deliberately omits click ids and landing URLs; use the call log's own download if you need those.
gbraid / wbraid shown instead of a gclid means the pool is working — those identifiers just can't be uploaded as conversions.Intelligence Suite
Ad Library
Build a watchlist of competitor brands and pull their currently-running Meta ads via the Meta Ad Library API. Save the best creative and copy into your swipe file for later reference. Useful for benchmarking offers, hooks, and creative styles.
Keywords & SERP
Live SERP queries via DataForSEO. Returns paid results, organic results, the local map pack, and People Also Ask boxes — alongside keyword metrics (search volume, CPC, competition). Use this before launching a campaign to size demand and benchmark competitor ads on the keyword.
Research
Paste a competitor URL or topic and the Research wizard scrapes the page, extracts a dossier (pain points, angles, customer quotes), and generates blog post drafts, ad copy variants, and landing-page angle suggestions via AI. Designed to compress hours of manual research into minutes.
Meta Ads Agent
Chat interface for an AI-orchestrated MCP client connected to the Meta Ads API. Ask “why did CPA spike yesterday?” or “pause every ad set under 1% CTR” and the agent inspects your account, explains, and (with confirmation) executes changes via tool calls.
Google Ads Agent
The Google-side twin of the Meta Ads Agent — an AI + MCP chat connected to the Google Ads API. Ask about wasted spend, search terms, or campaign structure, and the agent inspects the account and proposes (then, with your confirmation, applies) changes. Pick an Agent Skill from the dropdown to layer in extra expertise (e.g. “home-services lead-gen”) for the conversation.
Negative Keywords
Finds Google Ads negative keywords automatically from your unqualified calls. It pulls the transcripts of calls CallRail marked as not-a-lead, runs each through your AI against your Business Profile, and accumulates categorized negative-keyword suggestions. Review the list (uncheck anything you want to keep), then apply the rest to your campaigns to stop paying for searches that never convert.
Spend Optimizer
Surfaces where to shift Google Ads spend across geographies and day × hour, with a confirm-to-apply action list and an evidence pack (top metros, a day/hour heatmap, and weather correlations — it even factors in NOAA weather data, e.g. how demand tracks temperature for seasonal services).
Conversion Troubleshooter
For when Google Ads says 40 conversions and you only counted 22 calls. It puts Google's conversion count next to the calls and form submissions PPC TNT actually recorded over the same date range, states the delta, and breaks it down per tracking number — usually where the answer is. A first-time-caller toggle tests the most common cause: repeat callers being counted twice.
It pulls live from Google Ads and CallRail rather than the stored tables, because those don't carry all-conversions, first-time flags, the dialled number, or form submissions at all. Your filters are remembered per workspace.
Meta Ads Uploader
Bulk-creates Meta ads by copying the settings of an ad that already works. Upload your creatives, pick the template ad, and its objective, targeting and copy carry across the batch. A server-side dry run — performed by the same planner that executes the launch — previews the exact set that would be built, and everything is created paused. It can join ad sets that already exist rather than duplicating them. See Meta Conversions & Lead Ads below.
Google & Meta Ads Reporting
The two reporting pages in this suite are big enough to have their own section: a three-level accordion over your live Google Ads or Meta account, with period-over-period deltas on every metric. See Ads Reporting below.
Ads Reporting
Two pages under Intelligence — Google Ads Reporting and Meta Ads Reporting — answer the question the Dashboard can't. The Dashboard tells you whether an account made money this month; these tell you which campaign, ad group or keyword did it. Each is a three-level accordion — campaign → ad group → keyword on Google, campaign → ad set → ad on Meta — with every metric shown beside its change against the period before.
Both read the platform live on every request. Nothing is stored, so there is no sync to wait for — and no history beyond what Google and Meta themselves retain. Children load when you expand a row, because a mid-size account carries 5,000–50,000 keywords and fetching them all up front would time out.
The period, and reading the deltas
- Date range — a preset or a custom range. The caption under the controls names both windows and their day counts, so what is being compared to what is never a guess.
- Comparison — one mode, Previous period: the window immediately before yours, of the same length, toggled off or on. It replaced WoW / MoM / QoQ, which with “Last 30 days” selected compared two 30-day windows overlapping by 23 days under a label saying week. Equal-length windows mean every count is like-for-like by construction.
- Percent vs points — counts move in percentages; proportions (impression share, CTR, conversion rate) move in percentage points. 55% to 60% is +5pp, not +9.1%.
- Rows that stopped — something that ran in the comparison window and not in this one is still listed, blanked and badged no spend this period. “$4,000 last month, nothing this month” is the most useful thing a comparison can tell you, and it is invisible in the current window by definition. The mirror case — something that didn't run in the comparison window, so has nothing to be measured against — is badged new rather than shown as an infinite rise.
- Currency — money is formatted in the ad account's own currency, not assumed to be dollars.
The table
- It opens filtered to rows that spent. Most accounts carry far more retired campaigns than live ones, so Spending is the default and the control (Show: Spending / All) says so under the date line. The rule is spend, not status: a paused campaign that spent real money inside the window still shows, so the visible rows always sum to what the account actually spent. Switch to All for everything.
- Columns — the picker sets the table width and remembers your choice per network. On top of it, a column is dropped automatically when no visible row can report it — so a column chosen while keywords were open doesn't linger as a wall of markers once they are collapsed.
- A muted · is not a dash. The dot means the platform has no such metric at that level; the em dash means no data. Lost IS (budget) exists only on a campaign, because budgets are a campaign resource — reading “budget is not my constraint” off an ad-group row would send you to raise bids when you should raise budget.
- Conversion rate is 0%, not a dash, when clicks converted none. That is a measured fact and usually the most actionable number on the row. The dash is reserved for “there were no clicks, so the question doesn't arise”.
- Where a keyword's clicks go — Final URL,URL suffix (UTM) and Tracking template are keyword-grain columns, hidden by default because a campaign and an ad group have no final URL. They are kept as three columns under Google's own names, because they are different fields with different rules. A keyword with several final URLs shows the first plus a count (
+2). - The name column is frozen and the metric columns scroll under it, with a fade at the right edge whenever there is genuinely more to scroll to. Fourteen numeric columns otherwise hide the eleventh one from everybody.
The daily trend chart
Above the table sits a daily line for the last 6 weeks, 3 months or 6 months, with its own metric picker. It covers the whole account by default (“Entire account”); the small ◹ button on any table row scopes it to that campaign, ad group or keyword. The scope is always named next to the chart and cleared from there, never by clicking the row again — that row may since have been collapsed or scrolled away, and the click on it already means expand.
- Switching metric is free. Every metric is fetched at once per range and scope, so only changing the range or the scope costs a request.
- A day with no delivery is a gap, never a zero and never omitted. A zero asserts the campaign ran and achieved nothing; a bridged line draws spend that never happened.
- A metric the scope can't report says so rather than drawing an empty box — budget-lost share on an ad group, or impression share anywhere on Meta.
What each network reports
| Page | Levels | Columns |
|---|---|---|
| Google Ads | Campaign → ad group → keyword | Cost, Impr., Clicks, CTR, CPC, Conv., Conv. rate, Cost / conv., Search IS, Lost IS (rank), Lost IS (budget), plus the keyword-only Final URL, URL suffix (UTM) and Tracking template. |
| Meta Ads | Campaign → ad set → ad | Spend, Impr., Reach, Freq., Clicks, CTR, CPC, CPM, Results, Result rate, Cost / result. |
- Impression share is never derived. Google computes it over the whole date range; a campaign's share is not the average of its ad groups'.
- Google clamps the reported share, so the table prints
> 90%and< 10%rather than a false-precision figure. - Meta publishes no impression share at any level, so those columns are absent rather than present and permanently empty. CPM is the closest read on auction pressure, and rising frequency against flat reach is the saturation signal.
- Meta reach and frequency don't add up — on purpose. Meta deduplicates people across an ad set's ads, so an ad set's reach is usually less than its ads' summed. Each level is its own query rather than a roll-up, which would overstate reach and understate frequency without ever looking wrong.
- Results is Meta's own aggregate lead action. A blank means Meta reported no action data at all, which is not the same as zero leads.
- CPC, CTR and cost per conversion are recomputed from the totals in view, never averaged from the platform's per-row averages — averaging an average is a different number as soon as rows differ in click volume.
The Meta creative panel
Click an ad row on the Meta page and a panel opens showing the creative itself — the images or video, the primary text, headline and description, the destination URL and the UTM tags, all as selectable text, with a link out to the real post. It is rendered from the ad's own assets rather than embedding Meta's preview iframe, whose URL carries a live access token that cannot be stripped.
Meta Conversions & Lead Ads
Three pieces close the loop on Meta: qualified calls reported back through the Conversions API, Meta Lead Ads ingested as leads, and the Meta Ads Uploader for building an ad batch out of one that already works. All three use the same Meta connection you set up under Integrations.
fbclid is still reportable to Meta, where the same call with no gclid is not reportable to Google.The Conversions API
Lead fires at qualification; Purchase fires when a value appears. Meta accepts a valueless Lead and optimises for lead count, so the lead is reported as soon as it qualifies whether or not anyone knows yet what the job was worth. When a value first appears, a separate Purchase event fires once, with its own id.
The pixel deduplicates properly. The browser pixel and the server event share an event id minted in the browser, so a single action is counted once rather than twice.
Meta Lead Ads
Connect your Facebook Page and lead-form submissions are ingested as leads like any other source, attributed to the ad that produced them, and shown alongside calls and website form submissions. If the site has a lead webhook set, ingested Lead Ads are forwarded to it too — so they reach your CRM without anyone exporting a CSV out of Meta's Lead Center.
Meta Ads Uploader
Under Intelligence. Upload your creatives, pick an ad that already performs, and its objective, targeting and copy become the template for the whole batch. The flow is: ad account (read-only, one per workspace) → media → copy settings from an existing ad → campaign and ad set options → preview → ad text, enhancements and publication → create.
- Everything is created PAUSED. Nothing spends until you unpause it, which is what makes the preview worth reading.
- The preview is the launch. It is a server round trip performed by the same planner that executes the launch, and it writes nothing — so what you approve is literally what runs.
- Template text is a prefill, not a fallback. The source ad's copy loads into the fields once; after that the fields are the truth. Clearing a headline clears it on the launched ads.
- Join ad sets that already exist rather than duplicating them, so a new creative round lands in an audience that has already finished learning.
- The schedule card prints the ad account's clock, not your browser's — Meta reads a naive start time in the account's timezone.
Media uploads first and the launch references it afterwards, so a slow upload never blocks the form and a failed launch never means re-uploading everything. The page's state belongs to one ad account and resets on a workspace switch.
AI Recommendations
The AI page (left sidebar → AI) is an AI-generated executive report on the active workspace. It contains:
- Summary — A plain-English readout of how the account is doing this month vs last.
- Recommendations — Ranked actions (e.g. “pause keyword X with $230 spend / 0 conversions”).
- Alerts — Outlier detection on key metrics (CPA spike, conversion drop, low quality score).
Business Profile
The Business Profile (sidebar → Business Profile) is a single editable document describing your business — company name, service area / locations, services, competitors, unique selling points, and campaign goals. Start from the built-in template and fill in what applies.
Every AI feature reads it: the AI report, the Meta and Google Ads agents, the Negative Keywords finder, and Bulk Pages copy generation all use your profile as background so their output is grounded in your real business instead of generic guesses. Filling it in once measurably improves everything downstream — it's the highest-leverage few minutes of setup in the app.
Agency onboarding forms. If your agency onboarded you with a form, the Onboarding form tab holds the questionnaire and the Profile document tab holds the finished Markdown. AI pre-fills what it can from a scrape of your website plus Google Places, and every filled answer carries a confidence level — review the low-confidence ones before publishing, since those are inferences rather than facts read off the site. Agencies author these under Agency → Forms.
Which AI reads it. Every AI feature runs on our platform AI by default. Connect your own key on the AI vendor card — Anthropic, OpenAI, xAI, Google, Mistral, DeepSeek, Groq or OpenRouter — and all of them run on that instead: insights, both ad agents, the spend optimizer, negative keywords, research, this onboarding pass and Bulk Pages copy. The Business Profile is passed as context either way, so switching providers changes which AI reads your account, not what it knows about it. Press Compare providers on the card for the capability table.
Bulk Pages — Creating a Site
Four ways to start a site
| Path | When to use it |
|---|---|
| Guided wizard | The default. Answer the questions below and every service × city page is generated for you. |
| Build with AI | An interview that produces a whole site. You can hand it a content document and it reads the workspace’s Business Profile for grounding, so the copy matches the business rather than a template. |
| Import from WordPress | Point it at an existing WordPress site and it brings the content across, rather than starting from a blank slate. |
| Upload your own HTML | Host a static site you already built. It still gets the full set of tabs, phone and thank-you tracking, and heat maps. |
Step-by-Step: New Site (guided wizard)
- 1Site URL (slug) — This becomes the subdomain: yourslug.ppctnt.com. Use the business name with no spaces. Example:
aceplumbing→ aceplumbing.ppctnt.com - 2Business Info — Enter company name, phone number, and primary city. The phone number appears in the header and a tap-to-call link on mobile. Make it the tracking/forwarding number you use in Google Ads so you can attribute calls correctly.
- 3Industry & Services — Select the business type (Plumbing, HVAC, Electrical, etc.) then pick every service you run ads for. One landing page is created per service.
- 4Branding — Upload a logo. Choose a colour theme. Add trust icons (Google Reviews, BBB, Licensed & Insured, etc.) — these appear in the footer of every page and build credibility.
- 5Coupon — Add an optional offer (e.g. “$30 Off First Service”). Coupons appear prominently on the page and in the form, which increases conversion rate.
- 6Pages are generated — After you hit Create, all pages are live immediately. Visit the site to confirm it looks right before linking it from your ads.
Site Editor — Tabs Explained
Info Tab
The master settings for the site. Changes here apply across all pages.
| Field | What it does |
|---|---|
| Business Phone | Displays in the header on every page as a tap-to-call link. Use a call tracking number to attribute inbound calls to the correct campaign. |
| Main City | Used in auto-generated page copy e.g. 'Plumbing Services in Dallas'. Also used as the default city if no city-specific page exists. |
| Theme | Controls the colour palette and layout style of all pages. Classic = blue/white, Modern = dark, Bold = high-contrast, Minimal = clean/white. |
| Google Manager ID | Paste a GTM container ID (GTM-XXXXX) or GA4 measurement ID (G-XXXXXXX). Tracking fires on every page of the site automatically. |
| Custom Domain | Point your own domain to this site. Enter the domain here, then add a CNAME DNS record pointing to ppctnt.com. |
| Coupon | A site-wide offer shown on all pages unless overridden per-page. Good options: percentage off, dollar off, free estimate, free inspection. |
| Trust Icons | Pick up to 4 badges (Google Reviews, BBB, Angi, etc.) — displayed in the footer. Select icons that match certifications the business actually has. |
| Logo | Shown in the navigation bar on every page. Keep it under 200×60px for best results. |
Pages Tab
Lists every generated landing page. Each row shows the page name, URL slug, publish status, and a link to preview it. From here you can:
- Edit a page — Customise the headline, body copy, main image, coupon, and trust icons for that specific service. Useful when one service needs different messaging than the rest.
- Toggle published/draft — Only published pages are visible to visitors. Set a page to draft if you're not yet running ads for that service.
- Add a page manually — Create a custom URL slug for a campaign that doesn't match an existing service (e.g. a seasonal promotion).
- Import/Export CSV — Bulk-upload dozens of pages at once, or export to hand off to a client or edit offline.
- Copy page URL — Use this URL as the Final URL in your Google Ads campaign.
yourdomain.com/water-heater-replacement — not the homepage.Design Tab & AI Sections
The Design tab opens the WYSIWYG editor (powered by SectionsEditorBody.tsx) — a live preview of the page where every section is editable in place. Use the right rail to:
- Pick sections — Hero, Services, Reviews, About, FAQ, Gallery, CTA, Footer. Toggle sections on/off; only the ones checked render.
- Source URL scrape — Paste the business's existing website URL and the AI Sections theme imports the copy, images, and brand details automatically.
- Theme tokens — Switch between Classic, Modern, Bold, Minimal, and AI Sections. Each theme is a self-contained design system.
Leads
Per-site Leads tab
Shows every form submission from the site's contact form, sorted newest first. Each lead includes the name, phone, email, message, and the page they submitted from. You can export leads to CSV or delete old ones.
What a lead is worth
A lead's value comes from the first paid job for that customer identity — paid meaning money was actually collected, since job status fields are ignored. Three things are worth knowing about how that value is shown and kept.
- The CRM's invoice number is shown beside the value, so you can trace a figure back to the invoice it came from without leaving the app.
- A repeat customer's later jobs are credited to the lead that won them. One reporting toggle controls whether dashboard revenue includes those repeat jobs. It changes what is reported, never what is uploaded to Google.
- Values you enter by hand are never overwritten. A value typed on the call log — or bulk-imported by CSV — is stored as a manual value that the CRM matcher does not touch, so it survives the next sync. On a workspace with no CRM these feed Revenue, Sold and Close Rate on the dashboard and reach CallRail on the nightly push. Where a CRM is connected, jobs stay the authority and manual values are not stacked on top, so a lead with both is never counted twice.
Global Leads (Stats → Leads)
The portfolio view across every site in the workspace. Filter by site, sort, and export to CSV for CRM import. Phone numbers are clickable (tap-to-call on mobile).
Lead Forms
Every generated Bulk Pages page carries a lead-capture form, and both render paths — the themed templates and the newer sections renderer — submit to the same endpoint.
- Validated against the page's own definition. The field list is re-derived server-side from the stored site and page rather than trusted from the request. Recognised values go to their own columns, anything else is kept as custom fields, and fields the page never defined are dropped.
- Attribution travels with the lead. Click ids, UTMs, the first-touch landing page and the referrer are captured when the visitor first arrives, held for 90 days, and read back at submit.
- Notification and forwarding. New leads email the site's business address. Set a lead webhook URL on the site and each lead is also posted onward to it for your CRM.
- Spam handling is silent. A honeypot field, a time-to-submit check and duplicate suppression flag suspicious submissions rather than rejecting them visibly, so a real customer is never told their enquiry looked like spam. Per-IP rate limits sit behind that.
Stats & Analytics
Per-site Stats tab
- 30-day page view chart — Daily visit volume. Spot traffic spikes or drops.
- Views by Page — Which service pages get the most traffic.
- Phone Taps — Tracked every time a visitor taps/clicks the phone number.
- Form Button Clicks — Tracked every time someone clicks “Schedule A Service”.
- Recent Interactions — Chronological event log with the page each event happened on.
Global Stats (sidebar → Stats)
| Tab | What you see |
|---|---|
| Overview | Total sites, active vs inactive, total pages. Per-site breakdown table showing page count, phone taps, and form clicks side-by-side. |
| Leads | All form submissions from all sites, filterable by site. Export to CSV. Phone numbers are click-to-call on mobile. |
| Pages | Every generated page across all sites. Status (published/draft). Good for auditing which pages are live. |
| Events | Phone tap and form button click counts across all sites. Drill down to see which site and page triggered each event. |
Files Library
A shared file library for logos, images, coupon graphics, and any other assets you reuse across multiple sites. Organise into folders, upload once, then reference from any site or page via the file picker. Avoids duplicating large files and keeps brand assets consistent across a client's entire portfolio of pages.
Custom Domains
Every site has a free yourslug.ppctnt.com subdomain. To point your own domain at it:
- 1Open the site editor → Info tab.
- 2Enter your domain in Custom Domain (e.g.
www.aceplumbing.com). - 3At your DNS provider, add a CNAME record pointing the chosen subdomain to
ppctnt.com. - 4Click Verify in the editor. DNS typically propagates in 5–30 minutes.
- 5Once verified, your site is reachable at both
yourslug.ppctnt.comand your custom domain. SSL is auto-provisioned.
Agency & Multi-Workspace
An agency in PPC TNT is a parent account that contains multiple sub-accounts (one per client). Each sub-account is an isolated workspace with its own sites, leads, dashboard, and integrations.
- Account Switcher — In the top-left of the sidebar. Pick a sub-account to scope the entire app to that workspace.
- Agency page — Lists every sub-account and every member, with quick links to enter a workspace.
- New Sub-account wizard — Captures business type, integrations intent, and provisions an empty workspace ready for the client.
- Member roles — Invite team members with read-only or full write access scoped to specific workspaces.
- Reporting — Agency → Reporting rolls every client into one view: combined spend MTD and projected, pacing against each client's own monthly budget, cost per lead against their target CPA, the gap between tracked leads and platform conversions, and per-client lead trends.
- Budgets & target CPA — Set per client from the client row's Budget panel or on the Reporting page. Leaving a field blank means inherit the agency default, not zero — so an unconfigured client isn't treated as having no budget. Owner-only.
- Agency-level Google Ads — Connect Google Ads once at the agency (MCC) level under Agency → Integrations, then pick each client's account from a dropdown on their Google Ads card. No separate OAuth per workspace. For clients outside your MCC, “Connect a different Google account” still does a per-workspace connection.
- Onboarding forms — Author one reusable questionnaire under Agency → Forms and apply it to every new client. AI pre-fills answers with confidence labels; publishing generates that client's Business Profile.
- Match Debugger — Agency → Debug, across your own sub-accounts. Walks a single call or job through the attribution rules and states, per step, why it did or did not match: the phone number as normalized, whether an earlier call already claimed the identity, whether the job was paid, and which click it landed against. Every verdict comes from the server running the matcher's own rule, so what it says is what production did — which means whoever fields “why isn't this client's revenue showing up?” can answer it without escalating.
- Tasks — The built-in work tracker: client → service line → task, with My work, list, board and calendar views. Every client gets a service line per discipline, and an Intelligence tool run files a comment on the matching one automatically. See Task Manager below.
Task Manager
Tasks in the sidebar is the agency's own work tracker — and the replacement for the Jira integration. It has three levels: client (one of your sub-accounts) → service line (Google Ads, SEO, Reporting — whatever your disciplines are) → task.
It stays in the sidebar inside a sub-account as well as at agency root: an agency member working on one client wants that client's board, and the entry there is simply the same board pre-filtered to them.
Four views, one set of filters
- My work — everything assigned to you across every client, bucketed overdue / today / next 7 days / later / undated. It resolves you from your own session rather than being a preset link, so a bookmark or a nav item can honestly mean “mine”.
- List — grouped, collapsible rows you can edit inline, with bulk select for reassigning, restatusing, archiving or deleting. Group counts come from the whole matching set, not the loaded page.
- Board — kanban by status, with swimlanes for any other grouping the filter bar offers. Drag to move or reorder. It loads the whole matching set rather than a page, because a board that paginates lies about its column counts.
- Calendar — month and week. Dragging a card moves its due date, and a task that also has a start date has its span shifted rather than stretched. A task with no due date never appears rather than being given one.
What you are looking at lives in the URL — client, service line, assignee, status, priority, label, due range, search, sort and grouping — and switching view carries it across, so a filtered board is a link you can paste. Save one as a named view from any task header and keep it private or share it with the agency; because a view is a named URL, applying it lands you on the right surface (“everything overdue” wants the list, “this week” wants the calendar).
Tasks, owners and repeats
- Quick add — title, client, service line, assignee; everything else defaults. Adding from a service-line page, a board column or a calendar cell prefills what that surface already knows and shows it locked, so the context is visible rather than mysterious.
- Nobody has to own a task. Unassigned is a real state and renders as a dashed avatar, because “nobody owns this” is exactly what is worth spotting down a column.
- Repeat — every week, every 2 weeks, monthly on the 1st or the last day, quarterly, or yearly. One occurrence is open at a time and the next is created the moment you mark the current one done, so skipping three months of a monthly report leaves one overdue task rather than three identical copies. The rule is measured from the due date, so a repeating task without one warns you.
- Archive vs delete — archiving keeps a task and its history; delete is for the case archiving doesn't cover, such as a template stamped onto the wrong client. Bulk delete takes two clicks and the second one names the count.
Comments — and where tool runs land
Clients, service lines and tasks each carry a comment thread. Three kinds of author render differently: people as cards, agents tinted with the tool name and a link to the run, and system notes (status changed, reassigned) as one quiet line, because that is context rather than conversation. Type @ to mention a teammate and they are notified; Cmd/Ctrl+Enter sends.
When a Google Ads or Meta tool runs for a client, it files a comment against that client's matching service line automatically. That is why the service-line page gives its stream equal billing with the task table — and comments left on tasks beneath the line are folded into it, so a run started from a task still shows there. Service lines are per client, so the page always names whose “Google Ads” you are looking at.
The client page
Everything about one client in one place: the info doc, quick links, which integrations are actually connected, service lines with their status counts, and a client-level comment thread. Connections are read live on every load rather than cached — a stale “Google Ads connected” reads as authoritative, and “never synced” and “synced long ago” are reported as the different facts they are.
Import and templates
- Jira import — Tasks → Import takes a Jira export and maps each Jira epic onto a service line on your board, defaulting to its own suggestion and offering to create one where nothing matches. It writes nothing until a dry run for your current selection has come back, and changing the selection clears it. Parser warnings (“3 sub-tasks folded into their parent”) are shown verbatim before you commit.
- Templates — turn an import into a reusable tree, or write one from scratch, then stamp it onto many clients at once. Templates are editable in place, including a default owner per service line, so a 46-task template doesn't all land on whoever applied it. A default template can be applied to every client and to each new one automatically.
- Undo, honestly — every application is in a ledger. Undo refuses to delete a task somebody has edited or commented on since, so the count coming back is often smaller than the count that went in, and the screen says which rows it kept and why.
Notifications
The bell in the header carries assignments, mentions, status changes, and tasks going due or overdue. Two emails sit alongside it, both per-person and both switchable in your notification preferences: a daily digest of what you haven't already read in the app, and a Monday summary of the standing state of your own board across every client — skipped entirely when your board is empty, because a weekly “you have 0 tasks” is what teaches people to ignore the sender. Unassigned work is never mailed to anyone: it belongs to the board rather than to a person.
read:tasks permission, and comment:tasks lets it post a comment — the only write the connector has anywhere in the product. It can never create, edit or move a task.AI Connector
You can add PPC TNT to Claude, ChatGPT, Cursor or any other MCP client as a custom connector and then ask about your accounts in conversation — “which clients aren't fully set up?”, “what changed on Ace Plumbing since last week?”, “where are we losing money across the portfolio?”. These are questions that span every account at once, which is exactly what a page-by-page dashboard is bad at.
Setup is one URL. In Claude or ChatGPT, open Settings → Connectors; in an editor such as Cursor, VS Code, Windsurf or Zed, add a remote MCP server in your MCP settings. Name it PPC TNT, and paste https://betterads-production.up.railway.app/mcp as the remote MCP server URL. Leave the OAuth client id and secret blank — the server registers your client automatically over Dynamic Client Registration. Click Add, then Connect, and approve on the PPC TNT screen that opens.
- What it can see — exactly what you see in the app. Agency owners and billing members get every client workspace; other members get only their explicit grants; solo operators get the workspaces they own. That scope is re-checked on every request, so removing someone from an agency shrinks their connector on the next question.
- Permissions —
readcovers every reporting tool.read:tasksadds the task board, andcomment:tasksis the only permission that writes: posting a comment on a client, service line or task. Uncheck both for a strictly read-only connector. - Setup audit — ranks what's missing per account: no ad platform, no CRM while ads run, never synced or sync failing (critical); no call tracking, stale sync, spend with no attributed revenue, conversion upload off, no Business Profile (warning); inherited budget or target CPA (suggestion).
- Improvements — projected over/underspend, cost per lead above target CPA, a large gap between tracked leads and platform conversions, accounts spending with no Google Ads changes in 30 days, and lead volume falling at similar spend — ranked together by dollars at stake.
- Revoking it — remove the connector wherever you added it — Settings → Connectors in Claude or ChatGPT, or your editor's MCP settings. Its tokens are scoped only to the connector, so this has no effect on your PPC TNT login.
Billing & Plans
Plan upgrades use Stripe Embedded Checkout. Click the ⚡ Plan link at the bottom of the sidebar (or visit /upgrade) to:
- See your current plan and usage.
- Toggle between monthly and annual pricing.
- Pick a plan and check out without leaving the app.
Frequently Asked Questions
Public Guides
Long-form public guides live on the marketing site at ppctnt.com/docs:
- How PPC TNT Works
- Dashboard Guide
- Integrations Guide
- Call Tracking & Attribution
- Conversion Troubleshooter
- Intelligence Suite
- Google & Meta Ads Reporting
- Meta Advertising
- Business Profile
- Bulk Pages
- Dedicated Landing Pages for Google Ads
- Google Ads Quality Score: Complete Guide
- AI Connector
- Agency & Multi-Workspace