Users & Data Model
The User Service uses a single DynamoDB table (prod-user-service-users) for most entities, plus two legacy DynamoDB tables and a PostgreSQL RDS instance for user profile data. Multiple entity types share the primary table, differentiated by key prefixes and the db_type attribute.
Primary Table: prod-user-service-users
Region: us-east-2
User
| Attribute | Description |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Auth0-generated user identifier |
|
User’s email address |
|
First name |
|
Last name |
|
Street address |
|
City |
|
State |
|
Zip code |
|
Sanitized 10-digit phone number |
|
See User Status |
|
Firebase messaging install ID |
|
Firebase instance ID for push notifications |
|
AppsFlyer attribution ID |
|
Mobile platform ( |
|
Timestamp when user record was created |
|
Timestamp of last update |
|
Map of tag name → Tag object (denormalized cache; canonical records stored separately) |
User Status
| Status | Description |
|---|---|
|
User has created an Auth0 account. Default status on creation. User is not yet eligible to be billed or take out floats. |
|
User has linked a Plaid account, has an active debit card, and has an activated subscription and membership. User is eligible for floats and billing. |
|
User has cancelled or been moved to paused state. User can log in but is shown a reactivation screen. Not billed. |
|
Set by MX operations. User cannot take out floats and is not billed. |
|
Set by MX operations or triggered automatically on a chargeback. User cannot log in. MX can unban, but user must still reactivate. |
Membership
| Attribute | Description |
|---|---|
|
|
|
|
|
|
|
User identifier |
|
Membership tier name (e.g. |
|
Version of the tier at time of creation (e.g. |
|
Billing term: |
|
|
|
Which system or actor triggered this membership record |
|
|
|
Payment confirmation ID from the Payment Service |
|
Subscription ID from the Subscription Service |
|
|
|
Timestamp when the downgrade was scheduled |
|
When this membership record became effective |
|
Timestamp of the most recent reactivation |
|
Date when the membership will be fully paused (first skipped payment) |
|
Date when the membership was resumed |
|
Number of months the pause was requested for |
Membership Status
An empty status string means the membership is in good standing.
| Status | Description |
|---|---|
(empty) |
Good standing — active, billing normally |
|
Cancellation scheduled; subscription is winding down |
|
Membership has been cancelled |
|
Pause has been requested; not yet in effect |
|
Membership is paused; user is not billed |
|
Resume has been requested; not yet in effect |
|
Membership has been resumed from a pause |
|
Subscription is active |
Membership Event Types
| Event Type | Description |
|---|---|
|
User initiated cancellation |
|
Account closure |
|
Pending membership change was retracted |
|
MX-initiated reactivation |
|
User-initiated reactivation |
|
MX enabled reactivation for a banned user |
|
Subscription paused event recorded |
|
Membership unpause |
|
Membership unpaused with a charge |
|
Subscription resumed event recorded |
|
User banned |
|
User flagged for investigation |
|
On-demand payment collected |
|
Tier upgraded mid-cycle |
|
Tier downgrade initiated (pending) |
|
Pending downgrade applied at billing cycle |
|
Pending tier change retracted |
Tag
Tags are arbitrary key/value attributes attached to a user account. They are stored as individual items in the primary table and also denormalized into the User item’s tags map.
| Attribute | Description |
|---|---|
|
|
|
|
|
|
|
Tag identifier |
|
Tag value (string) |
|
|
|
RFC3339 timestamp of when the tag was added |
Common Tags
| Tag Name | Values | Description |
|---|---|---|
|
RFC3339 timestamp |
Set at account creation. Records when the user first signed up. |
|
|
Tracks the current pause state of the membership, updated by the subscription worker. |
|
Boolean string |
When present and true, disables the pause functionality for this user. |
|
Boolean string |
Reserved for Floatme employees. Bypasses things like subscription fee collections. |
|
Boolean string |
The military status for a user. Assigned after an MLA lookup request. |
MLA Lookup Record
MLA lookup results are stored in the primary table for audit and compliance purposes.
| Attribute | Description |
|---|---|
|
|
|
|
|
|
|
User identifier |
|
Response code from Experian (e.g. |
|
Human-readable response text from Experian |
|
Experian’s transaction reference ID |
|
|
|
When the lookup was performed |
Consent Agreement
| Attribute | Description |
|---|---|
|
|
|
|
|
|
|
|
|
User identifier |
|
Item associated with the consent (e.g. Plaid item) |
|
Identifier for the consent type (e.g. |
|
Whether SMS consent is active |
|
When SMS consent was accepted |
|
When this consent was accepted |
|
IP address at time of acceptance |
|
App version at time of acceptance |
|
Date of approval as provided by the client |
For full details on how these event types flow through the system, see Event-Driven Flows.
Legacy Table: user-phone-numbers
Region: us-east-1
Dedicated table for phone number storage and deduplication.
| Attribute | Description |
|---|---|
|
Primary key — user identifier |
|
Sanitized 10-digit phone number |
|
Timestamp of last update |
|
Whether the user has opted out of SMS |
|
Whether the phone number has been verified |
GSI: phone_number-index on phone_number — used to check for duplicate phone numbers across users.
Legacy Table: user-balance-settings
Region: us-east-1
Stores user-configured low balance alert thresholds.
| Attribute | Description |
|---|---|
|
Primary key — user identifier |
|
Timestamp when the record was created |
|
Alert threshold in cents (e.g. |
RDS: FloatMeAPI_usermodel
Region: us-east-2 — PostgreSQL (ebdb database)
Stores user profile data. Accessed via a read replica for reads and a primary instance for writes.
| Column | Type | Description |
|---|---|---|
|
string |
Primary key — Auth0-generated user identifier |
|
string |
First name |
|
string |
Last name |
|
string |
Email address |
|
string |
Street address |
|
string |
City |
|
string |
State |
|
string |
Zip code |
|
timestamp |
When the user record was created |
|
timestamp |
When the user record was last updated |
|
string |
User status (mirrors |
|
string |
Firebase messaging install ID |
|
string |
Firebase instance ID |
|
string |
AppsFlyer attribution ID |
|
string |
Mobile platform ( |
Related Pages
-
Architecture — DynamoDB single-table design overview
-
User Lifecycle — How user status values change over time
-
Membership Upgrades — Membership event types written during upgrade
-
Membership Pause —
MEMBERSHIP_PAUSE_STATUStag lifecycle -
MLA Lookup — MLA lookup record written on each lookup
-
Event-Driven Flows — How DynamoDB writes flow into the outbound Kinesis stream