zinc-collective / convene

An Operating System for the Solidarity Economy
https://convene.zinc.coop
Other
56 stars 19 forks source link

🔥👏🏾 `Client`: Piikup #832

Open zspencer opened 1 year ago

zspencer commented 1 year ago

See: https://marketplace.piikup.com/

Desired Furniture

Piikup is a solidarity economy business focused on supplanting gig-economy delivery companies. They support a network of restaurants, grocers, and caterers throughout the San Francisco Bay Area.

zspencer commented 1 year ago

April (CEO of Piikup) is interested in a demo sometime! I've asked if she'd be available during our monthly member meeting, or during our Wednesday sessions. If not, I'll set aside a separate time.

zspencer commented 1 year ago

Demoed our Marketplace: Furniture to April today, feedback was:

  1. Stripe takes ~3.5% from a $50 transaction. How do we cover the Stripe fees? We discussed a "Solidarity Fee" option that Buyers could opt-in to cover the Vendor/Distributor's payment processor fees.
  2. The goal for the Marketplace continues to be about driving purchases to Piikup's Bendors; so we want to keep costs born by the Vendors to a minimum.
  3. Is it possible to do a bulk-product upload rather than one-by-one? (Yes, we just need a spreadsheet per vendor, or a spreadsheet with a tab per vendor)
zspencer commented 1 year ago

Today, I onboarded Ivin and Mikaya as Account Managers for Piikup; who will be supporting Piikups Clients with their eCommerce platform.

I recorded the walk-through that Ivin did, and will be passing it on to them via email.

We've also asked that they do some practice account set up and orders to make sure they're comfortable with the flow; as well as to provide us with adjusting feedback.

Two key new work items from the call:

zspencer commented 1 year ago

Script I used to port data from the sandbox to the production site:

from = Space.find_by(slug: 'piikup-sandbox')
to = Space.find_by(slug: 'piikup')
from.rooms.map { |r| to.rooms.find_or_initialize_by(name: r.name, slug: r.slug).update!(access_level: :internal, publicity_level: :listed) }
frs = from.rooms
frs.map do |fr| 
  tr = to.rooms.find_or_initialize_by(name: fr.name, slug: fr.slug)
  # tr.update!(access_level: :internal, publicity_level: :unlisted)
  fr.furnitures.each  { |ff| tr.furnitures.find_or_initialize_by(slot: ff.slot).update!(furniture_kind: ff.furniture_kind, settings: ff.settings) } 
end
tms = Marketplace::Marketplace.where(furniture_kind: "marketplace", room: to.rooms)
fms = Marketplace::Marketplace.where(furniture_kind: "marketplace", room: from.rooms)
tms.each do |tm| 
  # tm.update!(stripe_account: nil, stripe_webhook_endpoint: nil, stripe_webhook_endpoint_secret: nil)
  fm = fms.includes(:room).find_by(room: { slug: tm.room.slug })
  next unless fm.present?
  fm.tax_rates.each do |ftr|
    tm.tax_rates.find_or_initialize_by(label: ftr.label).update!(tax_rate: ftr.tax_rate)
  end
  fm.delivery_areas.each do |fda|
    tm.delivery_areas.find_or_initialize_by(label: fda.label).update!(price: fda.price)
  end
  fm.products.each do |fp|
    tp = tm.products.find_or_initialize_by(name: fp.name)
    tp.update!(description: fp.description, price: fp.price)
    fp.tax_rates.each do |ftr|
      tp.product_tax_rates.find_or_initialize_by(tax_rate: tm.tax_rates.find_by!(label: ftr.label))
    end
  end
end
zspencer commented 1 year ago

From me on 3/31

Hey April!

We turned on your live Marketplace today (https://piikup.zinc.coop/) and ran a test transaction through! https://dashboard.stripe.com/payments/pi_3MrobIGi42bwJziz0Oqklo9t. You should be able to connect your Clients' Stripe accounts to their Piikup Marketplace Storefront!

We also learned you will need to maintain a "float" balance in your Piikup Stripe account, which means:

  1. We transitioned your stripe account from automatic daily payouts to manual payouts: https://dashboard.stripe.com/settings/payouts.
  2. When running a manual payout (https://dashboard.stripe.com/balance/overview?currency=usd) , you'll want to make sure you're only paying-out your delivery fees. If running manual payouts gets onerous, we can automate that for ya.
  3. You may want to "Top Up" your Stripe Balance so that you have some $$$ in it.

Before you start accepting orders, we recommend:

1.You may want a Terms of Service and/or Privacy Policy. It's possible the NoBAWC or SELC folks can help with this? I'm available to support you by working with your legal team, or I can look for some off-the-shelf ones for ya.

  1. We want to do some bug-bashing and polishing on the Shopper experience. In particular
    • The Shopper email was empty when I checked out as a Guest
    • The Order Confirmation page is absolutely hideous
    • The Order Confirmation page does not work for Guests

That said, it's entirely your call on whether you're ready to start directing folks to taking online orders or not. We don't think it's quite ready, but the orders should flow through at least!

Response from April:

Hi Zee Yahoo to the live Marketplace 🤩 hella raw🙌🏿

Agreed . I’d like to wait until a few bugs Question, am I able to correct the tax rate? I recall you wanted to adjust the increments to allow for 5’s

I have created 7 merchant rooms and added furniture to each.

Can I add a check box âś… option for if the order is for a catering event? Or better for phase 2.

I’m asking because on the marketplace are both restaurants that will be expecting orders from a regular consumer who wants to order for dinner time.

There are also places like Cafe Gabriela and The Table Catering that provide catering…

Thinking about the understory’s and arizmendiz co-op fam, they also likely have 2 order scenarios

Most of the restaurants likely have that double target market

Here’s how they lineup:

The Table Catering online

Cafe Gabriela restaurant storefront

Tha Mufn vegan online only

Coco noir storefront

Lion dance cafe storefront

Response from Zee:

Re: Tax Rates - Yep! You can do it in increments to the 10ths place now (i.e. 10.23% or whatever)

Re: Check-box for catering - We can do that, I am thinking a bit about the outcomes you would hope for with that box being checked? Like, if that box is checked does it mean that they get to choose a delivery time, but if it is not it's for the "today" delivery time?

Re: Bugs - Please let us know each time you notice something that makes you hesitant to accept deal flow. Or feel free to compile a list, we're doing our own testing and bug-bashing; but guidance from people who are using the software and deriving the benefit is our favorite thing. Even just snapping a screenshot and sending it to the convene-maintainers@zinc.coop email list as you notice stuff is a huge help.

zspencer commented 1 year ago

Hey April,

We've made a number of improvements to the piikup marketplace, in particular:

  • We've tidied up rough edges around the site. Things should look more consistent and polished.

  • You can create "Delivery Areas" for each Marketplace. "Area" is a bit of a misleading term, because you could create "Delivery Area"s for "Catering" and "Dinner" with different fees. We're thinking of moving the "Order By" and "Delivers On" fields from the Marketplace onto the Delivery Area. This would let you tailor the messaging around when orders must be placed and when they will be delivered. Does that sound useful to you? (Thanks Kelly!)

  • Shoppers can see products before setting their delivery information, and the UI for setting their delivery information is a little nicer. Shoppers must also pick a Delivery Area before they may Check Out.

  • The after-order experience, including the emails sent to you and the Shopper are fuller and formatted nicer. Also, the Order History screens no longer look like a trash fire.

  • We've added in tools to observe the site and identify confusing or frustrating experiences, which is how we proactively noticed and remediated the log in bug last week. Whenever you notice anything that doesn't feel great, just send a quick email to either myself or convene-customer-team@zinc.coop and we'll be able to dig in. (Thanks Ana!)

If you'd like to do a demo this week, we'll be in starting at 5pm on Wednesday and 10AM on Sunday, or you can book time at

We will be continuing testing and polishing of the Seller onboarding experience; as well as looking into an appropriate privacy policy and terms of service. That said, we think there is no technical reason not to start taking orders?

I've merged in the data from https://piikup-sandbox.zinc.coop/ to https://piikup.zinc.coop/, so all of the Client's, Marketplaces, Taxes, Products and Marketplaces should be up to date.

  • Zee

Sent an update to April tonight, w/special shout-outs to @KellyAH and @anaulin!

I'm definitely not sure how to proceed with a Terms of Service and Privacy Policy. From an implementation perspective, I'm thinking maybe just text fields on a Space?

But the harder question is "how do we set our Client-Owners up for success on these critical pieces of high-trust service without requiring them to shoulder the specialized expertise and labor?"

Or to put it less hoity-toity: Are there off-the-shelf ToS we can use? Privacy Policies? Is there a SELC-a-like for software legalese stuff? Maybe Banchan has something we can borrow?

zspencer commented 1 year ago

Call with April:

  1. Prioritizing Catering Orders
  2. Probably should not hide marketplace that isn't ready from signed in users, because it makes it hard to demo / gets confusing
  3. A couple clients are hesitating because what about pictures!?

Next Steps:

  1. April is inviting Zee to Piikup's GoDaddy so I can set up marketplace.piikup.com and marketplace-sandbox.piikup.com
  2. April is meeting with her early adopters to get a Stripe account set up; with both Zee and April as Administrators
  3. April's clients will reach out to convene-support@zinc.coop if they experience any issues with the marketplace
zspencer commented 12 months ago

Latest copy script:

from = Space.find_by(slug: 'piikup-sandbox')
to = Space.find_by(slug: 'piikup')
from.rooms.each { |r| to.rooms.find_or_initialize_by(name: r.name, slug: r.slug).save! }
from.rooms.each do |fr| 
  tr = to.rooms.find_by!(name: fr.name, slug: fr.slug)
  fr.furnitures.each  do |ff| 
    tr.furnitures
      .find_or_initialize_by(slot: ff.slot)
      .update!(furniture_kind: ff.furniture_kind, settings: ff.settings) 

  end
end
tms = Marketplace::Marketplace.where(room: to.rooms)
fms = Marketplace::Marketplace.where(room: from.rooms)
tms.each do |tm| 
  # tm.update!(stripe_account: nil, stripe_webhook_endpoint: nil, stripe_webhook_endpoint_secret: nil)
  fm = fms.includes(:room, :delivery_areas, :products).find_by(room: { slug: tm.room.slug })
  next unless fm.present?
  # fm.tax_rates.each do |ftr|
  #   tm.tax_rates.find_or_initialize_by(label: ftr.label).update!(tax_rate: ftr.tax_rate)
  # end
  # fm.delivery_areas.each do |fda|
  #   tm.delivery_areas.find_or_initialize_by(label: fda.label).update!(price: fda.price)
  # end
  fm.products.each do |fp|
    puts "Finding... #{fp.name}"
    tp = tm.products.find_or_initialize_by(name: fp.name)
    tp.update!(description: fp.description, price: fp.price)
    if fp.photo.attached?
      puts "Attaching... #{fp.photo}"
      downloaded = fp.photo.download
      tp.photo.attach(fp.photo.blob)
    end

    fp.tax_rates.each do |ftr|
      tp.product_tax_rates.find_or_initialize_by(tax_rate: tm.tax_rates.find_by!(label: ftr.label))
    end
  end
end
zspencer commented 11 months ago

Sat with April as she onboarded Cafe Gabriela today! Noticed:

daltonrpruitt commented 11 months ago

@zspencer

This website seems to be not accessible right now, just in case we weren't aware.

anaulin commented 11 months ago

Good catch. It looks like only Crumble & Whisk is currently publicly listed on https://marketplace.piikup.com/. Not sure if that's intended or not. @zspencer do you know? would it make sense to check in with April to make sure she's aware?

zspencer commented 11 months ago

Hey April,

We noticed that Cafe Gabriela is listed on your main website it's not on https://marketplace.piikup.com/ anymore; is there anything you need from us to support their launch?

We also noticed that while Crumble & Whisk is listed on the marketplace, it is not listed or linked to from your main website. Is there anything you need from us to start taking orders?

We're still plugging away at polish and what not; at a bit of a reduced pace from the harder push over the last quarter. Our current priorities are:

If you have suggestions for where else to invest our time; we're all ears!

  • Zee

Just sent the following email! Good catch @daltonrpruitt / @anaulin !

zspencer commented 10 months ago

Call w/April as she demoed to Mandela

  1. Taxes are held by Piikup, and then Piikup pays the appropriate government agencies - https://github.com/zinc-collective/convene/issues/1613
  2. SNAP is a big part of Mandela https://github.com/zinc-collective/convene/issues/1238
  3. Focus is on Hot-Food; Catering (> 10 Items) needs 48 hours notice; otherwise same day is fine. See: https://www.mandelagrocery.coop/order-details

Right now, they get emails to a shared email address; so order notifications should be straightforward.

zspencer commented 10 months ago

Had a great bit of feedback from April! Linked here in the Convene Support Group: https://groups.google.com/a/zinc.coop/g/convene-support/c/G6Iv1kx81eA

My Response:

This is great! I'm including the Convene Support email to loop in the folks working on the Piikup Marketplace.

Re: Customer Facing Info - I think I need more context for what this is supposed to mean. Let's talk a bit Friday?

Re: Delivery Windows - We had a great discussion about this today! We've got some good short-term next steps that should help, and Kelly is going to write up some thoughts for to organize that work-flow and support your wider set of constraints.

Re: Order Notifications:

If you had to pick between the two, presuming SMS is something we could probably take care of in a month or so; and Square is something that would take about 3 months; which would you prefer?

My instincts are Order notifications to Phone will be better for short-term getting people onboard; but the Square side will work better for your clients.... We'll talk more on Friday!

Re: Tax - I think what you are asking for is you want the Order to show the Tax per Line-Item, rather than the full Tax amount. Is that correct? If so, that makes a lot of sense. I've added it to our work tracker: https://github.com/zinc-collective/convene/issues/1655

zspencer commented 8 months ago

Originally posted on https://github.com/zinc-collective/convene/issues/1500#issuecomment-1690834894

Recap from @rosschapman's 8/15/23 ride-along with Piikup:

Firstly, it should be noted that it was atypical for April to be driving the cargo truck. Normally she would be running dispatch from home/office. I'd like to first thank her and the Piikup team for accommodating us! April displayed a heroic effort in multi-tasking driving, executing a pickup route with multilpe, talking to me and keeping me informed along the way, continuing to manage dispatch, and handling other impromptu business issues during the ride-along.

We spent nearly 2 hours together and drove a somewhat typical route:

  1. I was picked up at Mandela Grocery a little after 10am. Piikup has begun a partnership with them to deliver prepared, hot meals, and also list them on their Convene marketplace instance. April introduced me to the employees onsite, including the chef. April is excited for this partnership and believes it will drive a lot new business. A note about their handling of "hot" food: they will stick to currently established delivery window guarantees.
  2. We hopped back in the truck and headed to Gabriela's in downtown Oakland, made a brief stop for an intro (although April did physically ask if there were any new deliveries while we were there). Next we proceeded to the Alameda farmers market for a pickup. Then delivered to Omni Commons. Then attempted (failed, see below) to pickup empty boxes at the ANV farm -- no one was there. Finally I was dropped off at Mandela Grocery.
  3. Along the way April explained and demonstrated how they use OnFleet.
    • When you start a delivery in the driver app, a text message with a tracking link and ETA is sent to the business. However, OnFleet is not very sophisticated and poses challenges for Piikup's drivers. As April explained:
      • What if the driver needs to make a course correction after starting the delivery. For example, they forgot something. Once the delivery has begun, OnFleet's tooling does not provide anyway to pause, stop, or mark the delivery as delayed and send an update to the customer.
    • Another challenge for April is that OnFleet's dispatch service is only accessible through a web browser. This makes "toggling" between dispatch and driver "views" on a phone cumbersome while driving. Keep in mind drivers are likely using cell phones and not tablets. Also the Piikup fleet of cargo vehicles are not necessarily equipped with (or well designed for) dashboard attachments for phones.
    • Delivery pickups and dispatching/routing are all manually coordinated by April. OnFleet does not provide any smart, suggestive matching, etc...
    • OPPORTUNITY: April expressed a desire for new deliveries to show up in a queue in OnFleet's web view of in-progress deliveries. Currently new deliveries must be entered manually, one at a time. She thinks that OnFleet's capabilities may allow for new deliveries to be "sent into" a queue/category that sits above the list of in-progress deliveries. This ability would add some automation and save time entering these manually.
  4. April also covered the types of deliveries they make:
    • Single order deliveries (B2C), catering (B2C), and wholesale (B2B). ANV Farm is a good example of a B2B vendor.
    • The B2C deliveries come through the Convene marketplace
    • However, the B2B of the business is coordinated and managed separately and idiosyncratically
      • For Piikup, wholesale business is effectively recurring deliveries. I observed April use the terms "wholesale" and "recurring" interchangeably.
      • Although wholesale deliveries are recurring, managing intake for them is laborious. Every order, even if the same as last week, must be entered into a shared Google spreadsheet by the vendor. From what I can remember this spreadsheet is transparent, and accessible by all wholesale vendors.
      • April noted this manual process is prone to failure:
        1. Monitoring new orders requires human vigilance. Inevitably human error occurs -- which April accepts, wisely, as a given -- and a once in a while a weekly might be missed when designing the next routing schedule
        2. April says they mitigate this issue by planning for a quick stop every week, regardless of whether there is definitely an order that day. She'd rather show up mistakenly, then miss a delivery. But she admits this is wasteful.
        3. I wonder if it's possible for a vendor to literally overwrite another vendor's order?
        4. OPPORTUNITY (including notes from 8/23/23 ensemble): Could Convene have a Gizmo that support a simple table with notifications (@anaulin's idea). @zspencer noted we should understand the cost of shifting from the spreadsheet system to a new intake system on Convene. The question might become, then, can we bridge the gap between a Google Sheet and Convene so that we could still support timely notifications of new or updated recurring/wholesale orders. Is there even a lighter approach, where Zinc might build notifications into Google Sheets directly -- either programmatically, with extensions, etc...
  5. We also experienced a common frustration for Piikup drivers when attempting to pickup the previous weeks empty boxes at ANV:
    • No one was present at ANV farm when we arrived for pickup
    • What's more, April wasn't able to reach anyone directly (I can't quite remember if it was because she doesn't have a direct contact by phone, or if no one picked up either directly or on a general line -- possibly both)
    • April noted that wasting even a few minutes can be a huge disruption/waste for effective dispatching
    • I gathered this wasn't about blame so much as a troubling inconvenience that must have a solution, somehow
    • OPPORTUNITY: It seems a shame that in this day in age a group of business partners that need to coordinate regular pickup/delivery do not have an effective, standardized way to communicate. Could a technology partner help here? In this case, all April needed to know was weather anyone would be at the farm when she arrived.
rosschapman commented 8 months ago

Sent out two updates to April tonight regarding ride-along follow-up and square work update respectively. CC'd the shared Convene support email address, so everyone should see the responses hopefully. Let's see what she says!

Hi April,

Zinc would like to sincerely thank you again for the opportunity to ride along in the van for a whirlwind tour of Piikup’s daily operating procedures. It was really insightful, and I truly appreciate your patience and skill to walk me through the technicalities in detail while we completed real deliveries!

A couple weeks ago I had a chance to present my notes to the rest of the Zinc team at our weekly meeting. We had a lively discussion, as the team was keen to better understand how Zinc can continue helping you overcome technological problems like creating email notifications for your recurring wholesale intake sheets, or advance your business through more sophisticated technological integration with Onfleet.

I found a quick video tutorial on setting up email notifications for Google sheets anytime someone makes a change: https://www.youtube.com/watch?v=h3dASEhZFiI. Would this help you avoid missing new wholesale orders? I could also sit with you on a Zoom call and help you set this up.

I'd like to jump on a call to talk about your tech priorities and see how can we be most helpful to you in the short-term, while we wait for Marketplace business to ramp up. For example, you brought up that having an “unassigned” task queue in Onfleet for incoming deliveries might be useful. What’s a good time in the next couple weeks for you to jump on a call (Zoom preferably if we are going to work on the spreadsheet)? I’m generally available late morning to late afternoon weekdays.

Look forward to connecting again soon!

Warmly, Ross

And...

Hi April,

We’ve recently completed the initial iteration of a Square Order Notifications integration for Convene Marketplaces. We’re looking forward to trialing this with you! Let me give you a brief explanation of how it currently works.

But first, it’s important to understand that Square does not support creation of order notifications from external software directly. This means Convene cannot send an email “notification” or sms per se to a vendor when a purchase was made on Convene. However, Square does allow us to create entirely new orders and transmit them to the vendor’s Square account automatically. These new orders will show up in their Square Dashboard, and also be associated with the correct payment amount.

To test this, first we would have to manually add Square account information to our database for a vendor’s marketplace listing (what we call a “Marketplace Gizmo”). Then every time a customer places an order for that vendor, Convene will automatically create a new order in that vendor’s Square account. That’s it!

To make sure this works as expected, we'd like to test this with you and Crumble & Whisk or another one of your vendors, if y'all are available for that. We would need to get on a video call to set it up and test/demo the functionality. What’s a good time for you in the next couple weeks? I’m generally available late morning to late afternoon weekdays.

Look forward to connecting again soon!

Warmly, Ross

zspencer commented 8 months ago

Hey April!

2 things:

  1. There was a bug preventing you from attaching Stripe accounts until just today; apologies!
  2. I've completed a redesign pass on the shopper's buying products flow; which should make things a little bit easier to step through and more clear about when things are arriving!

Attached is a video walkthrough: <snip, sincei t has my home address> Next I'm going to start working on packaging up the Marketplace as an App that can be downloaded on the Google Play and Apple App Store; unless you have feedback from your clients or your operational staff about rough edges that are preventing you from directing orders to the caterers in your group.

  • Zee
rosschapman commented 8 months ago

We got an update from April regarding Onfleet in response to the first message I sent last week (see https://github.com/zinc-collective/convene/issues/832#issuecomment-1718500018).

Bad news / Good news. Piikup is moving away from ONfleet effective September 30th due to their 50% price increase and no non-profit discounts. Our rate will increase from $279 to $500 per month with Onfleet.

We are currently looking into Ono....the need to change is frustrating and a huge time suck as we've been with Onfleet for over two years.

One interesting thing about ONO that April mentioned (briefly, in passing) at the lake sit last Friday is that ONO does seem to expose some kind of end-user product listing and ordering capability. While she seemed fuzzy about it, she hinted this may have some redundant capability with Convene Marketplace. Let's keep an eye on this.

Assuming this is Ono: https://onoapp.co.

zspencer commented 3 months ago

Chatted with April today:

  1. One of the biggest challenges is shopper-acquisition and trust. We've had zero purchases from the Piikup Marketplace outside of our buys, and while we've gotten the interface better it's hard to compete with the pricing offered through undercutting & cost-shifting (Anecdata: Good 2 Eat Cafe on Alice + 14th charges $12/sandwhich if you order online, and $10/sandwhich if you call over the phone or walk in.)
  2. There's a bug https://github.com/zinc-collective/convene/issues/2198
  3. Product Descriptions are wanting some polish, in particular allowing line breaks and bullets. - https://github.com/zinc-collective/convene/issues/2197
rosschapman commented 3 months ago

@zspencer thanks for the bug report (#2198). I'll take a look after the weekend.