Every HubSpot Object
Explained
Properties, purpose, real-world examples, case studies, and admin best practices for every standard object in HubSpot — CRM, Sales, and Activity.
Core records for people, companies, opportunities, support, industry-specific records, and custom CRM data models.
Contacts solve the fundamental CRM problem: "Who are the people we're talking to?" Every interaction, deal, email, and activity in HubSpot ultimately revolves around a Contact. It is the most central object in the entire system.
What Is a Contact?
A Contact record represents a real individual person — a lead, prospect, customer, partner, or any human being your business has a relationship with. Every form submission, email open, website visit, or sales interaction is stored on a Contact record.
Who Uses It
Marketing — segments contacts into lists for campaigns. Sales — reaches out, logs calls, tracks lifecycle. Service — handles tickets associated to contacts. Admins — maintain data quality, manage properties, set lifecycle rules.
Key Concept: Deduplication
HubSpot uses email address as the unique identifier for contacts. If two records share the same email, HubSpot flags a duplicate. As an admin, managing duplicates is one of your most critical ongoing responsibilities.
Associated Objects
Default Contact Properties
| Property | Type | Purpose |
|---|---|---|
| Primary identifier — used for deduplication | ||
| firstname | Text | First name for personalization |
| lastname | Text | Last name |
| phone | Phone | Direct phone number |
| jobtitle | Text | Role or title at their company |
| company | Text | Company name (text field, separate from Company object) |
| lifecyclestage | Dropdown | Where in the funnel: Subscriber → Lead → MQL → SQL → Opportunity → Customer → Evangelist |
| hs_lead_status | Dropdown | Sales status: New, Open, In Progress, Open Deal, Unqualified, Bad Timing |
| hs_analytics_source | Dropdown | Original traffic source (Organic, Paid, Direct, etc.) |
| hs_email_optout | Checkbox | Whether contact has opted out of marketing emails |
| createdate | Date | When the record was created |
| lastmodifieddate | Date | Last time any property was updated |
| notes_last_contacted | Date | Last time a rep logged a contact activity |
| hubspot_owner_id | Owner | Which HubSpot user owns this contact |
| hs_content_membership_status | Dropdown | Access to private content / membership portals |
| city / state / country / zip | Text | Location data for segmentation and personalization |
| website | URL | Personal or company website |
| linkedin_bio / twitterhandle | Text | Social profiles |
| num_notes / num_contacted_notes | Number | Calculated engagement counts |
Real-World Example
- 01Sarah Khan registers for a webinar using a HubSpot form
- 02HubSpot creates a Contact record automatically with her email, name, and job title
- 03Lifecycle stage is set to "Lead" by a workflow triggered on form submission
- 04She attends the webinar → workflow updates her to "MQL" and notifies an SDR
- 05SDR logs a call on her record, creates a Deal, and updates Lead Status to "In Progress"
- 06She buys → lifecycle stage updates to "Customer" → enrolled in onboarding sequence
Case Study
A digital marketing agency had 4,200 contacts in HubSpot but 38% were duplicates. Their email open rates were tanking because the same person was getting emails twice. Their lifecycle stages were inconsistent — some customers were still labeled "Lead."
Admin Solution
- 🔍Ran a duplicate audit using HubSpot's built-in duplicate tool (Contacts → Actions → Manage Duplicates). Merged 1,592 duplicate records over two weeks.
- ⚙️Built a workflow that auto-updates Lifecycle Stage based on deal stage changes — so a won deal instantly flips the contact to "Customer."
- 🚫Added required field validation on all forms: email must match standard format, phone must have 10+ digits. Reduced junk submissions by 60%.
- 📋Created a "Contacts with no owner" active list. A weekly task reminds the admin to assign or clean these records.
Admin Best Practices
- ✅Always set a default Lifecycle Stage on form submissions — never leave it blank
- ✅Use workflows to progress lifecycle stages automatically based on behavior (form fill, email click, deal creation)
- ✅Run monthly deduplication audits — HubSpot auto-suggests duplicates based on email and name similarity
- ✅Set Contact Owner via round-robin workflow for inbound leads — no lead should go unassigned
- ✅Create a required email validation property to block fake emails on form submission
Common Mistakes
- Leaving lifecycle stage blankWithout a lifecycle stage, you can't build funnel reports or trigger stage-based workflows.
- Not associating contacts to companiesIn a B2B setup, unassociated contacts break account-level reporting entirely.
- Using the company text field instead of the Company objectThe "company" text property on a Contact is just a string — it doesn't link to a real Company record.
"HubSpot uses email as the contact deduplication key. As an admin, I maintain data quality by running bi-weekly duplicate audits, using required field validation on forms, and building workflows that auto-update lifecycle stages based on deal activity."
In B2B sales, you don't sell to individuals alone — you sell to businesses. A Company record is the account-level view of everything happening with an organization. It groups all contacts at that company, all deals with that company, and all support history.
Auto-Association by Domain
HubSpot can automatically associate a Contact to a Company if their email domain matches the company's domain name. For example, naveed@techcorp.com → auto-associates to the "TechCorp" company record that has domain techcorp.com.
As an admin, you control this setting: Settings → Objects → Companies → Auto-associate companies to contacts.
| Property | Type | Purpose |
|---|---|---|
| name | Text | Company name — used for deduplication |
| domain | URL | Website domain — used for auto-association with contacts |
| industry | Dropdown | Industry sector for segmentation |
| numberofemployees | Number | Company size — useful for ICP targeting |
| annualrevenue | Number | Annual revenue for account scoring |
| lifecyclestage | Dropdown | Company-level funnel stage |
| hs_lead_status | Dropdown | Sales outreach status at the account level |
| city / state / country / zip | Text | HQ location |
| phone | Phone | Company main phone number |
| hubspot_owner_id | Owner | Account owner — typically an AE or CSM |
| type | Dropdown | Prospect, Partner, Reseller, Vendor, etc. |
| createdate | Date | When the record was created |
| hs_num_associated_contacts | Number | Calculated — count of linked contacts |
| hs_num_open_deals | Number | Calculated — number of open deals associated |
| description | Text Area | Free-text description of the company |
- 01Admin creates a Company record for "Unilever" — sets domain as unilever.com
- 02HubSpot auto-associates 14 contacts with @unilever.com emails to the company record
- 03Account Executive is set as Company Owner — now visible on all associated records
- 04A Deal is created and associated to Unilever — now visible from the company timeline
- 05Company-level revenue is tracked: total closed revenue across all deals = $240,000
A B2B consulting firm had all contacts in HubSpot but no Company records. They couldn't see which accounts had open deals, which clients had support tickets, or what their total revenue per account was. Sales and CS were constantly asking each other "are we working with this company?"
Admin Solution
- ⚙️Enabled domain-based auto-association. Overnight, HubSpot linked 600+ contacts to company records automatically.
- 📊Built a Company dashboard showing: total open deals per account, last activity date, MRR, number of contacts, and ticket count.
- 👤Assigned a CSM as Company Owner for all active clients — now the CSM gets notified when a client submits a ticket or a deal changes stage.
- ✅Always populate the Domain field — it enables auto-association and company enrichment via HubSpot Insights
- ✅Use Company Type property to distinguish Customers vs Prospects vs Partners in reports
- ✅Set Company Owner deliberately — don't leave companies unowned. Owner = accountable team member.
- ✅Use the "Parent Company" association for subsidiaries and enterprise accounts with multiple entities
Deals answer the question: "What revenue opportunities are we actively working on, how much are they worth, and when will they close?" Every sales team needs to track this — and Deals are HubSpot's answer to that pipeline visibility problem.
The Pipeline System
Deals live inside Pipelines. A pipeline is a sequence of stages, each with a close probability percentage. You can create multiple pipelines for different sales motions (e.g. New Business vs Renewal vs Partnership).
10%
25%
50%
75%
| Property | Type | Purpose |
|---|---|---|
| dealname | Text | Name of the deal — usually "Company + Product/Service" |
| amount | Number | Total deal value in currency |
| closedate | Date | Expected closing date — used in forecasting |
| dealstage | Dropdown | Current pipeline stage |
| pipeline | Dropdown | Which pipeline this deal belongs to |
| hubspot_owner_id | Owner | Deal owner — the sales rep responsible |
| deal_currency_code | Dropdown | Currency for international deals |
| hs_deal_stage_probability | Number | Auto-calculated win probability by stage |
| dealtype | Dropdown | New Business, Existing Business, Renewal |
| description | Text Area | Notes about the deal |
| closed_lost_reason | Dropdown | Why the deal was lost — critical for sales analysis |
| hs_forecast_amount | Number | Manual forecast override — used in Sales Hub forecasting |
| num_associated_contacts | Number | How many contacts are linked to this deal |
| createdate | Date | When the deal was created |
| hs_date_entered_[stage] | Date | Auto-populated timestamp when deal entered each stage |
| hs_time_in_[stage] | Duration | Auto-calculated time spent in each stage |
- 01SDR qualifies a lead at "TechStart Inc." — creates a Deal: "TechStart – Brand Package | $12,000"
- 02Deal enters "Discovery" stage. Close date: 45 days out. Owner = SDR.
- 03After discovery call, deal moves to "Proposal." A Quote is created and attached.
- 04Client negotiates price — deal moves to "Negotiation," amount updated to $10,500
- 05Client signs → Deal moves to "Closed Won." Workflow fires: notify finance, create onboarding task, update contact lifecycle to Customer
A SaaS startup's sales manager had no idea which deals were at risk. Deals sat in "Proposal" for 60+ days with no movement. Close dates were always in the past. The pipeline report was unreliable and leadership had no confidence in the forecast.
Admin Solution
- ⚙️Built a workflow: if a deal stays in the same stage for more than 14 days without activity, notify the owner and create a follow-up task automatically.
- 📋Made "Closed Lost Reason" a required field when moving to Closed Lost — instantly improved win/loss analysis data.
- 📊Created a "Stale Deals" report: all deals with close date in the past and stage not = Closed Won/Lost. Manager reviews this every Monday.
- 🚫Required the Amount field when a deal reaches the Proposal stage using a stage-entry workflow that blocks progression if amount is empty.
- ✅Create separate pipelines for different business lines (e.g. SMB vs Enterprise vs Partnerships)
- ✅Use required fields per stage — enforce data quality as deals progress
- ✅Always populate Closed Lost Reason — it's the most valuable data for sales coaching
- ✅Build a "Deal Velocity" report tracking average time-in-stage to identify bottlenecks
Tickets solve the customer service tracking problem: "When a customer has an issue, who owns it, what's the priority, and when was it resolved?" Without Tickets, support teams lose track of requests, customers repeat themselves, and resolution time is invisible.
Ticket Pipeline
Like Deals, Tickets move through a pipeline of stages: New → In Progress → Waiting on Contact → Waiting on Us → Closed. You can customize these stages based on your support process.
| Property | Type | Purpose |
|---|---|---|
| subject | Text | Short description of the issue |
| content | Text Area | Full description of the problem |
| hs_pipeline | Dropdown | Which support pipeline |
| hs_pipeline_stage | Dropdown | Current stage in the pipeline |
| hs_ticket_priority | Dropdown | LOW, MEDIUM, HIGH, URGENT |
| hs_ticket_category | Dropdown | Product Issue, Billing, General, Feature Request |
| hubspot_owner_id | Owner | Support agent assigned to this ticket |
| createdate | Date | When ticket was opened |
| hs_ticket_closed_date | Date | When ticket was resolved |
| time_to_close | Duration | Auto-calculated resolution time |
| hs_resolution | Text Area | How the issue was resolved — notes |
| source_type | Dropdown | Email, Chat, Phone, Form — where ticket came from |
- 01Customer emails support@company.com about a login error
- 02HubSpot inbox converts the email into a Ticket automatically — associated to the contact
- 03Ticket is set to Priority: HIGH, Category: Product Issue
- 04Agent responds via HubSpot — all replies logged on the ticket timeline
- 05Issue resolved → ticket moved to "Closed." Time to close: 2.5 hours
- 06CSAT survey sent automatically via workflow. Score recorded on ticket record.
An e-commerce brand handled all support via Gmail. No tracking, no SLAs, no reporting. Tickets were lost in email threads. Management had no idea how fast issues were being resolved or which issues were most common.
- ⚙️Connected Gmail to HubSpot Conversations inbox — every support email became a trackable Ticket automatically.
- 📊Built a report: Average Time to Close by Category. Discovered "Billing" tickets took 3× longer than Product tickets — flagged to management.
- 🚨Created a workflow: if ticket is open for 24+ hours with no reply, escalate to manager and change priority to URGENT.
- ✅Create separate ticket pipelines for different support channels (email, chat, phone)
- ✅Make Priority a required field — every ticket needs a severity level
- ✅Build SLA workflows — auto-escalate tickets that breach response time limits
- ✅Always associate tickets to both the Contact AND the Company — needed for account-level service history
Events are a major lead gen and engagement channel. Marketing Events let you connect tools like Zoom, GoToWebinar, or Eventbrite to HubSpot so attendance data flows directly onto contact records — enabling post-event automation and segmentation.
How It Works
When integrated with an event tool, HubSpot creates a Marketing Event record and tracks each contact's status: Registered, Attended, No-Showed, or Cancelled. This status is stored on the Contact record and can trigger workflows.
| Property | Type | Purpose |
|---|---|---|
| hs_event_name | Text | Name of the event |
| hs_start_datetime | Date/Time | When the event begins |
| hs_end_datetime | Date/Time | When the event ends |
| hs_event_description | Text Area | Description of the event |
| hs_num_registered | Number | Total registrations |
| hs_num_attended | Number | Total who attended |
| hs_num_no_shows | Number | Total who registered but didn't attend |
| hs_external_event_id | Text | ID from the external platform (Zoom, etc.) |
A B2B software company ran monthly webinars but had no way to follow up differently with attendees vs no-shows. Everyone got the same email sequence.
- ⚙️Connected Zoom to HubSpot via Marketing Events integration. Every registrant and attendee automatically synced to HubSpot.
- 📧Built two post-event workflows: Attendees → "Thank you + next steps" sequence. No-shows → "You missed it — here's the recording" sequence with re-engagement CTA.
- 📊Result: 34% higher demo booking rate from attendees vs previous generic sequence.
- ✅Integrate your event platform (Zoom, GoToWebinar) for automatic contact status syncing
- ✅Build separate follow-up workflows for Attended vs No-Show contacts
- ✅Use Marketing Event data to update Lifecycle Stage — a webinar attendee who watches 80% is often MQL-ready
| Object | Industry Use Case | Key Benefit |
|---|---|---|
| Appointments | Service businesses, clinics, salons, consultants | Track booked appointments with contacts, date/time, service type, and outcome. Enables scheduling + CRM in one place. |
| Courses | EdTech, training companies, coaching businesses | Track course enrollment, progress, and completion per contact. Associates to contacts like a product catalog for education. |
| Listings | Real estate agencies, property portals | Create property listings as records — associate to contacts who inquired or are interested. Track showings and inquiries. |
| Services | Professional services firms, agencies | Track individual service line items separate from products — useful for recurring service agreements and scope management. |
Only activate these objects if your business genuinely needs them. Activating unused objects clutters the CRM, confuses users, and adds navigation overhead. Activation is reversible but data cleanup can be time-consuming.
Settings → Objects → [Object Name] → Click "Activate Object." Once activated, it appears in the sidebar and can have properties, views, and workflows built on top of it.
Every business has unique data. A logistics company tracks Shipments. A construction firm tracks Projects. A real estate business tracks Properties. Custom Objects let you model any of these as first-class CRM records with their own properties, associations, pipelines, and automation.
What You Can Do With Custom Objects
- 🏗️Create any object with a custom name, icon, and description
- 🔗Associate it to standard objects (Contacts, Companies, Deals, Tickets)
- ⚙️Add custom properties of any type
- 🔄Build workflows, reports, and lists based on the custom object
| Business Type | Custom Object | Key Properties | Associated To |
|---|---|---|---|
| Logistics company | Shipment | Tracking #, Origin, Destination, Status, ETA | Contact (sender), Company (client) |
| Construction firm | Project | Project Name, Start Date, Budget, Status, PM | Company (client), Contact (stakeholder) |
| SaaS company | Subscription Plan | Plan Name, MRR, Contract Length, Renewal Date | Company, Contact, Deal |
| Real estate agency | Property Listing | Address, Price, Bedrooms, Status, Listing Date | Contact (buyer/seller), Agent |
| Law firm | Case / Matter | Case #, Practice Area, Open Date, Assigned Attorney | Contact (client), Company |
A B2B IT services company managed 200+ client projects. They used Deals for initial sale but had no way to track the ongoing project after sale — timelines, milestones, delivery status, and assigned engineers weren't in HubSpot at all. CS and delivery were working from spreadsheets.
- 🧩Admin created a "Project" Custom Object with properties: Project Name, Start Date, End Date, Delivery Status, Assigned Engineer, Budget, Client Sign-Off Date.
- 🔗Associated every Project to its parent Deal (the original sale) and the Company (the client).
- 📊Built a Project Pipeline — stages: Kickoff → In Progress → Review → Delivered → Closed. Now leadership has real-time delivery visibility.
- ⚙️Workflow: when Deal reaches "Closed Won," automatically create a Project record with kickoff date = today + 7 days. Assign to delivery team lead.
- ✅Design the schema on paper before building — define properties, associations, and use cases first
- ✅Only create Custom Objects when standard objects genuinely can't solve the problem
- ✅Custom Objects are created via API or Settings → Objects → Custom Objects (Enterprise)
- ✅This is a strong interview differentiator — being able to design and justify a custom object schema shows senior admin thinking
Sales and commerce records used for products, quotes, invoices, payments, subscriptions, and billing adjustments.
A deal amount of "$10,000" tells you the total — but not what's included. Line Items break the deal into individual products and services, enabling accurate revenue recognition, product performance reporting, and standardized pricing via the Product Library.
Product Library Connection
Line Items are pulled from your Product Library (Sales → Products). When a rep adds a Line Item to a deal, they pick from pre-configured products with set prices, discounts, and billing terms. This ensures pricing consistency across your entire sales team.
| Property | Type | Purpose |
|---|---|---|
| name | Text | Product or service name |
| hs_product_id | Text | Links to the Product Library record |
| price | Number | Unit price |
| quantity | Number | Number of units |
| amount | Number | Auto-calculated: price × quantity |
| discount | Number | Discount applied — flat or percentage |
| hs_billing_start_delay_days | Number | When billing starts after creation (for subscriptions) |
| recurringbillingfrequency | Dropdown | Monthly, Quarterly, Annually, One-time |
| hs_term_in_months | Number | Contract term length in months |
| description | Text | What's included in this line item |
A digital agency had no product library. Reps created deals with random amounts and made up pricing on the fly. Finance couldn't report on which services were most sold. Discounts were inconsistent — some clients got 30% off without approval.
- 📋Admin built a Product Library with 12 standardized service SKUs — each with name, description, default price, and billing frequency.
- 🚫Set a maximum discount rule: reps can discount up to 10% without approval. Above 10%, a workflow creates an approval task for the sales manager.
- 📊Built a "Revenue by Product" report — now visible which services drive the most revenue and which are rarely sold.
- ✅Always build a Product Library before enabling Line Items — otherwise reps will enter free-text products with no consistency
- ✅Use recurring billing frequency for subscription products — this feeds into Subscription records
- ✅Build discount approval workflows — protect margin by controlling who can offer what discounts
Quotes eliminate the "proposal chaos" problem — Word docs, PDF emails, inconsistent formatting, no tracking. A HubSpot Quote is a branded, trackable, signable proposal that a buyer can sign and pay from a single link. Everything is logged back on the Deal record.
| Property | Type | Purpose |
|---|---|---|
| hs_title | Text | Quote title shown to the buyer |
| hs_expiration_date | Date | When the quote expires — creates urgency |
| hs_quote_amount | Number | Total amount including all line items |
| hs_quote_status | Dropdown | Draft, Pending Approval, Approved, Published, Closed, Rejected |
| hs_esign_enabled | Checkbox | Whether e-signature is enabled on this quote |
| hs_payment_enabled | Checkbox | Whether payment link is included |
| hs_quote_link | URL | Shareable URL for the buyer |
| hs_sender_company_name | Text | Your company name on the quote |
| hs_pdf_download_link | URL | Downloadable PDF version |
| hs_terms | Text Area | Payment terms and conditions text |
A SaaS sales team was sending proposals via Google Docs. They had no idea when clients opened them, couldn't track e-signatures, and deals stalled at proposal stage with no follow-up triggers.
- 📄Moved all proposals to HubSpot Quotes — now every quote open, view, and signature is tracked and visible on the Deal record.
- ⚙️Built workflow: when a Quote is viewed but not signed within 48 hours → create a task for the rep to follow up with a call.
- ✅Added Quote Approval flow — quotes over $5,000 require manager approval before being sent. This blocked under-discounting and protected margin.
- 📊Result: Average deal close time dropped from 18 days to 11 days after implementing Quote tracking and automated follow-ups.
- ✅Always set an expiration date — creates urgency and prevents old quotes from being signed out of date
- ✅Enable quote approval workflows for deals above a certain threshold
- ✅Build a workflow that moves the Deal to "Closed Won" automatically when a Quote is signed
- ✅Customize the Quote template with your company branding — Settings → Sales → Quotes → Templates
Invoices close the loop between proposal and payment. A Quote says "here's what you'd pay" — an Invoice says "here's what you owe now." Keeping this inside HubSpot eliminates the need to jump to a separate invoicing tool (like FreshBooks or QuickBooks) for basic billing.
| Property | Type | Purpose |
|---|---|---|
| hs_invoice_status | Dropdown | Draft, Open, Paid, Void, Past Due |
| hs_number | Text | Auto-generated invoice number (e.g. INV-0042) |
| hs_due_date | Date | When payment is due |
| hs_invoice_date | Date | Date invoice was issued |
| hs_amount_billed | Number | Total amount on the invoice |
| hs_amount_paid | Number | Amount collected so far |
| hs_balance_due | Number | Outstanding balance (auto-calculated) |
| hs_payment_terms | Dropdown | Net 7, Net 15, Net 30, Due on receipt |
- ✅Use Invoices for clients on HubSpot Payments — avoids manual PDF billing workflows
- ✅Build a workflow: when Invoice status = "Past Due," send an automated payment reminder email
- ✅For complex billing, integrate with QuickBooks or Xero — HubSpot syncs Invoice data bidirectionally
Payment records give you actual collected revenue data inside HubSpot — not just committed revenue from Deals. This is the difference between "we closed a $10k deal" and "we've actually collected $8,000 of that $10,000."
A Payment record is created automatically when a client pays via a Quote payment link or HubSpot Invoice. It captures the transaction amount, method, date, and links back to the contact, deal, and invoice.
| Property | Type | Purpose |
|---|---|---|
| hs_payment_date | Date | When payment was captured |
| hs_amount | Number | Amount collected in this payment |
| hs_payment_method_type | Dropdown | Credit Card, ACH, Stripe, etc. |
| hs_payment_status | Dropdown | Processing, Succeeded, Failed, Refunded |
| hs_payment_id | Text | Unique transaction identifier |
| hs_processing_fee | Number | Transaction processing fee deducted |
| hs_net_amount | Number | Amount after processing fees |
- ✅Use Payment data in reports to track actual collected revenue vs committed revenue from deals
- ✅Build a workflow on Payment Status = "Failed" — notify the customer and rep immediately
- ✅Connect Stripe or your payment processor via integration for external payment sync
For SaaS, agencies, and subscription businesses, a one-time deal close is just the beginning. Subscriptions track the ongoing billing relationship — MRR per customer, renewal dates, plan upgrades, and churn risk — all inside HubSpot.
| Property | Type | Purpose |
|---|---|---|
| hs_mrr | Number | Monthly Recurring Revenue for this subscription |
| hs_arr | Number | Annual Recurring Revenue (MRR × 12) |
| hs_billing_period | Dropdown | Monthly, Quarterly, Annual |
| hs_next_payment_due_date | Date | When the next payment is due |
| hs_status | Dropdown | Active, Past Due, Cancelled, Paused |
| hs_subscription_start_date | Date | When the subscription began |
| hs_end_date | Date | When the subscription ends (if fixed term) |
| hs_num_associated_line_items | Number | How many products are on this subscription |
A SaaS company had no visibility into renewal risk. Subscriptions were tracked in a spreadsheet. CSMs didn't know when accounts were due for renewal until 2 weeks before — too late for meaningful expansion conversations.
- ⚙️Built workflow: 90 days before subscription end date, create a "Renewal" deal in the Renewal Pipeline. Assign to CSM owner.
- 📊Built an MRR dashboard: Total MRR, MRR by plan tier, MRR at risk (subscriptions past due), and MRR up for renewal in the next 30/60/90 days.
- 🚨Workflow: Subscription status changes to "Past Due" → immediate notification to CSM + automated payment retry email to customer.
Credit Memos handle the inevitable — a client was overcharged, a project was cancelled mid-way, or a product was returned. Instead of issuing a refund through a different system, Credit Memos track billing adjustments directly in HubSpot, tied to the original invoice and contact record.
| Property | Type | Purpose |
|---|---|---|
| hs_status | Dropdown | Open, Applied, Voided |
| hs_credit_amount | Number | Total credit amount being issued |
| hs_remaining_credit | Number | Credit balance not yet applied to an invoice |
| hs_currency_code | Dropdown | Currency of the credit |
| hs_create_date | Date | When the credit memo was issued |
| hs_memo | Text | Reason for the credit memo — free text notes |
Timeline activities that show how your team communicates, follows up, schedules, documents, and tracks touchpoints.
Unlike CRM or Sales objects, Activities don't exist as standalone records with their own section. They are logged touchpoints — they attach to Contact, Company, Deal, or Ticket records and build the timeline of all interactions. Every activity can be associated to multiple record types at once.
Calls are the primary outreach activity for SDRs and sales reps. Logging calls ensures the team's outreach is visible to managers, enables activity-based reporting ("how many calls per deal?"), and keeps the contact timeline complete for anyone reviewing the record.
Auto vs Manual Logging
HubSpot Calling — built-in dialer that auto-logs every call with duration, recording (if enabled), and outcome. Manual — reps click "Log Activity → Call" on a contact record and fill in the details after an external call.
| Property | Type | Purpose |
|---|---|---|
| hs_call_title | Text | Short description or subject of the call |
| hs_call_body | Text Area | Call notes — what was discussed, next steps |
| hs_call_duration | Number | Duration in milliseconds (auto-logged) |
| hs_call_status | Dropdown | COMPLETED, BUSY, NO_ANSWER, CANCELED, LEFT_VOICEMAIL, CONNECTED |
| hs_call_direction | Dropdown | INBOUND or OUTBOUND |
| hs_call_recording_url | URL | Link to call recording (if enabled) |
| hs_timestamp | Date/Time | When the call occurred |
| hubspot_owner_id | Owner | Which rep made/took the call |
A sales manager suspected some reps weren't making enough calls. But without call logging enforcement, there was no data. The pipeline looked healthy but deals were stalling — and no one could explain why.
- ⚙️Admin required reps to use HubSpot Calling — all calls auto-logged. Removed ability to manually close deals without logging a connected call.
- 📊Built a "Rep Activity" dashboard: calls per rep per week, calls per deal, average call duration, left voicemail vs connected rates.
- 🔍Discovered one rep had 40% of the pipeline but only 25% of the call volume — a coaching conversation happened the following week.
Email Activity logs 1-to-1 sales emails on the contact record — so any team member can see every email conversation a rep has had with a prospect, without accessing their personal Gmail. It's the CRM email transparency layer.
Important Distinction
Email Activity = 1:1 emails sent from a rep's inbox (via Gmail/Outlook integration, or HubSpot Sales sequences). Marketing Emails = bulk emails sent via Marketing Hub campaigns. These are two completely different things in HubSpot.
| Property | Type | Purpose |
|---|---|---|
| hs_email_subject | Text | Email subject line |
| hs_email_text | Text Area | Email body content |
| hs_email_status | Dropdown | SENT, OPENED, REPLIED, BOUNCED, FAILED |
| hs_email_direction | Dropdown | EMAIL (outbound) or INCOMING_EMAIL (reply received) |
| hs_email_open_count | Number | How many times the email was opened |
| hs_email_click_count | Number | How many times links were clicked |
| hs_timestamp | Date/Time | When the email was sent |
| hs_email_from_email | Sender's email address | |
| hs_email_to_email | Recipient's email address |
Meetings are critical milestone touchpoints in the sales process. When a discovery call or demo is booked, that's a major engagement signal. Logging it enables reporting on meeting volume per rep, meeting-to-deal conversion rates, and contact engagement scoring.
HubSpot Meetings Tool
The Meetings scheduling tool creates a booking page (like Calendly but inside HubSpot). When a contact books through it, a Meeting record is automatically created and associated to their Contact record — zero manual logging needed.
| Property | Type | Purpose |
|---|---|---|
| hs_meeting_title | Text | Meeting name or subject |
| hs_meeting_body | Text Area | Meeting notes and agenda |
| hs_meeting_start_time | Date/Time | When the meeting starts |
| hs_meeting_end_time | Date/Time | When the meeting ends |
| hs_meeting_outcome | Dropdown | SCHEDULED, COMPLETED, RESCHEDULED, NO_SHOW, CANCELLED |
| hs_meeting_location | Text | Physical location or video link |
| hs_meeting_external_url | URL | Zoom / Google Meet link |
| hubspot_owner_id | Owner | Rep hosting the meeting |
Not everything that matters fits in a structured property. Notes are the free-text scratchpad on any record — a rep's observation after a call, a warning about a difficult contact, or context that helps the next person who picks up the account.
Best Uses for Notes
- 📌Capture context that doesn't have a property: "Spoke to CFO — she's the real decision maker, not the VP of Sales"
- ⚠️Flag important details: "This contact prefers text over email — call them before 2pm"
- 📋Document post-meeting summaries that get pinned to the record for the whole team to see
| Property | Type | Purpose |
|---|---|---|
| hs_note_body | Text Area | The note content — supports rich text formatting |
| hs_timestamp | Date/Time | When the note was logged |
| hubspot_owner_id | Owner | Who wrote the note |
| hs_attachment_ids | Text | IDs of any files attached to the note |
Tasks are the action layer of HubSpot. They answer "what needs to happen next, and who is responsible?" A task is always tied to a rep (owner), a due date, and a record. Critically, tasks can be auto-generated by workflows — meaning your CRM can proactively remind reps to take action without manual setup.
Auto-Created Tasks via Workflows
This is where Tasks become powerful for admins: create a task workflow that fires when a deal goes 10 days without activity → Task auto-created: "Follow up with [Contact Name] re: [Deal Name]" → Assigned to deal owner → Due tomorrow.
| Property | Type | Purpose |
|---|---|---|
| hs_task_subject | Text | Task title — what needs to be done |
| hs_task_body | Text Area | Additional instructions or context for the task |
| hs_task_status | Dropdown | NOT_STARTED, IN_PROGRESS, COMPLETED, DEFERRED |
| hs_task_priority | Dropdown | LOW, MEDIUM, HIGH |
| hs_task_type | Dropdown | CALL, EMAIL, TODO — controls which activity type it triggers |
| hs_timestamp | Date/Time | Due date and time for the task |
| hubspot_owner_id | Owner | Which rep is responsible for this task |
| hs_task_completion_date | Date | When the task was marked complete |
An SDR team relied on reps manually creating follow-up tasks. Predictably, many were forgotten. Deals sat idle. Leads went cold. The manager had to ask every rep "did you follow up with X?" in every 1:1.
- ⚙️Admin built a workflow: 3 days after a Contact is created as a Lead with no activity logged → auto-create Task: "First outreach to [Contact Name]" assigned to owner. Due in 1 day.
- ⚙️Second workflow: Deal in pipeline with no activity for 7 days → Task: "Check in with [Company Name] — deal going stale." Priority: HIGH.
- 📊Built a Task Completion Rate report — which reps complete their tasks on time vs let them expire. Used in weekly coaching.
Modern buyers communicate across channels — chat, WhatsApp, SMS, and social messaging. Communications logs every one of these channel interactions on the contact record, just like a call or email. This gives you a unified conversation history regardless of which channel the customer prefers.
Channels That Log as Communications
| Property | Type | Purpose |
|---|---|---|
| hs_communication_body | Text Area | The message content of the communication |
| hs_communication_channel_type | Dropdown | LIVE_CHAT, WHATS_APP, FACEBOOK_MESSENGER, SMS |
| hs_timestamp | Date/Time | When the message was sent/received |
| hubspot_owner_id | Owner | Agent or rep who handled the conversation |
| hs_communication_logged_from | Dropdown | Which platform the message came from |
Some businesses still use direct mail as a touchpoint — handwritten notes, gift boxes, physical proposals, or regulatory documents. Postal Mail lets you log these as activities on a contact record so your CRM timeline reflects every channel of communication, not just digital ones.
This is one of the less commonly used activity objects, but for industries like financial services, legal, healthcare, and luxury goods where physical mail is still prevalent — it's an important part of the complete contact timeline.
| Property | Type | Purpose |
|---|---|---|
| hs_postal_mail_body | Text Area | Description of what was sent or received |
| hs_timestamp | Date/Time | Date the mail was sent or received |
| hubspot_owner_id | Owner | Who logged the mail activity |
| hs_attachment_ids | Text | Scanned copies or attachments |