# user\_meta

## Model

<table><thead><tr><th width="278">Field</th><th>Type</th><th data-type="checkbox">Nullable</th><th></th><th data-hidden>Nullable</th></tr></thead><tbody><tr><td>id</td><td>int4</td><td>false</td><td></td><td>No</td></tr><tr><td>user_id</td><td>int4</td><td>false</td><td></td><td>No</td></tr><tr><td>initial_100_tokens_earned</td><td>bool</td><td>true</td><td>False</td><td>Yes</td></tr><tr><td>gupshup_opt_in</td><td>bool</td><td>true</td><td>False</td><td>Yes</td></tr><tr><td>created_at</td><td>timestamp</td><td>false</td><td></td><td>No</td></tr><tr><td>updated_at</td><td>timestamp</td><td>false</td><td></td><td>No</td></tr><tr><td>last_login_at_bolbhav_plus</td><td>timestamp</td><td>true</td><td></td><td>Yes</td></tr><tr><td>last_login_at_trader_app</td><td>timestamp</td><td>true</td><td></td><td>Yes</td></tr><tr><td>source_of_onboarding</td><td>text</td><td>true</td><td></td><td>Yes</td></tr><tr><td>is_first_validation</td><td>bool</td><td>true</td><td>True</td><td>Yes</td></tr><tr><td>profile_image_url</td><td>text</td><td>true</td><td></td><td>Yes</td></tr><tr><td>user_name</td><td>text</td><td>true</td><td></td><td>Yes</td></tr><tr><td>address</td><td>varchar(50)</td><td>true</td><td></td><td>Yes</td></tr><tr><td>consent_given</td><td></td><td>false</td><td></td><td></td></tr><tr><td>is_claim_trial</td><td></td><td>false</td><td></td><td></td></tr><tr><td>notification_permission_status</td><td></td><td>false</td><td></td><td></td></tr></tbody></table>

## Description of fields

### id

This is the primary key

### user\_id

The id of the user for which this meta information belongs to. This is a foreign key on person table.

### initial\_100\_tokens\_earned

We send several WhatsApp based notifications to keep our users engaged. One such notification is triggered when user earns their first 100 tokens. This field is by default set to `false` and once user earns their first 100 tokens, this is set to true and a notification gets sent to the user. We require this boolean field so that the system doesn't the notification again for the same user.

### gupshup\_opt\_in

To be added

### created\_at

The timestamp when a user meta row is first created.

### updated\_at

The timestamp at which a user meta row is last updated.

### last\_login\_at\_bolbhav\_plus

The last login time of a user in the bolbhav plus app. This field is updated from the login API that the Bolbhav app (ReactNative) uses.

{% hint style="info" %}
When we started the app, we didn’t know if a user was coming from Bolbhav app or an earlier source. Whoever was coming on the app, their entries were being recorded in wallet table since each new user would be assigned tokens for a free trial. From January 2024, we started recording when a user last logged in on the Bolbhav app.
{% endhint %}

### last\_login\_at\_trader\_app

The last login time of a user in the bolbhav plus app. This field is updated from the login API that the trader app (FlutterFlow) uses. This is different from `last_login_at_bolbhav_plus` field is because to make it flexible for a case when a user may login to trader app and then to bolbhav app, their app specific last login time remains unaffected.

### source\_of\_onboarding

This field contains the app from where the user's entry was registered for the first time. Since we store all users (trader and farmers) from the two apps into a single table, this field helps to determine the source of onboarding for a specific user.

The possible values in this field are:

1. bolbhavplus\_app - if the user was first registered from Bolbhav app
2. trader\_app - if the user was first registered from Trader app

{% hint style="info" %}
This field currently only holds data for certain number of rows as it was introduced at a later phase before trader app. It's safe to assume that the user meta rows with null values in source of onboarding would either be coming from bolbhav app or pre-bolbhav app duration.
{% endhint %}

### is\_first\_validation

Default set to true. In the earlier user validation flow, we had an introduction video at the beginning that each user had to force watch for the first time. When a user would view it once, the field would be set to false and the user would not be shown the video again.&#x20;

### profile\_image\_url

The URL for profile image as uploaded by the user. This contains the S3 asset URL.

### user\_name

Full name of the user as entered by them in the profile page.

{% hint style="danger" %}
This field looks duplicate of the name field in person table. This needs to be discussed with the team and ideally should be removed if this turns out to be duplicate.
{% endhint %}

### address

Address of the user entered by them in the profile page.

### consent\_given

<mark style="color:red;">**Details to be added.**</mark>&#x20;

### is\_claim\_trial

<mark style="color:red;">**Details to be added.**</mark>&#x20;

### notification\_permission\_status

<mark style="color:red;">**Details to be added.**</mark>&#x20;


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://gramhal.gitbook.io/bolbhav/chapter-1-database/user-data/user_meta.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
