Skip to main content

Cross-Feature Link Matrix

Purpose

This document defines the canonical allowed-link matrix between the main client-work entities.

Use it to answer:

  • which entities may link directly
  • how strong that link should be
  • why the link exists
  • what the link must not imply

Read this together with client-operating-model.md.

  • required ownership the relationship is part of the core data model
  • optional context the relationship is valid but not mandatory
  • workflow handoff the relationship explains how one record informed or produced another
  • projection only the relationship exists at the surface/runtime level, not as independent ownership
  • forbidden direct link the product should avoid using this as a canonical first-wave relation

Portal Meaning In This Matrix

portal in this matrix means the portal-facing runtime and visibility context granted to the client through portal access grants.

It does not mean a separate business-owned record that competes with org truth.

Canonical Pair Matrix

PairStrengthWhy the link existsDo not use it for
client account ↔ projectrequired ownershipprojects belong to a client relationshipcreating project-owned clients
client account ↔ quoterequired ownershipquotes belong to one commercial client relationshipmaking quotes free-floating sales objects
client account ↔ contractrequired ownershipcontracts belong to one legal/commercial client relationshiptreating contracts as generic workspace files
client account ↔ invoicerequired ownershipinvoices belong to one client's billing historymaking invoices project-owned by default
client account ↔ subscriptionrequired ownershiprecurring service belongs to the client account firstrequiring a project before a subscription can exist
client account ↔ drive itemrequired ownershipevery shared or internal artifact belongs to a client workspaceusing the global drive as the ownership anchor
client account ↔ portalrequired ownershipportal access is granted per client companyusing portal identity as the client record
project ↔ quoteoptional contexta quote may price scoped project workforcing every quote to pick a project
project ↔ contractoptional contexta contract may govern one scoped deliverable/projectmaking project linkage mandatory for all contracts
project ↔ invoiceoptional contextan invoice may bill project work when helpful for clarity/reportingforcing project linkage for routine billing
project ↔ subscriptionoptional contexta subscription may reference the service context it supportsturning subscriptions into project-owned records
project ↔ drive itemoptional contextfiles and docs may be easier to retrieve when project-linkedmaking project context required for normal collaboration
project ↔ portalprojection onlythe portal shows project truth through the selected client grantcreating separate portal-owned project records
quote ↔ contractworkflow handoffan accepted quote may lead to a contractcollapsing offer and agreement into one record
quote ↔ invoiceworkflow handoffan accepted quote may produce one or more invoicesassuming all invoices must have quotes
quote ↔ subscriptionworkflow handoffan accepted quote may create a recurring serviceassuming subscriptions require a quote forever
quote ↔ drive itemforbidden direct linkquotes are commercial records, not collaboration-owned artifactsstoring quote ownership in Drive
quote ↔ portalprojection onlyportal may eventually show selected quote state when the client needs ittreating portal quote views as a separate quote system
contract ↔ invoiceoptional contextan invoice may relate to contracted work or milestonesauto-deriving invoice truth purely from contract state
contract ↔ subscriptionoptional contexta contract may govern a recurring commercial relationshipmaking contract linkage mandatory for every subscription
contract ↔ drive itemforbidden direct linkcontract attachments should remain contract-owned, not Drive-ownedputting signed PDFs back into shared Drive ownership
contract ↔ portalprojection onlyportal may show governed contract state and contract-owned attachmentsusing portal files as contract truth
invoice ↔ subscriptionworkflow handoffsome invoices are produced from recurring service statecollapsing one-time invoice state into subscription status
invoice ↔ drive itemforbidden direct linkinvoices are finance records with Stripe/native artifact pathsorganizing invoice ownership through Drive folders
invoice ↔ portalprojection onlyportal should expose invoice state and pay/download actionsmaking the portal the finance source of truth
subscription ↔ drive itemforbidden direct linkrecurring billing should not be organized as collaboration storagestoring plan/service truth as Drive artifacts
subscription ↔ portalprojection onlyportal should show active service and renewal statecreating portal-only subscription truth
drive item ↔ portalprojection onlyshared items appear in portal when visibility permitsmaking portal-specific copies of drive items

Strong Default UI Adjacency

The matrix above should drive UI adjacency rules.

Progressive-Disclosure Interaction Rule

Optional context must remain available without becoming permanent form furniture.

Use the shared linked-items pattern when all of these are true:

  • the relationship connects otherwise independent feature records
  • the owning record remains valid without the relationship
  • adding the relationship improves retrieval, context, or follow-through
  • the relationship does not silently change money, access, visibility, routing, or ownership

The compact outline Add button with the link icon is reserved for surfaces that can connect several different entity types, where it signals that a bundle of optional cross-feature context is available. Several possible entities open the type overview. Up to two selected records become removable icon chips on the same compact row; further selections collapse into a +N count and remain editable in the picker. Conditional pickers must stay inside the portalled popover so choosing a parent never inserts a new field into the surrounding page or dialog. The compact row must not wrap and change the surrounding layout.

When a surface exposes only one optional relationship, use a normal labeled select or multi-select field. Do not present a one-off Add project, Add task, or similar trigger; the ordinary field is clearer and fits naturally alongside the rest of the form.

Selection and presentation are separate states. Inside an editor, selected records are removable chips. After the owning record is saved, read surfaces should render explicit navigable links to the related records, not disabled or removable editor chips. Removing a connection must never delete the related record.

Use the configuration presentation only when several links jointly configure an active workflow, such as timer client, project, task, and note context. Required links must be named as required and cannot rely on color alone.

Do not use this pattern for:

  • required client ownership
  • a project's owning client
  • task assignment, dates, status, or priority
  • folder destinations, permissions, or visibility
  • billing calculations, invoice line selection, payment configuration, or time-entry reservation
  • provenance generated by a workflow handoff, such as an accepted quote producing an invoice

Creation is distinct from connection. If a picker supports creating the related entity, show Create <entity> as a footer action inside the picker; do not make the Add trigger create a new record directly.

SurfaceRelationshipDecisionReason
project updatetasksuse labeled multi-selectoptional delivery context; several tasks may be selected, but this is still one field type
time entryproject, task, saved noteuse compact hierarchical linkerrequired client ownership stays explicit while optional work context remains collapsed
timer page and timer dialogclient, project, task, noteuse configuration linkerone compact summary prevents four context controls from dominating the timer
active timer quick viewtask, saved noteuse compact linkerclient/project are already summarized; secondary context stays optional
manual calendar eventclient, projectuse compact hierarchical linkerevent scheduling is complete without work context
contract create/editprojectuse labeled selectclient remains required ownership; project is explicitly optional context
drive file, folder, or docprojectuse labeled selectclient remains required ownership; project improves retrieval
file requestprojectuse labeled select beside dedicated destination controlproject is optional context; destination folder remains operational
note composeclient, projectkeep current scope controlstoday these values determine note scope and placement, not merely an optional link
invoiceable time selectiontime entriesdo not convertselection changes amounts, reservations, and locking
quote/subscriptionprojectuse labeled select in create/edit and navigable read linksclient ownership remains required; the project is optional commercial context and is validated against that client
invoiceprojectkeep current operational selection and render a navigable read linkinvoice project selection may drive time allocation and is not always harmless optional metadata
quote/invoice/subscription provenancecommercial recordsrender explicit read-only linksworkflow-derived provenance should not look manually attachable unless the data model supports that action

Because the client account is the anchor, its detail workspace may intentionally surface:

  • projects
  • people and portal access
  • quotes, contracts, invoices, subscriptions
  • drive items and requests
  • activity across those tracks

Project detail should always surface:

  • client account
  • project updates
  • time

Project detail may surface when explicit:

  • linked contracts
  • linked drive items
  • linked invoice context

Project detail should not imply that subscriptions or invoicing require projects.

Invoice and subscription pages should stay commercially typed

Invoice and subscription detail should always surface:

  • client account
  • billing actions

They may surface when explicit:

  • linked project context
  • linked quote handoff
  • linked contract context

They should not surface arbitrary drive links just because files exist somewhere for that client.

Drive pages should stay collaboration-typed

Drive detail/list surfaces should always surface:

  • client account
  • project context if present
  • visibility, uploader, and request context

They should not surface contracts, invoices, or subscriptions as if Drive owns them.

Portal pages should show projections, not alternate ownership

Portal pages may expose:

  • projects and updates
  • billing state
  • shared files and docs
  • company-specific access state

They should not create alternate primary records or alternate status models.

Design Guardrails

If a proposed new link does any of these, it is probably wrong:

  • makes project linkage mandatory for billing
  • makes Drive the fallback owner of commercial artifacts
  • creates a portal-only version of an existing org record
  • compresses delivery, legal, and finance states into one field
  • removes the client account as the obvious anchor