diff --git a/app/javascript/dashboard/api/contacts.js b/app/javascript/dashboard/api/contacts.js
index 1a66db0e1..cc8448873 100644
--- a/app/javascript/dashboard/api/contacts.js
+++ b/app/javascript/dashboard/api/contacts.js
@@ -18,6 +18,14 @@ class ContactAPI extends ApiClient {
     return axios.get(`${this.url}/${contactId}/contactable_inboxes`);
   }
 
+  getContactLabels(contactId) {
+    return axios.get(`${this.url}/${contactId}/labels`);
+  }
+
+  updateContactLabels(contactId, labels) {
+    return axios.post(`${this.url}/${contactId}/labels`, { labels });
+  }
+
   search(search = '', page = 1, sortAttr = 'name') {
     return axios.get(
       `${this.url}/search?q=${search}&page=${page}&sort=${sortAttr}`
diff --git a/app/javascript/dashboard/api/specs/contacts.spec.js b/app/javascript/dashboard/api/specs/contacts.spec.js
index ae1e1e0e1..a7080a634 100644
--- a/app/javascript/dashboard/api/specs/contacts.spec.js
+++ b/app/javascript/dashboard/api/specs/contacts.spec.js
@@ -34,6 +34,25 @@ describe('#ContactsAPI', () => {
         '/api/v1/contacts/1/contactable_inboxes'
       );
     });
+
+    it('#getContactLabels', () => {
+      contactAPI.getContactLabels(1);
+      expect(context.axiosMock.get).toHaveBeenCalledWith(
+        '/api/v1/contacts/1/labels'
+      );
+    });
+
+    it('#updateContactLabels', () => {
+      const labels = ['support-query'];
+      contactAPI.updateContactLabels(1, labels);
+      expect(context.axiosMock.post).toHaveBeenCalledWith(
+        '/api/v1/contacts/1/labels',
+        {
+          labels,
+        }
+      );
+    });
+
     it('#search', () => {
       contactAPI.search('leads', 1, 'date');
       expect(context.axiosMock.get).toHaveBeenCalledWith(
diff --git a/app/javascript/dashboard/components/widgets/LabelSelector.stories.js b/app/javascript/dashboard/components/widgets/LabelSelector.stories.js
new file mode 100644
index 000000000..77ca54b25
--- /dev/null
+++ b/app/javascript/dashboard/components/widgets/LabelSelector.stories.js
@@ -0,0 +1,67 @@
+import { action } from '@storybook/addon-actions';
+import LabelSelector from './LabelSelector';
+
+export default {
+  title: 'Components/Label/Contact Label',
+  component: LabelSelector,
+  argTypes: {
+    contactId: {
+      control: {
+        type: 'text ,number',
+      },
+    },
+  },
+};
+
+const Template = (args, { argTypes }) => ({
+  props: Object.keys(argTypes),
+  components: { LabelSelector },
+  template:
+    '',
+});
+
+export const ContactLabel = Template.bind({});
+ContactLabel.args = {
+  onAdd: action('Added'),
+  onRemove: action('Removed'),
+  allLabels: [
+    {
+      id: '1',
+      title: 'sales',
+      description: '',
+      color: '#0a5dd1',
+    },
+    {
+      id: '2',
+      title: 'refund',
+      description: '',
+      color: '#8442f5',
+    },
+    {
+      id: '3',
+      title: 'testing',
+      description: '',
+      color: '#f542f5',
+    },
+    {
+      id: '4',
+      title: 'scheduled',
+      description: '',
+      color: '#42d1f5',
+    },
+  ],
+  savedLabels: [
+    {
+      id: '2',
+      title: 'refund',
+      description: '',
+      color: '#8442f5',
+    },
+    {
+      id: '4',
+      title: 'scheduled',
+      description: '',
+      color: '#42d1f5',
+    },
+  ],
+};
diff --git a/app/javascript/dashboard/components/widgets/LabelSelector.vue b/app/javascript/dashboard/components/widgets/LabelSelector.vue
new file mode 100644
index 000000000..8a6270bb8
--- /dev/null
+++ b/app/javascript/dashboard/components/widgets/LabelSelector.vue
@@ -0,0 +1,116 @@
+
+  
+    
+      
+      {{ $t('CONTACT_PANEL.LABELS.CONTACT.TITLE') }}
+    
+    
+  
+            
           
-          
         
       
     
@@ -47,9 +49,14 @@ export default {
 .item-wrap {
   display: flex;
 
+  ::v-deep .button__content {
+    width: 100%;
+  }
+
   .button-wrap {
     display: flex;
     justify-content: space-between;
+    width: 100%;
 
     &.active {
       display: flex;
@@ -59,14 +66,24 @@ export default {
 
     .name-label-wrap {
       display: flex;
-    }
+      min-width: 0;
+      width: 100%;
 
-    .label-color--display {
-      margin-right: var(--space-small);
-    }
+      .label-color--display {
+        margin-right: var(--space-small);
+      }
 
-    .icon {
-      font-size: var(--font-size-small);
+      .label-text {
+        overflow: hidden;
+        text-overflow: ellipsis;
+        white-space: nowrap;
+        line-height: 1.1;
+        padding-right: var(--space-small);
+      }
+
+      .icon {
+        font-size: var(--font-size-small);
+      }
     }
   }