Sellers n Bloggers

Sellers n Bloggers is a company that enables users to buy products from their favorite blogs and bloggers to turn their blogging platform into an e-commerce shop.

By adding a widget to a blog you can offer to sell products of your favorite brands.

Design of ui and ux

For the design of "Sellers and Bloggers" we used a simple flat UI. With an easy to use experience and simple admin dashboard we went for solid colors with big yellow buttons for easy recognition and consistency.


This app was developed using Ruby on Rails. Integrated with Braintree as a payment gateway.

An essential part of this app was the creation and implementation of the Plug-in. Bloggers can add this into a Blog, and this would allow us to interact with the information provided by the app.

We implemented a very simple form of communication between "Bloggers" and "Brands" through messages within the platform.

Sales of products are displayed as reports, as well as a CRT for each product. In both dashboards, in "Bloggers" and “Brands" we can observe real information of all activities generated by the app.

class Sale < ActiveRecord::Base
  belongs_to :brand
  belongs_to :buyer
  belongs_to :blogger
  belongs_to :product
  belongs_to :size, class_name: "ProductTalla", foreign_key: :talla

  attr_accessor :name_buy

  after_create :sent_purchase_confirmation_mail, :update_item_stock
  after_update :sent_mail

  scope :current_month, -> { in_month( }
  scope :by_order, -> (order_num) { where(order_num: order_num) }
  scope :in_month, -> (month) { where("extract(month from sales.created_at) = ? AND extract(year from sales.created_at) = ?", month, }
  scope :all_sales_sent, -> { where(sent: true) }
  scope :all_sales_delivered, -> { where(delivered: true) }
  scope :all_sales_liquidated, -> { where(liquidated: true) }
  scope :all_sales_of_blogger, -> (blogger_id) { joins(:product).where(blogger_id: blogger_id) }
  scope :all_sales_by_month, -> (year, month, day) { where(created_at:, month, 1), month, day, 23, 59, 59)) }
  scope :in_process, ->{ where(delivered: false, sent: [true, false]) }
  scope :between_dates, -> (date_ini, date_end) { where(created_at: date_ini..date_end).order('created_at DESC') }

  def self.all_sales_of_blogger_between_dates(blogger_id, date_ini, date_end)
    @date_ini = date_nil_or_empty?(date_ini) ? DateTime.parse("2015-01-01") : DateTime.parse(date_ini)
    @date_end = date_nil_or_empty?(date_end) ? : DateTime.parse(date_end)+0.99999
    all_sales_of_blogger(blogger_id).between_dates(@date_ini, @date_end)

  def self.date_nil_or_empty?(date)
    date.nil? || date.empty? ? true : false
require 'rails_helper'

describe Blogger do
  describe "Configuration" do
    let(:blogger) { build(:blogger)}

     it("should have a token when is created") do
       expect{}.to change { Token.count }.by(1)

     it("should have a token when is created") do
       expect(blogger).to receive(:set_token)
class Message < ActiveRecord::Base
  belongs_to :brand
  belongs_to :blogger
  validates_presence_of :title, :message, :blogger_id, :brand_id
  after_save :send_email
  after_save :send_notification

  def send_email
    @brand = Brand.find(self.brand_id)
    @blogger = Blogger.find(self.blogger_id)
    ContactMailer.brand_email(@brand, @blogger, self.title, self.message).deliver

  def send_notification
    Notification.create(user_id: self.blogger_id, notification_type_id: 7, brand_id: self.brand_id)

Our Process


We have weekly calls where we discuss progress. We use Skype, Google Hangouts or GotoMeeting.

We agreed on a day and time that worked for everyone.


In the beginning we send a timeline specifying the planning and tasks for that week.

These tasks are the same cards we have planned in Trello.


We translate all requirements into stories in Trello Cards.

Trello is the place to add any specification, ask questions or comments to the team.


Once the tasks are done they go through a testing process and we pass them for your approval.

Every week we will pass cards onto the client list for you to give us feedback.

Quality Assurance

Once the functionality is completed one of our functional testers will try to break the feature.

We either move it to Needs Improvement or pass it to you for feedback.


We need the support from you to review the cards and Approve them or tell us how to improve it.

This is key to meet goals and being on time in the development of the application.