Skip to content

Company and plan configuration

The company record and the four configuration sections that make up a plan.

Company

message Company {
  enum HrisProviderType {
    UNKNOWN_HRIS_PROVIDER_TYPE = 0;
    DEEL = 1;
    DEEL_PRISM = 2;
    PRISM = 3;
  }

  string uuid = 1;
  string business_name = 2;
  optional string business_phone = 3;
  string email = 4;
  com.basiccapital.common.external.Address company_address = 5;
  EntityType entity_type = 6;
  string ein = 7;
  optional string state_of_organization = 8;
  Status status = 9;
}

References: EntityType, Status

EntityType

enum EntityType {
  UNKNOWN_COMPANY_ENTITY_TYPE = 0;
  C_CORP = 1;
  S_CORP = 2;
  LLC = 3;
  SOLE_PROPRIETORSHIP = 4;
  LLP = 5;
  NON_PROFIT = 6;
  PARTNERSHIP = 7;
  ELECTING_CHURCH = 9;
  OTHER = 10;
}

Status

enum Status {
  UNKNOWN_STATUS = 0;
  ACTIVE = 1;
  ONBOARDING = 2;
  CREATED = 3;
  INACTIVE = 4;
  LAPSED = 5;
}

PlanConfiguration

message PlanConfiguration {
  enum Status {
    UNKNOWN_STATUS = 0;
    DRAFT = 1;
    IN_REVIEW = 2;
    READY_FOR_SUBMISSION = 3;
    SUBMITTED = 4;
  }

  ManagementOption management_option = 1;
  InvestmentConfig investment_config = 2;
  CoreConfig core_config = 3;
  optional MigrationConfig plan_migration_info = 4;
  Status status = 5;
}

References: CoreConfig, InvestmentConfig, ManagementOption, MigrationConfig

ConfigurationSectionStatus

enum ConfigurationSectionStatus {
  UNKNOWN_CONFIGURATION_SECTION_STATUS = 0;
  INCOMPLETE = 1;
  COMPLETE = 2;
  LOCKED_INCOMPLETE = 3;
  LOCKED_COMPLETE = 4;
}

ManagementOption

message ManagementOption {
  repeated ManagementOptionOffering management_option_offerings = 1;
  ManagementOptionType type = 2;
  string summary = 3;
  ConfigurationSectionStatus status = 4;
}

References: ConfigurationSectionStatus, ManagementOptionOffering, ManagementOptionType

ManagementOptionOffering

message ManagementOptionOffering {
  enum ManagementOptionOfferingType {
    UNKNOWN = 0;
    FIDUCIARY_316 = 1;
    FIDUCIARY_338 = 2;
    FORM_5500_FILING = 3;
    CURATED_INVESTMENT_OPTION_SELECTION = 4;
    ROTH_401K = 5;
    TRADITIONAL_401K = 6;
    EMPLOYER_MATCH = 7;
    SAFE_HARBOR = 8;
    COMPLIANCE_TESTING = 9;
    MEGA_BACKDOOR_ROTH = 10;
    BROKERAGE_WINDOW = 11;
  }

  ManagementOptionOfferingType type = 1;
  bool isSupported = 2;
}

ManagementOptionType

enum ManagementOptionType {
  UNKNOWN_MANAGEMENT_TYPE = 0;
  PARTNER_USP_FULLY_MANAGED = 1;
  PARTNER_USP_EMPLOYER_MANAGED = 2;
  PARTNER_PEO = 3;
  PARTNER_IC = 4;
}

InvestmentConfig

message InvestmentConfig {
  QdiaType qdia = 1;
  repeated AssetMetadata investment_options = 2;
  optional ConfigurationSectionStatus status = 3;
}

References: AssetMetadata, ConfigurationSectionStatus, QdiaType

QdiaType

enum QdiaType {
  UNKNOWN_QDIA_TYPE = 0;
  FIDELITY = 1;
  VANGUARD = 2;
  OTHER_QDIA_TYPE = 3;
}

CoreConfig

message CoreConfig {
  repeated EmployerMatchTier employer_match_tiers = 1;
  optional bool enable_roth = 2;
  optional bool enable_plan401K_loans = 3;
  optional bool enable_mega_backdoor_roth = 4;
  optional int32 employee_auto_enrollment_bps = 5;
  optional int32 employee_auto_enrollment_increase_bps = 6;
  optional Date ideal_start_date = 7;
  optional EligibilityConfig eligibility_config = 8;
  ConfigurationSectionStatus status = 9;
}

References: ConfigurationSectionStatus, Date, EligibilityConfig, EmployerMatchTier

EligibilityConfig

message EligibilityConfig {
  message HoursConfig {
    int32 hours_required = 1;
    int32 rolling_period = 2;
  }

  oneof period {
    int32 days_since_start = 1;
    HoursConfig hours_config = 2;
  }
}

EmployerMatchTier

Notes:

  • There cannot ever be a cap that is a partial percent.
  • To set up an actual employer match of 3.5% you would need to set up multiple match tiers such as this:
    • match_bps: 10000, match_cap_bps: 300, that is a 100% match up to 3%
    • match_bps: 5000, match_cap_bps: 100, that is 50% match up to the next 1%
message EmployerMatchTier {
  int32 match_bps = 1;
  int32 match_cap_bps = 2;
}

MigrationConfig

message MigrationConfig {
  string migration_record_keeper = 1;
}

KnownRecordKeeper

message KnownRecordKeeper {
  string name = 1;
  optional string logo_url = 2;
}

BankAccount

message BankAccount {
  string bank_account_uuid = 1;
  string institution_name = 2;
  string last_4 = 3;
  bool is_verified = 4;
}

TrusteeInfo

message TrusteeInfo {
  string external_id = 1;
  string email = 2;
  string given_name = 3;
  string surname = 4;
}