Legal
Addendum — What RetiFlo treats as personally identifiable information
An addendum to privacy-policy.md. Processors are named once in
data-processors.md; this document answers the other half of the question —
what is removed before your data goes to any of them.
The commitment, in one sentence
We send your plan's data — with personally identifiable information removed — to the processors
named in data-processors.md.
"Your plan's data" is broad and meant to be: account balances and types, income and expenses, year-by-year projections, tax figures, and any question you type into an AI feature. What is not sent is everything in the table below.
What is removed
Before anything leaves the application, these are replaced with neutral placeholders. The substitution is reversed on the way back, so you still see "Fidelity Rollover IRA" on screen — the processor never does.
| Category | Examples | Fields |
|---|---|---|
| Names | your name, your spouse's name, a named beneficiary, an advisor's name | 18 |
| Contact details | email address, phone number | 8 |
| Date of birth | used for every age-based calculation, never sent | 1 |
| Address and location | the street address of your home or a rental property | 1 |
| Account, institution and document identifiers | "Fidelity Rollover IRA", an account number, an uploaded statement's filename | 9 |
| Free text you write | notes on an account, a question you ask the Companion, an advisor's rationale | 32 |
| Links and media | a photo of a property, a profile or website link | 4 |
| Other identifying text | fields not yet placed in a category above | 7 |
80 fields in total are treated as personally identifiable and removed.
A further 73 fields never leave the application at all under any circumstances — passwords, authentication tokens, and payment identifiers. These are not "removed from the message"; no message is ever built that contains them.
What this does not cover
- Aggregate and anonymized statistics about product usage, which contain no household data.
- Data you choose to share elsewhere — a report you export and send to someone yourself.
- Payment details, which are collected by Stripe directly and never held by RetiFlo.
How this is kept honest
- Every text column in the database must carry a classification before it can be part of the release. That's the policy.
- Audits are run and will prevent us from implementing new releases if any unclassified columns are found — and equally on a stale entry for a column that no longer exists, so the list cannot rot in either direction. Every piece of data must be classified before a release can occur. That's how we make sure the policy is followed.
- All AI features route through a single gateway that applies the removal of fields marked as PII (Personally Identifiable Information) and fails the build if any code path constructs its own connection to a processor.
- This document is regenerated from that classification rather than maintained beside it.
What these controls do and do not prove. They prove a human classified every field and that
there is one enforced exit point. They are a review gate, not a runtime proof of the redaction
engine's behavior — that comes from its default-deny design and its own test suite. The distinction
is recorded in plans/design_3.0/pii-column-classification-REVIEW.md.
Appendix — full field-level classification
For auditors. The categories above are the readable view of this list.
Removed before sending (PII) — 80 fields
AdvisorBillingTransaction.descriptionAdvisorCapacitySettings.unavailable_reasonAdvisorClientInternalNote.client_labelAdvisorClientInternalNote.contentAdvisorClientRelationship.pending_client_emailAdvisorFirm.credential_holder_nameAdvisorFirm.credential_numberAdvisorFirm.nameAdvisorFirmBrandingProfile.disclosure_footerAdvisorFirmBrandingProfile.display_nameAdvisorFirmInvite.emailAdvisorFirmMembership.credential_holder_nameAdvisorFirmMembership.credential_numberAdvisorMarketplaceProfile.bioAdvisorMarketplaceProfile.headlineAdvisorMarketplaceProfile.linkedin_urlAdvisorMarketplaceProfile.website_urlAdvisorPlanVariance.rationaleAdvisorRating.commentAdvisorRating.hidden_reasonAdvisorReviewRequest.preferred_advisor_emailAdvisorReviewRequest.review_notesAiConversation.titleAiMessage.contentAiMessage.feedbackAiMessage.feedback_noteAsset.account_numberAsset.beneficiary_name_529Asset.descriptionAsset.institutionAsset.nameBeneficiary.nameClientDeliverable.titleClientDeliverableAudit.actor_nameClientTask.titleClientTask.whyCompanionExchange.answerCompanionExchange.questionDebtAccount.nameDocumentAccessLog.actor_nameDocumentAiShareGrant.granted_by_nameDocumentAiShareGrant.revoked_by_nameEmailChangeRequest.new_emailEmailChangeRequest.old_emailEmailNotificationLog.email_addressEstatePlanningDocument.file_nameEstatePlanningDocument.notesExpenseCategoryRule.patternExpenseWorksheet.nameExpenseWorksheetTransaction.notesIncomeSource.nameLifeEvent.notesLinkedAccount.account_nameLinkedAccount.institution_nameNotification.action_urlNotification.messageNotification.titlePdfExportJob.errorPlan.namePlanComment.contentPlanDocument.file_namePlanDocument.labelPlanDocument.notePlanDocument.uploaded_by_nameRealEstateFutureEvent.notesRealEstateProperty.address_textRealEstateProperty.nameRealEstateProperty.photo_urlScenario.nameSpendingPattern.nameStatementUpload.error_messageStatementUpload.original_filenameSystemEventLog.messageTransfer.descriptionUser.dobUser.emailUser.firstNameUser.lastNameUser.phoneUserWebAuthnCredential.friendly_name
Never sent to any AI provider — 73 fields
AdvisorBillingTransaction.charge_idAdvisorClientRelationship.invite_tokenAdvisorFirm.stripe_customer_idAdvisorFirm.stripe_subscription_idAdvisorFirmBrandingProfile.logo_file_nameAdvisorFirmBrandingProfile.logo_mime_typeAdvisorFirmInvite.invite_tokenAdvisorMarketplaceProfile.photo_mime_typeAdvisorReviewRequest.advisor_payout_idAdvisorReviewRequest.client_payment_intent_idAdvisorReviewRequest.client_stripe_charge_idAiMessage.feedback_disposition_noteAuditEvent.actor_emailAuditEvent.operationAuditEvent.targetCashFlowProjection.input_data_hashCashFlowProjectionHistory.input_data_hashClientDeliverable.draft_fingerprintDocumentAccessLog.ipDocumentAccessLog.user_agentDocumentAiShareGrant.content_sha256EmailChangeRequest.new_tokenEmailChangeRequest.old_tokenEmailNotificationLog.resend_message_idEmailVerificationToken.tokenEstatePlanningDocument.content_sha256EstatePlanningDocument.file_mime_typeEstatePlanningDocument.storage_locatorExpenseCategoryMonthly.source_ref_idFeedback.app_versionFeedback.build_shaFeedback.disposition_noteFeedback.dispositioned_by_user_idFeedback.internal_noteFeedback.kindFeedback.messageFeedback.routeFeedback.user_agentFeedback.user_roleFeedback.viewed_by_user_idFeedback.viewportJobRun.errorJobRun.jobLinkedAccount.institution_idLinkedAccount.plaid_access_token_encryptedLinkedAccount.plaid_account_idLinkedAccount.plaid_item_idLinkedAccount.plaid_transactions_cursorMonteCarloSimulation.input_data_hashPasswordResetToken.tokenPdfExportJob.content_sha256PdfExportJob.result_refPlanDocument.content_sha256PlanDocument.file_mime_typePlanDocument.storage_locatorRiskGuardrailSurface.input_hashRothConversionPlan.optimizer_input_hashScenario.primary_locationScenario.secondary_locationStatementTransaction.external_idSubscription.stripe_customer_idSubscription.stripe_subscription_idTransaction.plaid_transaction_idUser.external_providerUser.external_subjectUser.password_hashUserMfaChallenge.challengeUserMfaTotp.backup_codesUserMfaTotp.secret_encryptedUserWebAuthnCredential.credential_idUserWebAuthnCredential.device_typeUserWebAuthnCredential.public_keyUserWebAuthnCredential.transports
Sent, but scanned for your values first — 6 fields
ScenarioLever.trade_offStatementTransaction.descriptionStatementTransaction.merchantTransaction.descriptionTransaction.merchant_nameUndoLedger.label
Sent as-is — not identifying — 51 fields
AdvisorBillingTransaction.typeAdvisorFirmBrandingProfile.accent_colorAdvisorFirmBrandingProfile.primary_colorAdvisorMarketplaceProfile.specializationsAdvisorPlanVariance.target_refAiInsightUsage.modelAiMessage.modelBudget.effective_monthBudget.expense_categoryCashFlowProjection.random_seedCashFlowProjectionHistory.random_seedCashFlowProjectionHistory.snapshot_reasonClientDeliverableAudit.actionClientTask.destination_routeCompanionExchange.modelCompanionExchange.routeDocumentType.codeDocumentType.labelEmailNotificationPreference.opted_in_methodEmailNotificationPreference.opted_out_methodEstatePlanningDocument.document_typeExpenseCategory.codeExpenseCategory.labelLinkedAccount.account_subtypeLinkedAccount.account_typeLlmUsage.consumerLlmUsage.modelLongTermCareCost.state_codeLongTermCareCost.state_nameMarketplaceAuditEvent.event_typeMonteCarloSimulation.random_seedPlanComment.action_hrefPlanComment.ai_modelRealEstateProperty.stateRiskGuardrailSurface.random_seedScenario.primary_marital_statusScenario.secondary_marital_statusStateTaxProfile.source_noteStateTaxProfile.state_codeStateTaxProfile.state_nameStatementUpload.mime_typeStatementUpload.parserSystemSetting.categorySystemSetting.descriptionSystemSetting.keySystemSetting.labelSystemSetting.updated_byTransaction.expense_categoryTransaction.plaid_categoryUser.stateUser.terms_version
Prefer a copy to keep or print? Download the PDF.