Bean Box

Bean Box partners with Seattle's top independent coffee roasters to curate and deliver the highest quality, freshly-roasted coffee in a subscription-based box.

Business Type: Subscription Service

Matthew Berk, CEO

When you’re running an ecommerce business, there’s a perception that shipping is all about postage. It’s truly about seamless physical integrations—from label printing to packaging to scanning and tracking. Shippo helped us learn a lot about our operations — what’s working and what’s not — so we could make changes in our warehouse. In the end, this translated to time and efforts saved for us.

It’s truly about seamless physical integrations — from label printing to packaging to scanning and tracking.

Challenge

Bean Box’s key differentiator is the freshness of their beans. A seamless shipping operation is an integral part of getting fresh beans into the hands of customers.

As Bean Box ramped up their sales, they knew that shipping would need to scale with them. With a 10x growth in shipments over the last twelve months, the team began evaluating new shipping solutions and knew that they needed a scalable way to process a large number of shipments at once.

Bean Box needed a better way to process a large batches of shipments in real-time.



  • Automation of data imports and exports, allowing them to reduce or even omit the involvement of a team member to manage the process.
  • Ownership of all order data, passing only the information necessary for label creation.
  • "Batch shipments" that would allow them to process orders without pre-sorting for service levels. A batch label process that was speedy, accurate and efficient.

Solution

Bean Box found Shippo to be the best fit with their needs for processing their increasing volume of shipments . Since Shippo provides USPS and other carrier's shipping rates and labels directly from its servers, Bean Box was able to process large volumes of orders quickly with little lag time. This allowed Bean Box to offer shipping rates in realtime at checkout and generate shipping labels quickly in the backend through a synchronous API request.

Bean Box implementing a fast synchronous shipment creation process because they can quickly identify shipment requests with bad information (such as an invalid address) to immediately triage, without waiting for everything else to be processed.

  • Provides an API solution that can be fully integrated into Bean Box's backend operations
  • Gives the Bean Box operations team the ability to process large volumes of orders quickly and the ability to offer customers a menu of relevant delivery options in real-time at checkout
  • The API integration allowed Bean Box to triage orders with bad information immediately without halting other shipments

Single Call Label Creation

  • cURL
  • Ruby
  • Python
  • PHP
  • Node
  • C#
  • Java
curl https://api.goshippo.com/shipments/  \
    -H "Authorization: ShippoToken API_TOKEN" \
    -H "Content-Type: application/json"  \
    -d '{
       "address_from":{
          "name":"Mr. Hippo",
          "street1":"215 Clayton St.",
          "city":"San Francisco",
          "state":"CA",
          "zip":"94117",
          "country":"US",
          "phone":"+1 555 341 9393",
          "email":"support@goshippo.com"
       },
       "address_to":{
          "name":"Mrs. Hippo",
          "street1":"965 Mission St.",
          "city":"San Francisco",
          "state":"CA",
          "zip":"94105",
          "country":"US",
          "phone":"+1 555 341 9393",
          "email":"support@goshippo.com"
       },
       "parcels":[{
          "length":"5",
          "width":"5",
          "height":"5",
          "distance_unit":"in",
          "weight":"2",
          "mass_unit":"lb"
       }],
       "async": false
    }'
require 'shippo'

Shippo::API.token = 'API_TOKEN'

address_from = {
    :name => 'Shawn Ippotle',
    :street1 => '965 Mission St.',
    :city => 'San Francisco',
    :state => 'CA',
    :zip => '94117',
    :country => 'US',
    :phone => '+1 555 341 9393',
    :email => 'shippotle@goshippo.com' 
}

address_to = {
    :name => 'Mr Hippo',
    :street1 => 'Broadway 1',
    :city => 'New York',
    :state => 'NY',
    :zip => '10007',
    :country => 'US',
    :phone => '+1 555 341 9393',
    :email => 'mrhippo@goshippo.com'
}

parcel = {
    :length => 5,
    :width => 1,
    :height => 5.555,
    :distance_unit => :in,
    :weight => 2,
    :mass_unit => :lb
}

shipment = Shippo::Shipment.create(
    :address_from => address_from,
    :address_to => address_to,
    :parcels => parcel,
    :async => false
)
import shippo

shippo.api_key = "API_TOKEN"

address_from = {
    "name": "Shawn Ippotle",
    "street1": "215 Clayton St.",
    "city": "San Francisco",
    "state": "CA",
    "zip": "94117",
    "country": "US",
    "phone": "+1 555 341 9393",
    "email": "shippotle@goshippo.com"
}

address_to = {
    "name": "Mr Hippo",
    "street1": "Broadway 1",
    "city": "New York",
    "state": "NY",
    "zip": "10007",
    "country": "US",
    "phone": "+1 555 341 9393",
    "email": "mrhippo@goshippo.com"
}

parcel = {
    "length": "5",
    "width": "5",
    "height": "5",
    "distance_unit": "in",
    "weight": "2",
    "mass_unit": "lb"
}

shipment = shippo.Shipment.create(
    address_from = address_from,
    address_to = address_to,
    parcels = [parcel],
    async = False
)
require_once('lib/Shippo.php');
Shippo::setApiKey("API_TOKEN");

$fromAddress = array(
    'name' => 'Shawn Ippotle',
    'street1' => '215 Clayton St.',
    'city' => 'San Francisco',
    'state' => 'CA',
    'zip' => '94117',
    'country' => 'US',
    'phone' => '+1 555 341 9393',
    'email' => 'shippotle@goshippo.com'
);

$toAddress = array(
    'name' => 'Mr Hippo"',
    'street1' => 'Broadway 1',
    'city' => 'New York',
    'state' => 'NY',
    'zip' => '10007',
    'country' => 'US',
    'phone' => '+1 555 341 9393',
    'email' => 'mrhippo@goshippo.com'
);

$parcel = array(
    'length'=> '5',
    'width'=> '5',
    'height'=> '5',
    'distance_unit'=> 'in',
    'weight'=> '2',
    'mass_unit'=> 'lb',
);

$shipment = Shippo_Shipment::create( array(
    'address_from'=> $fromAddress,
    'address_to'=> $toAddress,
    'parcels'=> array($parcel),
    'async'=> false
    )
);
var shippo = require('shippo')('API_TOKEN');

var addressFrom  = {
    "name": "Shawn Ippotle",
    "street1": "215 Clayton St.",
    "city": "San Francisco",
    "state": "CA",
    "zip": "94117",
    "country": "US",
    "phone": "+1 555 341 9393",
    "email": "shippotle@goshippo.com"
};

var addressTo = {
    "name": "Mr Hippo",
    "street1": "Broadway 1",
    "city": "New York",
    "state": "NY",
    "zip": "10007",
    "country": "US",
    "phone": "+1 555 341 9393",
    "email": "mrhippo@goshippo.com"
};

var parcel = {
    "length": "5",
    "width": "5",
    "height": "5",
    "distance_unit": "in",
    "weight": "2",
    "mass_unit": "lb"
};

shippo.shipment.create({
    "address_from": addressFrom,
    "address_to": addressTo,
    "parcels": [parcel],
    "async": false
}, function(err, shipment){
    // asynchronously called
});
APIResource resource = new APIResource ('API_TOKEN');

// to address
Hashtable toAddressTable = new Hashtable();
toAddressTable.Add("name", "Mr Hippo");
toAddressTable.Add("company", "Shippo");
toAddressTable.Add("street1", "215 Clayton St.");
toAddressTable.Add("city", "San Francisco");
toAddressTable.Add("state", "CA");
toAddressTable.Add("zip", "94117");
toAddressTable.Add("country", "US");
toAddressTable.Add("phone", "+1 555 341 9393");
toAddressTable.Add("email", "mrhippo@goshipppo.com");

// from address
Hashtable fromAddressTable = new Hashtable();
fromAddressTable.Add("name", "Ms Hippo");
fromAddressTable.Add("company", "San Diego Zoo");
fromAddressTable.Add("street1", "2920 Zoo Drive");
fromAddressTable.Add("city", "San Diego");
fromAddressTable.Add("state", "CA");
fromAddressTable.Add("zip", "92101");
fromAddressTable.Add("country", "US");
fromAddressTable.Add("email", "mshippo@goshipppo.com");
fromAddressTable.Add("phone", "+1 619 231 1515");
fromAddressTable.Add("metadata", "Customer ID 123456");

Hashtable parcelTable = new Hashtable ();
parcelTable.Add ("length", "5");
parcelTable.Add ("width", "5");
parcelTable.Add ("height", "5");
parcelTable.Add ("distance_unit", "in");
parcelTable.Add ("weight", "2");
parcelTable.Add ("mass_unit", "lb");

resource.CreateShipment(new Hashtable(){
	{ "address_to", toAddressTable},
	{ "address_from", fromAddressTable},
	{ "parcels", parcelTable},
	{ "async", false}});
Shippo.setApiKey('API_TOKEN');

// To Address
HashMap<String, Object> addressToMap = new HashMap<String, Object>();
addressToMap.put("name", "Mr Hippo");
addressToMap.put("company", "Shippo");
addressToMap.put("street1", "215 Clayton St.");
addressToMap.put("city", "San Francisco");
addressToMap.put("state", "CA");
addressToMap.put("zip", "94117");
addressToMap.put("country", "US");
addressToMap.put("phone", "+1 555 341 9393");
addressToMap.put("email", "mrhippo@goshipppo.com");

// From Address
HashMap<String, Object> addressFromMap = new HashMap<String, Object>();
addressFromMap.put("name", "Ms Hippo");
addressFromMap.put("company", "San Diego Zoo");
addressFromMap.put("street1", "2920 Zoo Drive");
addressFromMap.put("city", "San Diego");
addressFromMap.put("state", "CA");
addressFromMap.put("zip", "92101");
addressFromMap.put("country", "US");
addressFromMap.put("email", "mshippo@goshipppo.com");
addressFromMap.put("phone", "+1 619 231 1515");
addressFromMap.put("metadata", "Customer ID 123456");

// Parcel
HashMap<String, Object> parcelMap = new HashMap<String, Object>();
parcelMap.put("length", "5");
parcelMap.put("width", "5");
parcelMap.put("height", "5");
parcelMap.put("distance_unit", "in");
parcelMap.put("weight", "2");
parcelMap.put("mass_unit", "lb");

// Shipment
HashMap<String, Object> shipmentMap = new HashMap<String, Object>();
shipmentMap.put("address_to", addressToMap);
shipmentMap.put("address_from", addressFromMap);
shipmentMap.put("parcels", parcelMap);
shipmentMap.put("async", false);

Shipment shipment = Shipment.create(shipmentMap);

Results

Since implementing Shippo, Bean Box has been able to scale their shipping operations and increase customer satisfaction. In addition to batch label generation, Shippo also helped Bean Box save hours of time at package pickup.

To help get thousands of USPS packages out the door, Shippo generates a Shipment Confirmation Acceptance Notice, or SCAN form, for parcels. The form has one bar code associated with all the packages in the shipment. On days when Bean Box is shipping 10 USPS rolling bins, each with more than 200 boxes inside, Bean Box, will produce one form for each bin. Instead of scanning each box, USPS scans the form and every package in the shipment receives an “Acceptance” notice.

We look forward to Bean Box's continued growth and success.

  • Help scale Bean Box operations as they grow
  • Generate SCAN forms for more efficient pickup

Generating SCAN Forms (Manifests)

  • cURL
  • Ruby
  • Python
  • PHP
  • Node
  • C#
  • Java
curl https://api.goshippo.com/manifests/
    -H "Authorization: ShippoToken API_TOKEN" \
    -H "Content-Type: application/json"  \
    -d '{
          "carrier_account": "b741b99f95e841639b54272834bc478c",
          "shipment_date": "2014-05-16T23:59:59Z",
          "address_from": "28828839a2b04e208ac2aa4945fbca9a",
          "transactions": [
            "64bba01845ef40d29374032599f22588", 
            "c169aa586a844cc49da00d0272b590e1"
            ],
          "async": false
        }'
manifest = Shippo::Manifest.create(
    :carrier_account => "b741b99f95e841639b54272834bc478c",
    :shipment_date => "2014-05-16T23:59:59Z",
    :transactions => ["64bba01845ef40d29374032599f22588", "c169aa586a844cc49da00d0272b590e1"]
)
manifest = shippo.Manifest.create(
    carrier_account = "b741b99f95e841639b54272834bc478c",
    shipment_date = "2014-05-16T23:59:59Z",
    transactions = ["64bba01845ef40d29374032599f22588", "c169aa586a844cc49da00d0272b590e1"]
)
$manifest = Shippo_Manifest::create(
    array(
        'carrier_account'=> 'b741b99f95e841639b54272834bc478c',
        'shipment_date'=> '2014-05-16T23:59:59Z',
        'transactions'=> array('64bba01845ef40d29374032599f22588', 'c169aa586a844cc49da00d0272b590e1')
));
shippo.manifest.create({
    "carrier_account": "b741b99f95e841639b54272834bc478c",
    "shipment_date": "2014-05-16T23:59:59Z",
    "transactions": [
        "64bba01845ef40d29374032599f22588",
        "c169aa586a844cc49da00d0272b590e1"
    ]
}, function(err, manifest) {
    // asynchronously called
});
resource.CreateManifest( new Hashtable(){
    { "carrier_account", "b741b99f95e841639b54272834bc478c"},
    { "shipment_date", "2014-05-16T23:59:59Z"},
    { "transactions", new String[] { "64bba01845ef40d29374032599f22588", "c169aa586a844cc49da00d0272b590e1" }},
});
HashMap<String, Object> manifestMap = new HashMap<String, Object>();
manifestMap.put("carrier_account", "b741b99f95e841639b54272834bc478c");
manifestMap.put("shipment_date", "2014-05-16T23:59:59Z");

String[] transactionIds = {"64bba01845ef40d29374032599f22588",
                           "c169aa586a844cc49da00d0272b590e1"};
manifestMap.put("transactions", transactions);

Manifest.create(manifestMap);