HubSpot Reference For better references, visit hubspot.com
HubSpot Admin · Module 3

Lists & Segments

The segmentation engine of HubSpot — how to build, manage, and leverage Active and Static lists across workflows, campaigns, reports, and lead routing.

Active vs Static AND / OR logic All filter types Suppression lists 3 case studies Naming conventions
Naveed Abbas profile photo
Naveed Abbas
CRM Administrator
Foundation · 01
What is a List?

A saved, named segment of CRM records — the bridge between your data and every action HubSpot takes.

Core definition

A List is a saved segment of records in HubSpot — a named group of Contacts (or Companies, or Deals) that match criteria you define. Think of it as a smart filter you name and reuse. Instead of rebuilding a filter every time you want to send a campaign or trigger a workflow, you define the audience once as a list and reference it everywhere.

Why lists are infrastructure, not just filters

What you want to doHow lists make it possible
Send a targeted email campaignSet the list as the recipient audience in the email tool
Trigger an automation workflowUse the list as the enrolment criteria — anyone who joins the list enters the workflow
Pull a segment reportFilter your report by list membership over time
Suppress contacts from a sendCreate a suppression list and exclude it on every campaign
Route leads to the right repBuild a list for each territory or segment, trigger assignment workflows
Monitor data qualityBuild a "Contacts with no owner" list — when it's empty, your data is clean
Admin mental model

Lists sit between your data layer and your action layer. Objects and Properties are how data is stored. Workflows, campaigns, and reports are how you act on that data. Lists are what connect them — they answer the question "who?" before every action your CRM takes.

Foundation · 02
Active vs Static Lists

The most important decision you make when creating a list — and the one beginners get wrong most often.

Active list
Updates automatically, in real time
  • +Contacts join when they match the rules
  • +Contacts leave when they stop matching
  • +Always reflects current reality
  • +Best for ongoing workflows and live campaigns
  • Cannot manually add members
  • Membership fluctuates — can't be "frozen"
Use for

Workflow enrolment · Recurring campaigns · Real-time segments · Data quality monitoring · Lead scoring audiences

Static list
Fixed snapshot — never changes automatically
  • +Membership is permanent once set
  • +Can add or remove members manually
  • +Properties on members still update
  • +Best for one-time sends and historical records
  • Will not pick up new matching contacts
  • Cannot convert to active after creation
Use for

Event attendees · One-time import sends · A/B test control groups · Historical snapshots · Manual curation

Critical rule — type cannot be changed after creation

You cannot convert an Active list to Static or vice versa after it has been saved. If you choose the wrong type, you must delete the list and rebuild it. Make the decision deliberately before clicking "Create list."

The key difference in plain terms

An Active list is like a classroom roll that updates every semester — students come and go as they meet the criteria. A Static list is like a yearbook photo — everyone who was in the room on that specific day, frozen forever.

ActiveStatic
Membership updatesContinuously, automaticallyNever (without manual action)
Add members manuallyNoYes
Remove members manuallyNoYes
Member properties updateYesYes (properties always update)
Requires criteria/rulesYes — mandatoryOptional (can be empty and manually filled)
Best trigger for workflowsYes — always currentOnly for one-time enrolment
Example"All MQLs in SaaS with score >50""October webinar attendees"
Foundation · 03
Filter Categories

Everything you can filter on when building a list — properties, behaviours, and list membership.

🏷️
Property filters
Filter based on values stored on the record
Most commonAll plans

Property filters match contacts based on the values stored in their properties — every field on a Contact, Company, or Deal record can be used as a filter.

Property typeAvailable operatorsExample
Dropdown / Checkboxis equal to · is not equal to · is any of · is none of · is known · is unknownLifecycle stage is equal to MQL
Text (single/multi-line)contains · doesn't contain · starts with · ends with · is equal to · is known · is unknownJob title contains "Director"
Number / Currencyis equal to · is greater than · is less than · is between · is known · is unknownLead score is greater than 50
Dateis equal to · is before · is after · is between · is within last X days · is more than X days agoCreate date is within last 30 days
Boolean (single checkbox)is equal to true · is equal to false · is known · is unknownHas signed NDA is known
Is known vs is equal to true

For Single checkbox properties, "is known" means the checkbox has been set (checked). "is equal to true" means it is explicitly checked. Unchecked does not mean false — it means unknown. Always use "is known" unless you're certain the field has been deliberately set on all relevant records.

Behaviour / activity filters
Filter based on what the contact has done
Engagement dataAll plans

Behaviour filters match contacts based on actions they have taken — email interactions, website visits, form submissions, and more. These are the most powerful filters for engagement-based segmentation.

Behaviour categoryExample filtersUse case
Email engagementOpened email · Clicked link in email · Was sent email · Has not opened in 90 daysRe-engagement campaigns, nurture sequences
Form submissionSubmitted any form · Submitted specific form · Never submitted a formLead capture follow-up, form abandonment
Page viewsVisited specific URL · Viewed pricing page · Spent more than X seconds on pageIntent-based scoring, sales alerts
MeetingsHas a meeting booked · Meeting outcome = completed · No meeting in last 30 daysSales pipeline management
Marketing eventsRegistered for event · Attended event · Did not attend (no-show)Post-webinar follow-up sequences
Calls / sequencesWas called · Is enrolled in sequence · Replied to sequence emailSales activity tracking
Admin tip

Behaviour filters with time windows are especially powerful. "Opened an email in the last 30 days" keeps your re-engagement list constantly fresh. "Has not visited the site in 90 days" automatically identifies at-risk contacts. Time-windowed behaviour filters are the basis of most good engagement-based segments.

📋
List membership filters
Filter based on whether a contact is in another list
Advanced segmentationAll plans

List membership filters let you build lists based on other lists — enabling nested segmentation and suppression logic. This is where list building becomes genuinely powerful.

OperatorWhat it meansExample use
Is member of listContact must be in the referenced list"All MQLs" AND "Is member of UK contacts list"
Is not member of listContact must NOT be in the referenced listTargeting list AND "Is NOT member of [SUPPRESS] Customers"
RevOps use: suppression via list membership

The most important use of list membership filters is suppression. Build a master suppression list ("All current customers"), then add "Is NOT member of [SUPPRESS] Customers" to every prospecting campaign list. Any contact who becomes a customer is automatically excluded from all future prospecting — without touching each campaign individually.

Foundation · 04
AND vs OR Logic

The single most important concept in list building — and the most common source of targeting mistakes.

The rule

AND logic — the contact must match every filter in the group. Narrows the segment.
OR logic — the contact must match at least one filter. Widens the segment.

How HubSpot structures filter groups

HubSpot uses a two-level logic system. Within a filter group, all filters are connected by AND. Between filter groups, the connection is OR. This lets you build complex compound logic without needing to understand Boolean algebra.

Group 1: Lifecycle = MQL AND Industry = SaaS AND Country = UK
— OR —
Group 2: Lifecycle = SQL AND Lead score > 60
This list includes: UK SaaS MQLs + High-score SQLs anywhere
Plain English translation

"Give me all contacts who are MQLs AND in SaaS AND in the UK — OR any SQL with a lead score above 60."

The two groups are independent. A contact only needs to satisfy one entire group, not both.

Logic typeEffectWhen to useRisk if wrong
ANDNarrows — fewer contacts matchTightly targeted campaigns, qualified lead listsToo narrow — you miss valid contacts
ORWidens — more contacts matchCatch-all segments, broad awareness sendsToo wide — you include contacts who shouldn't be there
Groups (AND within, OR between)Flexible compound logicMulti-persona campaigns, combined qualification criteriaMisreading which group a filter belongs to
Admin Setup · 05
How to Create a List

Step-by-step walkthrough with the exact path, decisions, and admin considerations at each stage.

Path in HubSpot

Contacts → Lists → Create list (top right button)

  1. Choose the record type — Contact-based, Company-based, or Deal-based. Most lists are Contact-based. The record type determines which properties and behaviours you can filter on.
  2. Choose Active or Static — this is permanent. Active if the membership should update over time. Static if it's a one-time, fixed group. When in doubt: active is usually safer for ongoing use.
  3. Name the list — use your naming convention (see Naming Conventions section below). A good name explains what's in the list without opening it. Example: [MKT] MQLs — SaaS — UK
  4. Add filter group 1 — click "Add filter" and choose your first criterion. Select the property, the operator, and the value. Add more filters to the same group using AND logic.
  5. Add additional filter groups (if needed) — click "Add filter group" to create a second group connected by OR. Use this for multi-persona or multi-scenario targeting.
  6. Preview the count — before saving, HubSpot shows a live preview of how many records match. Always check this. If the number is 0 or suspiciously large, your logic has an error.
  7. Save the list — for Active lists, HubSpot immediately begins evaluating all contacts. For large portals, this can take a few minutes to process.
Before you save — the final check

Ask yourself three questions: (1) Does the count look right for my expected audience? (2) Are my AND/OR operators correct? (3) Have I added a suppression filter to exclude anyone who shouldn't be in this list?

Admin Setup · 06
Naming Conventions

The difference between a manageable list library and an unusable one is naming discipline.

Without a naming convention, lists accumulate over months and become impossible to navigate. "Test List 3," "Sarah's leads," and "Campaign June" tell you nothing without opening each one.

The standard admin naming format

[TEAM] · Purpose Segment detail Date/Quarter
List typeExample nameWhat it tells you
Marketing campaign target[MKT] Webinar invite — SaaS MQLs — Q4 2024Team, purpose, segment, when
Workflow enrolment[AUTO] Lead nurture entry — Score 20–50Automated, what triggers it, score range
Suppression list[SUPPRESS] Current customersType immediately obvious
Data quality monitor[ADMIN] Contacts with no ownerAdmin purpose, what's wrong
Sales segment[SALES] Hot leads — UK — score >70Team, urgency, geography, threshold
Reporting segment[REPORT] MQL count — monthly snapshotPurpose is reporting, what it tracks
Admin rule

Establish your naming convention on day one of any HubSpot setup. Document it in your admin handbook. Enforce it with every new list request — never allow exceptions. One inconsistently named list becomes the precedent for twenty more.

Admin Setup · 07
Suppression Lists

The safety net every HubSpot portal needs before the first bulk email send.

Why this matters

Emailing an unsubscribed contact even once is a compliance violation under GDPR and CAN-SPAM. Emailing a current customer a prospecting message damages your brand. Suppression lists are the mechanism that prevents both. They are not optional — they are infrastructure.

Core suppression lists every portal needs

List nameWho is in itWhy
[SUPPRESS] Unsubscribed
All email opt-outs
Contacts who have unsubscribed from marketing emails
Legal compliance. HubSpot also enforces this automatically, but having a named list ensures intentional exclusion.
[SUPPRESS] Current customers
Lifecycle = Customer
All contacts marked as active paying customers
Prevents sending prospecting or lead-gen emails to people already paying you.
[SUPPRESS] Competitors
Domain-based or manually flagged
Contacts at known competitor companies
Prevents sharing product roadmaps, pricing, or strategy with competitors monitoring your comms.
[SUPPRESS] Do not contact
Manually managed
Contacts who have specifically requested no communication
Legal requests, personal preference, or relationship sensitivity (e.g. VIP accounts handled by leadership only).
[SUPPRESS] Hard bounces
Email bounce property
Contacts with invalid email addresses
Sending to hard-bounced addresses damages your email sender reputation and deliverability for everyone.
[SUPPRESS] Internal team
Company domain = yourdomain.com
Your own employees in the CRM
Prevents sending external customer campaigns to your own staff.
How to use suppression lists

In HubSpot email tool: when sending a campaign, look for the "Don't send to" or "Exclude" field in the recipients settings. Add your suppression list there. In workflows: use an "Is not member of [SUPPRESS] list" filter in your enrolment criteria, or add a branch that removes contacts who join the suppression list.

Admin Setup · 08
Object-Based Lists

Lists are not just for contacts — you can segment Companies and Deals too.

List typeFilters onUsed forExample
Contact-basedContact properties and behavioursEmail campaigns, lead workflows, nurture sequencesAll MQLs in SaaS with score >40
Company-basedCompany propertiesAccount-based marketing (ABM), account segmentation, Company-level workflowsAll companies with >200 employees in FinTech
Deal-basedDeal properties and pipeline stagePipeline reporting, deal-level automation, sales ops workflowsAll deals in Negotiation stage open >14 days
RevOps use: deal-based lists as pipeline health monitors

A deal-based list called "Stale deals — no activity 14d" is one of the most valuable admin tools in a Sales Hub setup. When any deal enters this list, a workflow fires — notifying the deal owner and creating a follow-up task. The list is always accurate because it's active. This replaces a weekly manual pipeline review with an automated alert system.

Applied Learning · 09
Real-World Example

How a real admin builds a complete list ecosystem for a product webinar campaign.

A B2B SaaS company wants to run a quarterly product webinar. Their target audience: decision-makers at SaaS companies who are currently MQL or SQL, have engaged with at least one email in the past 60 days, and are not already customers.

Step 1 — Build the targeting list (Active)

Group 1: Lifecycle = MQL or SQL AND Industry = SaaS AND Job title contains VP, Director, Head of AND Email opened in last 60d AND Is NOT member of [SUPPRESS] Customers
Preview: 342 contacts match

Step 2 — Build post-webinar lists (Static)

List nameTypeHow populatedUsed for
[MKT] Webinar — Attended — Q4StaticSynced from Zoom via Marketing Events integrationThank you + next steps sequence
[MKT] Webinar — No-show — Q4StaticSynced from Zoom (registered, didn't attend)Recording follow-up sequence

Step 3 — Connect to workflows

Contact joins targeting list
Invitation email sent
Webinar occurs
Zoom syncs attendance to HubSpot
Attended list → "Thank you" workflow
No-show list
"You missed it" + recording workflow

Outcome

The admin built 3 lists total — one for targeting, two for post-event follow-up. Every workflow, email, and report in the campaign references one of these lists. When the next webinar runs next quarter, the targeting list auto-refreshes. The admin only needs to rebuild the static post-event lists from the new Zoom export.

Applied Learning · 10
Three Case Studies
📊
Case 1 — The unsubscribed customer problem
When a customer receives a prospecting email
SuppressionE-commerce
The problem

An e-commerce brand's marketing team sent a "We miss you — come back for 20% off" re-engagement campaign to a segment of "inactive contacts." The list was built on last email open date, but had no suppression applied. 180 current customers received the discount offer, costing the company $14,000 in unnecessary discount codes redeemed. Several customers replied angrily asking why they were being treated like lapsed prospects.

Admin solution

  • 1.
    Created [SUPPRESS] Active customers — an active list filtering Lifecycle Stage = Customer AND create date is known. 2,400 contacts auto-populated.
  • 2.
    Added "Is NOT member of [SUPPRESS] Active customers" as a required filter in all campaign targeting lists going forward.
  • 3.
    Built a campaign checklist: before any email send, the marketing team must confirm suppression lists are applied. Admin reviews all sends over 500 contacts before scheduling.
  • 4.
    Created a workflow: when any contact's Lifecycle Stage changes to Customer, they are automatically added to the suppression list within seconds.
RevOps outcome

Zero suppression errors in the following 8 months. The process of requiring suppression list review before sends also caught two other segmentation errors before they went out — one would have emailed a competitor's CEO.

🔧
Case 2 — The static vs active confusion
When a workflow stops enrolling new leads
List typeB2B SaaS
The problem

A SaaS startup's SDR team noticed that new inbound leads were not entering their lead nurture workflow. The workflow had been running fine for two months, but stopped enrolling contacts three weeks ago. The sales manager assumed it was a workflow bug.

Admin investigation

  • 1.
    Checked the workflow enrolment criteria — it was enrolling from a list called "Inbound leads — nurture entry."
  • 2.
    Opened the list — it was a Static list. It had been created from an import 2 months ago with 340 contacts. No new contacts had been added since.
  • 3.
    The original admin who built the list had chosen Static, assuming the criteria-based filter would keep updating. It doesn't — only Active lists do that.

Admin fix

  • 1.
    Created a new Active list with identical filter criteria: Lifecycle = Lead AND Create date is within last 90 days AND Lead status = New.
  • 2.
    Updated the workflow to enrol from the new Active list.
  • 3.
    Manually enrolled the 87 leads who had been missed during the 3-week gap.
  • 4.
    Added a note to the admin handbook: "Workflow enrolment lists must always be Active unless the workflow is a deliberate one-time send."
RevOps lesson

This mistake costs pipeline every time it happens. A new lead who doesn't enter nurture within 3 days of signing up has a statistically lower conversion rate. Estimated pipeline impact over 3 weeks: 87 leads × 18% conversion × $4,200 ACV = ~$65,000 in at-risk pipeline.

🎯
Case 3 — Building a full list library from scratch
Systematic approach for a new HubSpot implementation
ImplementationAgency
The situation

A RevOps consultant is setting up HubSpot from scratch for a 25-person B2B software company. They have 3,400 contacts migrated from Salesforce. No lists exist yet. The company needs to start sending campaigns and trigger workflows within 2 weeks.

Admin's 5-category list framework

CategoryLists builtPriority
Suppression (build first)[SUPPRESS] Unsubscribed · [SUPPRESS] Customers · [SUPPRESS] Competitors · [SUPPRESS] Internal teamDay 1 — before any send
Lifecycle segments[SEG] All leads · [SEG] MQLs · [SEG] SQLs · [SEG] Opportunities · [SEG] Customers · [SEG] ChurnedDay 1 — foundation of all reporting
Workflow entry points[AUTO] Lead nurture entry · [AUTO] MQL handoff to sales · [AUTO] Win/loss notification · [AUTO] Customer onboardingDay 2 — before workflows are built
Data quality monitors[ADMIN] No owner · [ADMIN] No lifecycle stage · [ADMIN] Duplicate emails · [ADMIN] Blank companyDay 3 — then reviewed weekly
Campaign targetsBuilt per campaign as needed, following naming conventionOngoing
RevOps outcome

By building lists in this order — suppression first, lifecycle segments second, workflow triggers third — the consultant ensured no campaigns went out before suppression was in place, and all workflows had valid enrolment lists before they were activated. Zero suppression errors in the first 6 months. The data quality monitor lists caught 340 contacts with no lifecycle stage on day 3, which were corrected before the first campaign went out.

Applied Learning · 11
Common Admin Mistakes
  • 1. Using Static when you meant Active — the "dead workflow" mistake
    A static list connected to an ongoing workflow stops enrolling new contacts the moment it's created. New leads that should enter the workflow are silently missed. Fix: default to Active for any list connected to a recurring workflow. Only use Static for deliberate one-time sends.
  • 2. Wrong AND/OR logic — the "too broad" mistake
    Building a list with OR instead of AND results in a segment 3–5× larger than intended. "Lifecycle = MQL OR Industry = SaaS" captures every MQL regardless of industry, plus every SaaS contact regardless of lifecycle. Fix: always preview the count before saving and sanity-check whether the number makes sense for your intended audience.
  • 3. No suppression lists before first send — the compliance mistake
    Sending a campaign without suppression applied risks emailing unsubscribed contacts, current customers with prospecting content, or competitors. Fix: build all four core suppression lists before any bulk send goes out. Make suppression review part of every campaign checklist.
  • 4. No naming convention — the "what is this list?" mistake
    After 12 months: 200 lists, half named "Test" or "Campaign" or people's names. Nobody knows which to use. Fix: naming convention on day one. [TEAM] Purpose — Segment — Date. Enforce it on every request.
  • 5. Never archiving old lists — the cluttered library mistake
    Lists from past campaigns, old workflows, and deprecated segments pile up. The list picker becomes unusable. Fix: quarterly list audit. Archive anything unused for 6+ months. Archived lists still exist but are hidden from active views.
  • 6. Using "is equal to true" on a single checkbox — the "missing contacts" mistake
    "Has signed NDA is equal to true" misses contacts where the property was never set (unknown state). Fix: use "is known" to catch all contacts where the checkbox has been set, regardless of whether it's explicitly checked.
  • 7. Building targeting lists without suppression filters built in — the "belt and braces" mistake
    Even if you apply suppression at send time, building it into the list itself means the list count is accurate and the suppressed contacts never even appear as targets. Fix: add "Is NOT member of [SUPPRESS] Customers" as a filter inside every prospecting targeting list.
Applied Learning · 12
Practice Exercise

Do this in your free HubSpot sandbox account. It takes about 30 minutes and covers the full list workflow.

  1. Create 4 suppression lists first — [SUPPRESS] Unsubscribed, [SUPPRESS] Customers, [SUPPRESS] Do not contact, [SUPPRESS] Internal team. Use Active lists with the appropriate property filters for each.
  2. Create a lifecycle segment — Active list named [SEG] All MQLs. Filter: Lifecycle stage = Marketing Qualified Lead. Note the count.
  3. Create a campaign targeting list — Active list: [MKT] Product demo invite — SaaS leads. Filters: Lifecycle = Lead AND Industry = SaaS AND Is NOT member of [SUPPRESS] Customers. Note the count vs your MQL list.
  4. Create a data quality monitor — Active list named [ADMIN] Contacts with no lifecycle stage. Filter: Lifecycle stage is unknown. This is your ongoing data quality alert.
  5. Create a static list — Go to Contacts, filter for contacts created in the last 7 days, manually select 5–10 contacts, and add them to a new Static list named [TEST] Recent imports — static. Notice that this list count will never change even as new contacts are created tomorrow.
  6. Check the difference — Go back to your Active MQL list and add a test contact with Lifecycle = MQL. Watch them appear in the list within seconds. Change their lifecycle to SQL — watch them disappear. This is live Active list behaviour.
Applied Learning · 13
Interview Questions
Q: "What is the difference between an Active and a Static list in HubSpot?"
"An active list has criteria-based rules and updates continuously — contacts join when they match and leave when they stop matching. It's always current. A static list is a frozen snapshot — membership is fixed at creation and only changes if you manually add or remove people. I use active lists for ongoing workflows and recurring campaigns, and static lists for one-time sends to a specific group like event attendees. The key thing to remember is that you can't convert between types after creation."
Q: "A workflow has stopped enrolling new leads. How do you diagnose the issue?"
"First I'd check the workflow's enrolment source — is it list-based or property-based? If it's list-based, I'd open the list and check whether it's Active or Static. A static list with no new members is the most common cause of this. I'd also check the workflow's re-enrolment settings — is it set to enrol contacts only once, or every time they meet the criteria? Then I'd look at a specific contact that should have enrolled and check their property history to see if and when they met the criteria."
Q: "How do you use lists to prevent sending a prospecting email to existing customers?"
"I maintain a suppression list called [SUPPRESS] Current customers — an active list that filters on Lifecycle Stage = Customer. When any contact becomes a customer, they're automatically on this list within seconds. For every outbound prospecting campaign, I add this list to the 'Exclude' field in the email send settings, and I also build it directly into the campaign targeting list as a filter: Is NOT member of [SUPPRESS] Current customers. This double-layer approach means customers are excluded both at the list level and the send level."
Q: "Walk me through how you'd set up lists for a new HubSpot portal."
"I follow a five-category framework. First, suppression lists — before any send goes out, I build lists for unsubscribed contacts, current customers, competitors, and internal team. Second, lifecycle segments — active lists for each lifecycle stage so I have clean, reportable segments from day one. Third, workflow entry points — active lists that serve as enrolment triggers for each major workflow. Fourth, data quality monitors — lists that surface bad data like contacts with no owner or no lifecycle stage. Fifth, campaign-specific lists — built as needed, following the naming convention. This order matters: suppression first so nothing goes wrong before we're ready."
Applied Learning · 14
Summary Cheatsheet
ConceptKey point
What is a listA saved, named segment of CRM records — contacts, companies, or deals
Active listUpdates automatically — contacts join when they match, leave when they don't
Static listFrozen snapshot — membership never changes automatically after creation
Type is permanentCannot convert Active to Static or vice versa after creation
Filter categoriesProperties · Behaviours/activities · List membership
AND logicContact must match all filters — narrows the segment
OR logicContact must match any filter — widens the segment
Filter groupsWithin a group = AND logic · Between groups = OR logic
Suppression listExcludes contacts from sends — build before first campaign
Core suppressionsUnsubscribed · Customers · Competitors · Do not contact · Bounces
Naming convention[TEAM] Purpose — Segment — Date/Quarter
Workflow ruleAlways use Active lists for workflow enrolment — Static lists stop updating
Preview countAlways check before saving — 0 or unexpectedly large = logic error
Object typesContact · Company · Deal — most lists are contact-based
RevOps superpowerLists as data quality monitors — "Contacts with no owner" = 0 means clean CRM
RevOps mindset on lists

Lists are not just a marketing feature — they are the segmentation infrastructure of your entire CRM. Every workflow trigger, every campaign audience, every suppression rule, and every data quality alert runs through lists. A well-governed list library — with clear naming, consistent types, and maintained suppression lists — is the difference between a CRM that runs reliably and one that requires constant firefighting. Build your list library deliberately, document it, and treat it as infrastructure you maintain — not a side task you do once.