Tumgik
#a company... is it the same folks who are managing our experience w DR??
thesnowflake18 · 1 year
Text
Tumblr media
Help what does this mEAN?!?!
29 notes · View notes
Obtain the closest Wells Fargo Bank in Portland
Find The closest Wells Fargo Bank and even ATM Locations in Portland, OR. Get Wells Fargo locations in addition to hours, expert services and driving a vehicle directions.
Wells Fargo Bank 97214
Wells Fargo Bank, 310 SE Taylor St Portland, OR 97214
Reviews
Comes to an end afternoon before the Toil Day holiday and just one teller to help- absurd wait- very aggravating! Clearly may care concerning customer service.
Reviews
I had the fee in the credit card My partner and i was trying to cancel. I referred to as customer program with 10/31, spoke to a extremely kinds individual who put in my dispute (#14854307) and stated I would have this funds launched within forty eight hours, We produce an email confirming that furthermore. This interest charges were released in 48 hours but not necessarily the charged. I known as again on 11/7 on 4: 10 spoke to a new man, provided proof my own request to the firm in order to cancel my demand. Described that again this budget in dispute were not introduced. This individual claimed that they ended up returned back to my abolished cc number in problem and that the funds would be back with my new card in 48 hours. Again most of these chats are recorded. Since 7: 45 this morning hours the money had even now not necessarily been credited. My spouse and i directed wells fargo a good e-mail, no response. My partner and i called on my break in which the call up ended at 9: 19. The first woman that will I speech to said that she found that will the request was submitted to have the credit rating transferred from terminated credit score card to the in service one, but that this will take 5-10 business enterprise days and nights to have the credit applied not really twenty four hours. I inquired her exactly why I was first lied to instead of provided accurate information on the decision on 11/7 in which often they already have the recording often the I was lied for you to and not really chosen appropriate information, She am not able to response my question, Specialists in order to communicate to a supervisor. My spouse and i spoke to Claudette who also again said of which this transfer would definitely not take place with regard to five to ten enterprise days, never ever after responding to the inconvience that was causing me or perhaps appoligizing for the problem that will caused the money to be transferred to a good cc number they will terminated or the other miscalculation they made in which will I has been certainly not presented accurate data. She performed not care. Definitely not solely does Wells Fargo generate false accounts, which can be fraudulence, but they outright along recorded calls lie for their customers. Never ever perform business enterprise with this bank. As soon as it is resolved I will always be going anywhere else!!!
Reviews
Super tiny location. That they only acquired one company when we went. Workers was friendly. Simply no restroom. Free 30 minutes airport parking out front.
Wells Fargo Bank in Portland
Wells Fargo Bank, 635 SW 6th Ave Portland, OR 97204
Reviews
I am the treasurer of the small non-profit group. Charitable contributions and book sales can be found in at random instances. The projects like educational shows, books etc can certainly take some sort of lot involving money. have been working with wells forgo for years however the costs incurred by Wells Fargo will be draining our balances together with reducing what we can do. $10/month for checking plus another $6/ month for savings. $192 a year- even though that amount seem to be like much it decreased what we are capable of doing. Bore holes Fargo wasn't willing to stop changing we closed both accounts and planning to a further bank that isn't asking fees.
Reviews
Are typically in a few times with regard to questions and am often still left happy in addition to secure together with my business with Water wells Fargo. Perfect people worki there way too, wish I actually could remember brands.
Reviews
My broker was so patient together with valuable setting up my trading accounts. Wells Fargo is some sort of huge loan provider but at this point at this place not any one will fall throughout the cracks. Feels nice to be respected and taken care of. Cheers Donald!
People also viewed:
Wells Fargo Bank, 5555 New Northside Dr, Atlanta, GA 30328
Wells Fargo Bank in Santa Monica
Wells Fargo Bank, 3181 SE Federal Hwy, Stuart, FL 34994
Wells Fargo Bank Hours
Wells Fargo Bank, 110 W Vulcan St, Brenham, TX 77833
Wells Fargo in Portland, OR 97201
Wells Fargo Bank, 1300 SW 5th Ave Portland, OR 97201
Reviews
Stopped here after job to downpayment my massive bonus offer check on an account I've had to get many years. I was admonished the fact that because it was soon after 4 on Wednesday that will the funds would definitely not be available until finally Friday. I say admonished for the reason that vibe I obtained seemed to imply that I has been some kind of felonious hobo trying to pull a quick one. I experienced no purpose of yanking the money outside correct after I put it in. Nevertheless , in this particular day time and era, We think it's total B. Ersus. that the cash isn't very available right away. Hell, whenever I employ my debit card, I actually can check my balance online five minutes later on and find out the transaction. Will Wells Fargo use the particular Pony Exhibit to fetch the cash through the banking companies that cut us inspections? Otherwise, I don't know precisely why those orders acquire times when other individuals get mere seconds. Made us grouchy.
Evaluations
Awful customer support, all people viewed like they will completely hated their jobs... often the manager(Sara? ) had been extremely impolite and less than professional. This only smiling face taking in the room seemed to be from the brokerage.
Testimonials
The customer services is here is really lacking. Let's be sincere. It merely requires plain sucks. My spouse and i was informed I'd include to sit down with an account supervisor to modify some thing minor on my own account. My spouse and i went inside on a good Friday plus no one surely could accomplish it so they told us they'd call myself very first thing on Wednesday to set up a great appnt. They even verified my own phone number. Some sort of couple of weeks later and I still don't have heard from these people. My spouse and i was initially just through there now, your bank was initially empty, I could observe four account managers at their desks, only a single which was helping a customer, together with We has been told someone would be perfect with us. Fifteen moments later, still zero acknowledgment, so My spouse and i received upwards and left. I've truly disliked having WF because my bank for quite a good while these days, and this particular has been the final hay. Give thanks to you to get ultimately pushing me to seek out a new bank/credit association to be able to transfer all of our accounts to!! I are going to be with a new standard bank by following full week. Cheers again!
Wells Fargo Bank Portland, OR
Wells Fargo Bank, 1405 Lloyd Ctr Portland, OR 97232
Reviews
I really like my local community, but you can find no financial institutions close to my home. The particular only ATM's within taking walks distance are those questionable convenient kiosks that charge a couple of bucks. Those CREDIT bandits are withdraw just, naturally , so any other banking orders My spouse and i have to accomplish need some sort of special trip in the car. That makes me grouchy. Gratefully, the people at this kind of Wells Fargo diverge together with generally very pleasant. Now i am welcome with a enjoyable hello and some cheery chit-chat. Nice folks.
Reviews
The customer service here is below doble, and Wells Fargo inside general has been leading to us issues. The on-line accounts encounter issues as soon as a good calendar month, and I've experienced anatomical problems having the ATM at this area. When calling and acquiring the tellers browsing on me through the windowpane, they just continued to consume their food and ended up hesitant to help even nevertheless they could observe everyone on the phone dialling with the window while his or her cell phone was ringing in addition to they were only 12-15 minutes from beginning.
Reviews
I traveling frequently and love to become ready to stop simply by limbs as needed. My spouse and i ended into this branch and was treated now kindly. Everyone had some sort of smile and you could say to many people come in often. I love seeing company's have a compact town feel, especially around a hustle and bustle town.
Reviews
Seems going to be able to this branch for a long time mainly because my possibilities will be confined. I steer clear of coming into this branch on just about all prices. Twice now, a couple months apart, the same teller offers incorrectly applied a pair number of dollar payment in my credit card. Give thanks lord the pin number pad questions the customer to verify in advance of processing! One card I use usually for big purchases and the additional merely actually has ten to twenty dollars charged to it. Currently, I possibly said, "payment on the Cash Smart to Visa please" and she EVEN NOW put it on the particular additional card. The credit card that is presently PAID OFF. Also, a few yrs ago, a banker almost closed my accounts I actually share with the mother while i was at this time there with my own ex-fiancé for you to close our mutual balances. No one seems for you to spend any attention to be able to the details in the dealings they are processing. Now i'm so glad My partner and i changed the majority of my banking must a Credit rating Union.
Reviews
I actually had a good negative opening experience with this loan provider. I should have identified going for walks in, when I actually was attacked by some sort of fellow purchaser that it was planning downhill. Not of which My spouse and i hold this institution accountable for that. But I went in to order a few Canadian currency like their web page specifically clarifies their normal operating time with an cosmopolitan teller. I go in plus stand in line through the given times merely to learn the fact that "international teller" has in reality gone home and Items need to return another day. I used to be then told to be able to be sure into the future in during the morning when to ensure what We wanted was obtainable. My spouse and i understand the currency is definitely "first come, initially served" but upon contacting before my next take a look at, My spouse and i was told that had been not necessary. Consistency in connection in particular with retail can be pretty significant if a person ask me.
Wells Fargo Bank 97209
Wells Fargo Bank, 845 NW 11th Ave Portland, OR 97209
Reviews
We have only had excellent experiences with this subset of Wells Fargo. Whenever I go in I am approached the instant I walk in and certainly not possess to wait more compared to a time to be helped. I have caused the brokers (John plus Mitch) on this side branch numerous times to deal with supervision issues about both business and private accounts and have always was feeling well taken care associated with and all problems possess been recently quickly solved. Kudos!
Reviews
It takes some sort of lot for me to assessment a bank. I click on over for my do the job dealings like expense record take a look at cashing etc. I could utilize the ATM but I get in every moment. The people are why. Super nice and good. I think they recognize myself. Probably. l certainly not but you get that will perception. Furthermore they constantly have straps connected with $2s and I love that. Parking would be testing nevertheless I walk together with cycle.
Reviews
Tom as well as manager Michael will be amazing. I used to work with regard to Wells Fargo and may honestly say I've never ever viewed such amazing customer care around my years of financial. Thank you for resolving my troubles in addition to being so eager to support.
Critiques
Ok which means this bank can be HELLA outside of my way for literally every thing My partner and i need and there are usually nearer locations I could use yet I may not go at any place although here because I really like these kind of people. This staff is really freaking sweet and friendly and My spouse and i feel want they may my personal good friends hoping for us to do well. The bankers are really knowledgeable trying to help me in just about any way they can. They're very invested in the life and it is very reassuring! Mike with this branch is the nicest man together with is generally there as i need him. Highly, REALLY highly recommend this specific office. Is actually great. And Wells Fargo as a financial institution is just great. Quick to get rid connected with fees along with the app is usually hella straightforward to navigate. I'm a enormous fan so far!
Reviews
This kind of has not necessarily been my usual branch to accomplish business throughout, but I've had excellent service in this article every time My spouse and i occur in. Most recently, I actually had a fairly obnoxious transaction that essential several verifications, and was assisted proactively by Claudia here. Cheers for your follow-up in addition to working with me!
1 note · View note
Text
Contractor_Loans_An_Experts_Guide_To_Financing_Your_Business
This Podcast Is Episode Number 0297, And It Will Be About Contractor Loans: An Expert's Guide On How To Finance Your Business
Running a contractor operation takes a pretty special individual, especially since there are going to be so many different moving parts with each and every project your contracting outfit takes on.
Hammering out bids, winning jobs, managing a crew, knocking out material lists and – most importantly – making sure that you stay on top of your cash flow are all big pieces of the contracting business puzzle. Because of the size and scale of these projects (even the smallest of contracting jobs), things get pretty expensive, and the odds are pretty good you’re going to need to tap into business loans every now and again.
But contractors, particularly those just getting started in the business with their own outfit, usually find unsecured business loans to be a headache and hassle to get a hold of. These kinds of loans usually aren’t given out to folks without a track record under their belts. And on top of that these kinds of loans usually don’t come with the kind of financing contractors need to get projects from start to finish.
Here are a couple of options you want to consider when you’re looking to get financing for your business.
Consider traditional bank/credit union and SBA loans specifically for contractors
Traditional banks, credit unions, and the Small Business Administration all offer specific loan packages for the contracting industry that you may be able to take full advantage of. You’ll obviously have to meet with local bank representatives (or fill out the government paperwork with the SBA) to figure out the specifics of these offers, and it’s not a bad idea to go to a bank that you have a bit of a history with as a “retail” customer.
At the same time, these kinds of loans can take a long time to go through the approval process – particularly if you’re asking for hundreds of thousands of dollars that you might need to knock out a couple of construction projects you’re looking to undertake.
Most suppliers will offer some kind of leasing and financing package for local contractors
Thankfully, the overwhelming majority of suppliers in your local area are likely to offer some kind of leasing and financing package for contractors that do – or anticipate – a lot of business with them.
You’ll need to create an account with your local hardware stores, your local building supply stores, and your local home department stores to take advantage of these financing packages. On top of that, you want to make sure that you read the fine print of each agreement, as they are almost always going to have unique terms from one another, and you’ll want to understand every detail of each of these financial packages before you sign on the dotted line.
Major chains (like Home Depot and Lowe’s, for example) also offer their own financing package for professional contractors that are well worth looking into.
How to make working capital loans work for your contracting outfit?
At the end of the day, you might want to go the more nontraditional route of getting financing for your contracting outfit and start looking into working capital loans from these kinds of lenders.
Working capital loans essentially keep you flush with all the funding you need to keep your cash flow positive, helping you secure materials, payout your payroll, and cover any minor blips in the road along the way until the profits from your jobs start coming in.
Again, you’ll need to look into the specifics of each working capital offer before you decide to take the plunge. Some nontraditional lending packages will be more advantageous to leverage compared to others, and you want to make sure that you are always making a smart move with this kind of nontraditional financing rather than saddling yourself with a financial burden later down the line for a short-term fix.
All in all, you’ll find that there are plenty of opportunities out there for you to get your hands on the financing you need to not only run your contracting outfit but to also grow and expand your base of operations. It’s never a bad idea to shoot for being able to “self-fund” your business right from the profits of your job, but that’s only ever going to be possible after using years of taking advantage of the kinds of financing packages we highlighted above.
  About The Author:
Chad Otar  is the CEO at Excel Capital Management, a pioneer in the Fintech and alternative lending space. He has assisted thousands of business owners to receive funding over the last 5 years and is focused on helping one small business at a time achieve access to capital.
  In Conclusion:
Helping Contractors around the world is one of the reasons we added the FastEasyAccountingStore.com Follow our blogs, listen to Contractor Success M.A.P. Podcast. We Appreciate Our Visitors, Listeners, and Subscribers. – Thank You!!
Please feel free to download all the Free Forms and Resources that you find useful for your business.  
The Information Shown Below Is From Fast Easy Accounting
OUTSOURCED ACCOUNTING FOR  THE BUSY CONTRACTOR IN A MOBILE ENVIRONMENT
Download The Contractors APP Now!
Access code: FEAHEROS
The QR Code Below Will Go
Apple Or Android Store
Whichever One
You Need
Simply scan the QR code below or search for ‘MyAccountants’ in the App Store and enter the Access code: FEAHEROS to utilize the powerful App features and capabilities, and benefit from having our Construction Accounting App at your fingertips, 24/7.
Access code: FEAHEROS
Or click to download the Contractors APP now from the App or Android store
     Click here to download the App on iOS:
Click here to download the App on Android:
About The Author:
  Randal DeHart, PMP, QPA is the co-founder of Business Consulting And Accounting in Lynnwood Washington. He is the leading expert in outsourced construction bookkeeping and accounting services for small construction companies across the USA. He is experienced as a Contractor, Project Management Professional, Construction Accountant, Intuit ProAdvisor, QuickBooks For Contractors Expert and Xero Accounting Specialist. This combination of experience and skill sets provides a unique perspective which allows him to see the world through the eyes of a contractor, Project Manager, Accountant, and construction accountant. This quadruple understanding is what sets him apart from other Intuit ProAdvisors and Xero accountants to the benefit of all of the construction contractors he serves across the USA. Visit http://www.fasteasyaccounting.com/randal-dehart/ to learn more.
Our Co-Founder Randal DeHart - Is a Certified PMP (Project Management Professional) with several years of construction project management experience. His expertise is construction accounting systems engineering and process development. His exhaustive study of several leading experts including the work of Dr. W. Edward Deming, Michael Gerber, Walter A. Shewhart, James Lewis and dozens of others was the foundation upon which our Construction Bookkeeping System is based and continues to evolve and improve. Check out our Contractor Success Map Podcast on iTunes and Follow Randal on Google+ 
We are here to Help “A Little or A Lot” depending on your needs.
I trust this podcast helps you understand that outsourcing your contractor's bookkeeping services to us is about more than just “doing the bookkeeping”; it is about taking a holistic approach to your entire construction company and helping support you as a contractor and as a person.
We Remove Contractor's Unique Paperwork Frustrations
We understand the good, bad and the ugly about owning and operating construction companies because we have had several of them and we sincerely care about you and your construction company!
That is all I have for now, and if you have listened to this far please do me the honor of commenting and rating the Podcast  www.FastEasyAccounting.com/podcast Tell me what you liked, did not like, tell it as you see it because your feedback is crucial and I thank you in advance.
You Deserve To Be Wealthy Because You Bring Value To Other People's Lives!
I trust this will be of value to you and your feedback is always welcome at www.FastEasyAccounting.com/podcast
This Is One more example of how Fast Easy Accounting is helping construction company owners across the USA including Alaska and Hawaii put more money in the bank to operate and grow your construction company. Construction accounting is not rocket science; it is a lot harder than that, and a lot more valuable to construction contractors like you so stop missing out and call Sharie 206-361-3950 or email [email protected]
Contractor Bookkeeping Done For You!
Thinking About Outsourcing Your Contractors Bookkeeping Services?
Click On The Link Below:
www.FastEasyAccounting.com/hs
This guide will help you learn what to look for in outsourced construction accounting.
Need Help Now?
Call Sharie 206-361-3950
Thank you very much, and I hope you understand we do care about you and all contractors regardless of whether or not you ever hire our services. Bye for now until our next episode here on the Contractors Success MAP Podcast.
  Our Workflow Removes Your Paperwork Frustrations
For Contractors Who Prefer
To Do Your Bookkeeping
Fast Easy Accounting Do-It-Yourself
Construction Accounting Store Is Open
Most Contractors Setup QuickBooks Or Xero Online Accounting Using:
#1 EZ Step Interview inside QuickBooks Setup #2 Asked Their Tax Accountant To Setup QuickBooks #3 They Attended A How To Setup QuickBooks Class Or Seminar
And QuickBooks Does Not Work The Way They Want It Too!
The Answer:
#1 Click Here To Buy An Entire QuickBooks Setup For Your Specific Contracting Company
#2 Click Here To Buy Just The Chart Of Accounts For Your Specific Contracting Company
Short List Of Construction Contractors We Serve
Asphalt ContractorAsphalt Contractor Brand New ContractorBrand New ContractorBrick And Stone ContractorBrick And Stone ContractorCabinet Installation ContractorCabinet Installation ContractorCarpentry ContractorCarpentry ContractorCarpet And Tile ContractorCarpet And Tile ContractorCommercial Tenant Improvement ContractorCommercial Tenant Improvement ContractorConcrete ContractorConcrete ContractorConstruction EmployeesConstruction EmployeesConstruction ManagerConstruction ManagerConstruction Support SpecialistConstruction Support SpecialistCustom Deck ContractorCustom Deck ContractorCustom Home BuilderCustom Home BuilderDemolition ContractorDemolition ContractorDrywall ContractorDrywall ContractorElectrical ContractorElectrical ContractorEmerging ContractorEmerging ContractorExcavation ContractorExcavation ContractorFinish Millwork ContractorFinish Millwork ContractorFlipper House ContractorFlipper House ContractorFlooring ContractorFlooring ContractorFoundation ContractorFoundation ContractorFraming ContractorFraming ContractorGeneral ContractorGeneral ContractorGlass Installation ContractorGlass Installation ContractorGutter ContractorGutter ContractorHandyman ContractorHandyman ContractorHot Tub ContractorHot Tub ContractorHVAC ContractorHVAC ContractorInsulation ContractorInsulation ContractorInterior Designer ContractorInterior Designer ContractorLand Development ContractorLand Development ContractorLandscape ContractorLandscape ContractorLawn And Yard Maintenance ContractorLawn And Yard Maintenance ContractorMasonry ContractorMasonry ContractorMold Remediation ContractorMold Remediation ContractorMoss Removal ContractorMoss Removal ContractorPainting ContractorPainting ContractorPlaster ContractorPlaster ContractorPlaster And Stucco ContractorPlaster And Stucco ContractorPlumbing ContractorPlumbing ContractorPressure Washing ContractorPressure Washing ContractorRemodel ContractorRemodel ContractorRenovation ContractorRenovation ContractorRestoration ContractorRestoration ContractorRoofing ContractorRoofing ContractorSiding ContractorSiding ContractorSpec Home BuilderSpec Home BuilderSpecialty ContractorSpecialty ContractorStone Mason ContractorStone Mason ContractorStucco ContractorStucco ContractorSubcontractorSubcontractorSwimming Pool ContractorSwimming Pool ContractorSwimming Pool And Hot Tub ContractorSwimming Pool And Hot Tub ContractorTile And Carpet ContractorTile And Carpet ContractorTrade ContractorTrade ContractorTree ContractorTree ContractorUnderground ContractorUnderground ContractorUtility ContractorUtility ContractorWaterproofing ContractorWaterproofing ContractorWindow ContractorWindow Contractor
Additional QuickBooks Templates, Resources, And Services
QuickBooks Set Up TemplatesSolopreneurQuickBooks Chart Of AccountsFree StuffQuickBooks Item Lists TemplatesConsulting
We Serve Over 100 Types Of Contractors So If Your Type Of Company Is Not Listed
Please Do Not Be Concerned Because If You Are A Contractor
There Is A Good Chance We Can Help You!
Call Now: 206-361-3950
  Additional QuickBooks Templates, Resources, And Services
QuickBooks Set Up Templates   Solopreneur
QuickBooks Chart Of Accounts     Free Stuff
QuickBooks Item Lists Templates     Consulting
  We Serve Over 100 Types Of Contractors So If Your Type Of Company Is Not Listed
Please Do Not Be Concerned Because If You Are A Contractor
There Is A Good Chance We Can Help You!
Call Now: 206-361-3950
If you are a blogger, who writes about construction we would like to hear from you.
https://www.fasteasyaccounting.com/guestblogger
  Check out this episode about Contractors Marketing - Accounting - Production (M.A.P.)!
0 notes
mbaljeetsingh · 6 years
Text
A Custom WordPress Dashboard with MongoDB Atlas, Microsoft Azure, & Serverless Functions!
TL;DR I’m building a custom WordPress dashboard for an enterprise client which is powered by React.js on top of Node.js with MongoDB Atlas as the database.
This dashboard uses several Microsoft Azure services, e.g., Cognitive Services, Azure App Services, and especially serverless ⚡ Azure Functions. In this post, you’ll learn how to build a small module from it and the reason behind my choice of stack, apps, and products.
🚀 One of my enterprise clients who owns a huge networking and media company has a large-scale WordPress site set up. He recently consulted me about the possibility of building a custom WordPress dashboard (based on the WordPress REST API) — to help him make intelligent business decisions via Machine Learning and Artificial Intelligence.
🤔 With JavaScript eating up the world and WordPress adapting to the move by creating the Gutenberg project — I thought of an architecture/stack where WordPress would be our content layer, a familiar battle-tested environment that does its job well with a custom dashboard that’s built with JavaScript.
😲 When you’re tasked to build a modern JavaScript application, you find yourself in a mix of different frameworks, tools, and dev-workflows. The JavaScript eco-system has grown a lot over the last couple of years. We have many many good options available today.
🎟 So, after researching my options for a bit — I opted to use React.js on top of Node.js to start building the custom WordPress dashboard. While the project is in its ideation phase at the moment, I think it’s important that I share some of our goals here to define context behind my choice of the stack.
Custom WordPress Dashboard Goals
Imagine you own a large networking company where over 500 hotels (in three different countries) use your services to power their conference halls, IT meetings, and online property management like the sites and blogs. That’s what my client does.
Most of this is powered by a huge multi-site WordPress instance that manages everything for the hotels, websites, online booking, registrations, events, tickets, reviews, and comments. There’re also other systems running different software which are able to produce content via REST API.
We’ve set out to create a custom WordPress dashboard with many goals in mind but I’m listing a few of them which are related to this particular article. Take a look at what I have built so far, it’s all based on serverless Azure functions — which are pretty awesome.
👀 High-level Data Reporting
The custom dashboard will report all the high-level data, e.g. things like live sales happening throughout my client’s portfolio (500+ hotels), entity/time based and date based breakdowns.
And that how each of his franchise performing on a daily, weekly, monthly basis. All of this data is being fed to MongoDB Atlas. More on that later.
⚡Serverless Automation
Most of the modules are to built upon serverless architecture — which in this case provides huge benefits. All the automation is always running and the cost is paid as you go i.e. pay for what you use.
An initial rough estimate puts this solution 34% more economical than having a server VM running all the time. We are using Azure Functions for this serverless automation.
🔥 IoT (Internet of Things) Hub
There are about ~200 IT managers working for my client who have IoT enabled devices that feed data into several online projects. This custom dashboard also includes that data for making better decisions and connecting the whole registration, management, maintenance team’s hub into a single place.
As you might have already guessed, this project makes use of IoT Hub from Microsoft Azure to connect, monitor, and manage all of the IoT assets.
🤖 Machine Learning and Artificial Intelligence
We’re using a lot of different services from Microsoft Azure for the sake of making this dashboard artificially intelligent by Machine Learning.
There’s a huge dataset that is fed to the ML Studio which later helps us predict different decisions like space management, low registrations trends for IT events, and questions like why and when these things happen.
While the Machine learning part is beyond the scope of this article, I still plan to touch the base with some of the awesome Artificial intelligence I’ve been able to cook in via Azure’s Cognitive Services.
🕰 Live & Real Time
One of the most important aspects of this custom dashboard is that it’s live and real time. Which means, I need a managed database that can cope with this amount of data and still stay highly available.
But at the same time, it’s for the management purposes and doesn’t need to have any impact on the WordPress sites. That is a crucial system design decision for this dashboard.
By that what I mean is we can do all sorts of experiments with this custom dashboard but it shouldn’t have any impact on the database/servers which are running the multi-site WordPress instance.
MongoDB & MongoDB Atlas
For this custom WordPress dashboard, I am using MongoDB Atlas as a DBaaS (Database as a Service). And I couldn’t be happier. When I first shared that I’ll be using MongoDB, many developers had concerns. Most of the questions were about why add another layer of complexity by adding yet another database to the mix. Why not use the WordPress database as it is. To answer these questions and more I have prepared a list of reasons to why I am using MongoDB Atlas.
♨ Dislike for RDBMS
I personally dislike relational databases. Most of the times, for me they get in the way of building applications. I have to completely get out of the app I am building, think about my database in future and design a good schema which always ends up in a bad exercise for my dev-workflow. It’s counter-intuitive at best — at least for me, it is.
💸 HDD Is Cheap | CPU/RAM Is Not
Old databases were mostly designed in a way to save disk space among other things. This led to a plethora of problems like normalization, indexing, and made sharding, auto-scaling, and replication harder.
Nowadays, disk space is dirt-cheap. On the other hand, CPU/RAM is not and your sys-admin cost can skyrocket very quickly if you end up with a bad choice here.
Like you wanted to create a custom dashboard but your system design architect cost you two sys-admins with how he chose to design your system. Similarly, my client wanted a managed solution without having to hire a team of IT/DevOps folks — at least for an experimental custom dashboard.
🍀 MongoDB’s Pro
Schema-less. Flexible schema for-the-win. I don’t have to change anything, my regular app-dev workflow, creating a Node.js based app where I am manipulating with JSON type data, I can just feed that into MongoDB and it just works.
Workflow-consistency. Creates documents the way my custom dashboard is represented. Sales, Videos, Talks, Comments, Reviews, Registrations, etc. all of that have similar data representation on the frontend and the backend — and even in the database. I manage 3rd party data via middleware. This consistency translates to clean code.
Ease of scale-out. It scales reads by using replica sets. Scales writes by using sharding (auto balancing). Just fire up another machine and away you go. Most importantly, instead of vertical scaling via RDBMS, MongoDB lets you scale horizontally with different levels of consistency. That’s a big plus. ➕
Cost. Depends on which RDBMS of course, but MongoDB is free and can run on Linux, ideal for running on cheaper commodity kit.
🍃 Why MongoDB Atlas?
Well, now that I know MongoDB is the right database choice, there are so many different options to host your database. I can self-host on my Linux machine via DigitalOcean, use a cloud provider like AWS/Azure or a choose a DBaaS service specific to MongoDB.
But I want a fast, secure, and managed MongoDB solution that I can easily scale with the growth of the number of modules we attach in this custom WordPress dashboard. That’s MongoDB Atlas.
MongoDB Atlas is a cloud-hosted MongoDB service engineered and run by the same team that builds the database. And guess what, I trust that they follow the best operational practices since they are the ones who’re building MongoDB in the first place.
I want this custom dashboard to be self-managed, serverless, and using MongoDB Atlas saves me from worrying about software patching, backups, and reliable configuration setup for new DB updates. Again a big plus. ➕
Also, the fact that MongoDB Atlas is supported cross-platform as well as cross region and across different cloud providers makes it a much better choice. I think each Cluster comes with two replica sets, ready to scale.
🔋 MongoDB Compass
Now that we are going to work with MongoDB, it’d be great to have a tool through which we can explore our database, view the changes, debug and what not. For this purpose, MongoDB again takes the lead with a product called MongoDB Compass. Take a look.
I suggest that you go ahead and download MongoDB Compass. It’s literally the best tool to visualize your MongoDB database. Here’s a set of features:
Visualize and explore: Take a look at your database, find out how things are looking, and even visualize stuff like maps/coordinates.
Insert, modify, and delete: You can also perform CRUD operations for your DB right from MongoDB compass. Makes testing easier.
Debug and optimize: Finally, analyze your data, debug it and even find out about performance issues right inside a great GUI for your database. This tool is a must-have if you work with MongoDB.
Extensible: And the best part is you can build your own plugins to extend MongoDB Compass. Here’s the documentation on building your own Compass plugins.
Enterprise Flavor: MongoDB Compass comes in a few flavors: Community (Free), and Enterprise (Licensed) — the Enterprise version is the one that lets you visualize DB schema.
✅ Getting Started with MongoDB Atlas
Let’s get started and build a simple module which’s part of the custom WordPress dashboard that I am building. For this module, we are collecting all the sales related data. For that, we need a MongoDB instance, and we’re of course using MongoDB Atlas here.
Step #1: Go to MongoDB Atlas →
Go to the MongoDB Atlas site and register a completely free MongoDB instance hosted on AWS, with shared RAM and 512 Mb storage. Click the Get Started Free button.
Step #2: Sign up at MongoDB Atlas →
Now go ahead and sign up with your email ID and fill up the details. It’s amazing that you can sign up and use a free MongoDB Atlas hosted DB instance and they don’t even require you to add a credit-card for that.
Step #3: Create the Cluster
Now you’ll be redirected to a page with a bunch of information about the new MongoDB Cluster you’re about to create. I suggest that you review this information, and move ahead by clicking the Create Cluster button at the bottom just like in the screenshot below.
Step #4: Create DB User/Pass
It’ll take a minute and your DB will be created. Once that happens, head over to the Security > MongoDB Users and click on the + ADD NEW USER button on the right, to create a new user for your database. Let’s keep all the other settings set to default for the sake of this intro-article.
I’m setting the user/pass as usermongo but you know better.
Step #5: Add IP to Whitelist for Access
To be able to access your MongoDB Atlas database, you need to setup the IP Whitelist with the IP of your server where your app is hosted. Authentication is beyond what I am discussing here so for the purpose of this demo let’s just allow everyone (which’s actually a bad practice in production).
So, again, head over to the Security > IP Whitelist and click on the + ADD IP ADDRESS button on the right, and finally ALLOW ACCESS FROM ANYWHERE button to allow the anonymous access.
Step #6: Connect via MongoDB Compass
Now that our DB’s IP access and a user has been created, we can pick up the connection string and use it to connect to our database with our MongoDB Compass application.
Go to Connect then choose Connect with MongoDB Compass and download compass if you haven’t till now, copy the URI Connection String. Finally, open Compass and it should be able to detect the connection string in your clipboard, allow it to connect to your database.
And you are set to visualize your database, analyze its performance, and even run complete CRUD operations. Awesome! 💯
Now that we have created a MongoDB Atlas, connected it with MongoDB Compass, we can move forward and start building our Node.js application.
WordPress REST API — FTW!
This WordPress based Node.js custom dashboard interacts with the WordPress instance via WordPress REST API. Since this is a Node.js app, I am using an awesome library called wpapi written by K Adam White. He has also built a demo express based WordPress app. That’s what I got inspired by while building this custom dashboard. SO, you’ll see a lot of it here.
🚀 WordPress Custom Router Based on express
The router is set up with express. Here’s a basic error handler and router template for using WordPress with express.
'use strict'; var express = require('express'); var router = express.Router(); var siteInfoMiddleware = require('../middleware/site-info'); // Set global site info on all routes router.use(siteInfoMiddleware); // Public Routes // ============= router.get('/', require('./index')); router.get('/page/:page', require('./index')); router.get('/:slug', require('./single')); router.use('/tags/:tag', require('./tag')); router.use('/categories/:category', require('./category')); // Catch 404 and forward to error handler. router.use(function (req, res, next) { var err = new Error('Not Found'); err.status = 404; next(err); }); // Error Handling // ============== // Development error handler will print stacktrace. function developmentErrorRoute(err, req, res, next) { res.status(err.status || 500); res.render('error', { message: err.message, error: err }); } // Production error handler. No stacktraces leaked to user. function friendlyErrorRoute(err, req, res, next) { res.status(err.status || 500); res.render('error', { message: err.message, error: {} }); } // Configure error-handling behavior if (router.get('env') === 'development') { router.use(developmentErrorRoute); } else { router.use(friendlyErrorRoute); } module.exports = router;
🎚 Basic express Based Implementation
I am not hosting this entire thing on WordPress, but the initial plan was to do just that. If you want to go do that, you’d wanna build the index by querying all the info using the RSVP.hash utility for convenience and parallelism. For that here’s what you should do.
'use strict'; var wp = require( '../services/wp' ); var contentService = require( '../services/content-service' ); var pageNumbers = require( '../services/page-numbers' ); var pageTitle = require( '../services/page-title' ); var RSVP = require( 'rsvp' ); function getHomepage( req, res, next ) { var pages = pageNumbers( req.params.page ); RSVP.hash({ archiveBase: '', pages: pages, title: pageTitle(), // Primary page content posts: wp.posts().page( pages.current ), sidebar: contentService.getSidebarContent() }).then(function( context ) { if ( req.params.page && ! context.posts.length ) { // Invalid pagination: 404 return next(); } res.render( 'index', context ); }).catch( next ); } module.exports = getHomepage;
🦏 Authentication Cooked In
For this setup, you’ll also need to authenticate your Node.js app by giving it the authentication data, which along with wpapi can be processed like this. Beware this is not always a best practice if you don’t use correct permissions and environment variables settings.
var WP = require( 'wordpress-rest-api' ); var _ = require( 'lodash' ); var config = _.pick( require( './config' ).wordpress, [ // Whitelist valid config keys 'username', 'password', 'endpoint' ]); var wp = new WP( config ); module.exports = wp;
🦁 Site Content Accumulation
And finally, you are able to consume all the content by creating a content-service which handles recursively fetching
All the pages of a paged collection.
Your WordPress site’s info.
An alphabetized list of categories.
A specific category (specified by slug) from the content cache.
An alphabetized list of tags.
A specific tag (specified by slug) from the content cache
Other content required to have some feature parity with WP.
The code for this looks somewhat like this.
'use strict'; var wp = require( './wp' ); var cache = require( './content-cache' ); var _ = require( 'lodash' ); var RSVP = require( 'rsvp' ); /** * Recursively fetch all pages of a paged collection * * @param {Promise} request A promise to a WP API request's response * @returns {Array} A promise to an array of all matching records */ function all( request ) { return request.then(function( response ) { if ( ! response._paging || ! response._paging.next ) { return response; } // Request the next page and return both responses as one collection return RSVP.all([ response, all( response._paging.next ) ]).then(function( responses ) { return _.flatten( responses ); }); }); } function siteInfo( prop ) { var siteInfoPromise = cache.get( 'site-info' ); if ( ! siteInfoPromise ) { // Instantiate, request and cache the promise siteInfoPromise = wp.root( '/' ).then(function( info ) { return info; }); cache.set( 'site-info', siteInfoPromise ); } // Return the requested property return siteInfoPromise.then(function( info ) { return prop ? info[ prop ] : info; }); } /** * Get an alphabetized list of categories * * All archive routes display a sorted list of categories in their sidebar. * We generate that list here to ensure the sorting logic isn't duplicated * across routes. * * @method sortedCategories * @return {Array} An array of category objects */ function sortedCategories() { return all( wp.categories() ).then(function( categories ) { return _.chain( categories ) .sortBy( 'slug' ) .value(); }); } function sortedCategoriesCached() { var categoriesPromise = cache.get( 'sorted-categories' ); if ( ! categoriesPromise ) { categoriesPromise = sortedCategories(); cache.set( 'sorted-categories', categoriesPromise ); } return categoriesPromise; } /** * Get a specific category (specified by slug) from the content cache * * The WP API doesn't currently support filtering taxonomy term collections, * so we have to request all categories and filter them down if we want to get * an individual term. * * To make this request more efficient, it uses sortedCategoriesCached. * * @method categoryCached * @param {String} slug The slug of a category * @return {Promise} A promise to the category with the provided slug */ function categoryCached( slug ) { return sortedCategoriesCached().then(function( categories ) { return _.findWhere( categories, { slug: slug }); }); } /** * Get a specific tag (specified by slug) from the content cache * * The WP API doesn't currently support filtering taxonomy term collections, * so we have to request all tags and filter them down if we want to get an * individual term. * * To make this request more efficient, it uses the cached sortedTags promise. * * @method tagCached * @param {String} slug The slug of a tag * @return {Promise} A promise to the tag with the provided slug */ function tagCached( slug ) { return sortedTagsCached().then(function( tags ) { return _.findWhere( tags, { slug: slug }); }); } /** * Get an alphabetized list of tags * * @method sortedTags * @return {Array} An array of tag objects */ function sortedTags() { return all( wp.tags() ).then(function( tags ) { return _.chain( tags ) .sortBy( 'slug' ) .value(); }); } function sortedTagsCached() { var tagsPromise = cache.get( 'sorted-tags' ); if ( ! tagsPromise ) { tagsPromise = sortedTags(); cache.set( 'sorted-tags', tagsPromise ); } return tagsPromise; } function getSidebarContent() { return RSVP.hash({ categories: sortedCategoriesCached(), tags: sortedTagsCached() }); } module.exports = { // Recursively page through a collection to retrieve all matching items all: all, // Get (and cache) the top-level information about a site, returning the // value corresponding to the provided key siteInfo: siteInfo, sortedCategories: sortedCategories, sortedCategoriesCached: sortedCategoriesCached, categoryCached: categoryCached, tagCached: tagCached, sortedTags: sortedTags, sortedTagsCached: sortedTagsCached, getSidebarContent: getSidebarContent };
🛠 Custom Routes & Sales Data
Finally, I have cooked in quite a few custom routes from where I can attain any kind of sales related data. For the particular architecture I have in place, I’m again using the RSVP.hash utility for convenience and parallelism. It works like a charm.
var WPAPI = require( 'wpapi' ); var RSVP = require('rsvp'); // Using the RSVP.hash utility for convenience and parallelism RSVP.hash({ categories: wp.categories().slug( 'it-services' ), tags1: wp.tags().slug('hotel-name'), tags2: wp.tags().slug('march-events') }).then(function( results ) { // Combine & map .slug() results into arrays of IDs by taxonomy var tagIDs = results.tags1.concat( results.tags2 ) .map(function( tag ) { return tag.id; }); var categoryIDs = results.categories .map(function( cat ) { return cat.id; }); return wp.posts() .tags( tags ) .categories( categories ); }).then(function( posts ) { // These posts are all fiction, either magical realism or historical: console.log( posts ); });
Once I have that data, I am sending it to Paddle.com for processing along with the purchased order request so that it can be added to our MongoDB instance via serverless ⚡ Azure Functions.
// Registering custom routes. site.itSales = site.registerRoute( 'sales/v1', '/resource/(?P<some_part>\\d+)' ); site.itSales().somePart( 7 ); // => myplugin/v1/resource/7 // Query Parameters & Filtering Custom Routes. site.handler = site.registerRoute( 'sales/v1', 'receipts/(?P<id>)', { // Listing any of these parameters will assign the built-in // chaining method that handles the parameter: params: [ 'before', 'after', 'author', 'parent', 'post' ] }); // Yields from the custom data of buyers. site.handler().post( 8 ).author( 92 ).before( dateObj )... // Sent to paddle.
It might look odd to some but WordPress allows you to set up custom post types and custom taxonomies which is what I’m using here, the above code, however, is not the exact implementation but a similar approach to what I have used via categories and tags.
This data gets sent Paddle, and it’s heavily cached so that our WordPress instances do not get any sort of load while we experiment with the custom dashboard. I’ve also cooked in a small data-refresh module which fetches the data on demand from the WordPress instance of choice.
Microsoft Azure & Azure Functions
While building this custom WordPress dashboard, I wanted to make sure that each module of this dashboard lived in form of a serverless app with multiple serverless functions. This decision was based on keeping this dashboard’s cost as economical as possible.
👀 Three Options
There are three major cloud services providers present. That are Microsoft Azure, Google Cloud Platform, and Amazon Web Services. Each of which has serverless functions available which are called Azure functions, GCP Cloud Functions, and AWS Lambdas.
📘 Choosing Azure
Azure has one of the biggest cloud architecture and global presence. 50 Azure regions, more than any cloud provider and after testing each of these three, I found that Azure functions had the best response time in UAE (as my client’s business is based out of UAE).
Also, the fact that we’re using Azure ML Studio, AI Cognitive Services, and Virtual Machines to host parts of this project, it made complete sense to use Azure functions for the serverless architecture.
Getting Started with Azure Functions
Let’s get started with Azure functions. I am going to take you through the process of creating a simple serverless Azure function, which will be triggered via HTTP requests, and inside it, we’ll process the sales information sent to us from Paddle.com.
⚙ What are we building?!
I am building a serverless Azure function which is based on JavaScript and specifically Node.js code.
This Azure function will get triggered by a simple GET HTTP request from our 3rd party payment solution, i.e., Paddle.com
As soon as there’s a sale on Paddle.com, it will trigger a webhook that contains info related to our sale, quantity, item, earnings, and some member-related data that WordPress sent to Paddle.
Using WordPress REST API, I have added some custom data related to the user who purchased the product, like user’s ID in WordPress DB, which WordPress site had this sale, and such user’s meta info.
When Azure function receives this GET request, it processes the info, takes out what I need to keep in the MongoDB Atlas Cluster and forms a JavaScript object ready to be saved in the DB.
The azure function then connects to MongoDB Atlas instance via an npm package called mongoose, where after connecting the database, I create a DB Model/Schema, and then this data is saved to the MongoDB Atlas Cluster.
After which Azure function kind of sits there waiting for next sale to happen, where my client only pays for the execution time and amount of executions for Azure functions. (1 million of which are free every month 😮).
Now, this is only a high-level summary of what’s happening, there’s a lot of steps that I skipped here like authentication which is beyond the scope of this article. You should always setup authentication and verification to keep things civil and avoid any overage.
So, let’s go ahead and build this thing.
Step #1: Set up Microsoft Azure & VSCode
I expect you to have the Azure account set up on your end. You’ll need to subscribe with a credit-card since we need storage for hosting the Node.js files which will be used with Azure Functions and you have to pay for storage (you’ll probably get a free $200 credit for the first month and even after that the cost is quite pretty low).
So, go ahead and set up the following:
✅ Setup a Microsoft Azure account with a credit card in billing.
✅ Install Visual Studio Code (Psst. I’m making a course on VSCode).
✅ Install the Azure Functions extension on your VSCode.
💡 To enable local debugging, install the Azure Functions Core Tools.
🗂 Create a new directory and open it up in VSCode.
In case you’re wondering which theme and font I am using, it’s Shades of Purple 💜 — for more info see which software and hardware I use.
Step #2: Create a New Function App Project
Now let’s create a new function app project. This is really easy with VSCode. All you have to do is go-to the Azure Extension explorer present in the activity bar. From there access FUNCTIONS tab and click on the first Create New Project icon.
This will create a demo project, with basic files required to get started and will initialize a Git repo for you. I’ll keep up with small gif based demos to make things easier for you.
Step #3: Create an HTTP-triggered Azure Function
Now that we have created a function app project, let’s create an HTTP-triggered serverless Azure function. For that, go-to the Azure Extension explorer present in the activity bar. From there access FUNCTIONS tab and click on the second icon Create Function.
For the sake of this demo, I am choosing to keep the authentication part simple so going to select anonymous access. The name of our Azure function is HttpTriggerJS so you can find a new directory created with that name inside your project. This should contain two files i.e. functions.json and index.js
⚡ A function is a primary concept in Azure Functions. You write code for a function in a language of your choice and save the code and configuration files in the same folder.
🛠 The configuration is named function.json, which contains JSON configuration data. It defines the function bindings and other configuration settings. The runtime uses this file to determine the events to monitor and how to pass data into and return data from function execution. Read more on this file in the official documentation here.
Following is an example function.json file that gets created.
{ "disabled": false, "bindings": [ { "authLevel": "anonymous", "type": "httpTrigger", "direction": "in", "name": "req" }, { "type": "http", "direction": "out", "name": "res" } ] }
And then, there’s an index.js file which contains a basic code that you can use to test your Azure function. It receives a parameter name and prints it back to you or shows you an error asking for this parameter.
module.exports = function (context, req) { context.log('JavaScript HTTP trigger function processed a request.'); if (req.query.name || (req.body && req.body.name)) { context.res = { // status: 200, /* Defaults to 200 */ body: "Hello " + (req.query.name || req.body.name) }; } else { context.res = { status: 400, body: "Please pass a name on the query string or in the request body" }; } context.done(); };
Step #4: Deploy & Test Your Azure Function
Now that we have created an Azure function which can be triggered by GET HTTP request, let’s go ahead and deploy it with VSCode and test it with Postman API Explorer.
To deploy the function go-to the Azure Extension explorer present in the activity bar. From there access FUNCTIONS tab and click on the third icon Deploy to Function App.
This will ask you a bunch of questions about what is the name of your app, use anything unique. I used demo-wp-mdb-azure— VSCode then use this to create a resource group, to group together your function-app related resources, it’s storage (used to save the files), and the created Azure function — finally responding us back with a public URL.
I then went ahead to access this URL and it asked for the name param as per the code then when I sent the name param with the Postman app, it responded with Hello Ahmad Awais. 👍
VSCode also asked me to update the function extension app verions to beta, and I chose yes — coz that will help me use Node.js v8 for async/await.
Step #5: Create package.json and Install mongoose
Now that our Azure function is up and running. Let’s create a package.json file in the root of our project and install mongoose. We’ll need this to connect and save data to our MongoDB Atlas Cluster.
Mongoose provides a straight-forward, schema-based solution to model your application data. It includes built-in typecasting, validation, query building, business logic hooks and more, out of the box. It’s pretty awesome. 💯
Step #6: Add App Setting for MongoDB Connection
Now we are almost ready to start writing code for our application. But before doing that, we’ll need a connection string to be able to connect to our MongoDB Atlas Cluster (just like we did with MongoDB Compass). This connection string is private and you shouldn’t commit it to the git repo.
💯 This connections string belongs to the local.settings.json file in the project root. Let’s first download the settings, then add MongodbAtlas setting with our connection string (get this string from the MongoDB Atlas dashboard) and upload the app settings.
To do this, go-to the Azure Extension explorer present in the activity bar. From there access FUNCTIONS tab and select your subscription, then your Azure function app, i.e., demo-wp-mdb-azure and then right click Application Settings to select Download remote settings… to download and Upload local settings… to upload the settings after adding the MongodbAtlas connection string to the settings.
Step #7: Update Node Version of Azure Function
In the code, I intend to use async/await which are not available on v6.5.0 of Node.js that comes with the default version 1 of Azure functions. In the step #4, VSCode asked me to update to the runtime version of Azure function to beta and I did that. This enables support for latest Node.js versions on Azure functions.
So, let’s just update WEBSITE_NODE_DEFAULT_VERSION app setting in our local settings and update that to the remote settings.
Step #8: Create MongoDB Model/Schema
Before we save any data to our MongoDB Atlas Cluster, let’s create a modelSale.js file that will contain the model’s schema for what we intend to save in the database. It’s an extremely simple schema implementation, I suggest you read up on what you can do here with [mongoose](http://mongoosejs.com/docs/guide.html) and MongoDB.
This file is pretty much self-explanatory.
/** * Model: Sale */ const mongoose = require('mongoose'); mongoose.Promise = global.Promise; // Sale Schema. const saleSchema = new mongoose.Schema({ sale_gross: Number, earnings: Number, currency: String, memberSince: Date, customerEmail: String, event_time: { type: Date, default: Date.now }, }); // Export the model. module.exports = mongoose.model('Sale', saleSchema);
Step #9: Code the ⚡Azure Function with Node.js
Now let’s code our Azure function. I’m adding all the main code lives inside the index.js file for the purpose of this demo. Also going to use the context object as the first parameter, make sure you read about that. Everything else is explained in the code snippet below.
So, this is just a demo code for this article. It does the following:
✅ Gets the data from Paddle.com
⚡ Connects to the MongoDB Atlas via connection string that we added in our Application Settings.
📘 Uses the defined DB schema inside the test database where it creates a sales collection including documents for our sales.
⚙ Validates the data and creates a finalData object that gets saved in the MongoDB Atlas Cluster. Yay!!!
🥅 Finally, responds to the Paddle webhook with 200 status code if all goes well, and does the context.done() dance.
Everything is pretty much explained with inline documentation.
/** * Azure Function: Sale. * * Gets data from Paddle.com (which in turn gets data * from WordPress) and processes the data, creates a * finalData object and saves it in MongoDB Atlas. * * @param context To pass data between function to / from runtime. * @param req HTTP Request sent to the Azure function by Paddle. */ module.exports = async function (context, req) { // Let's call it log. const log = context.log; // Log the entire request just for the demo. log('[RAN] RequestUri=%s', req.originalUrl); /** * Azure function Response. * * Processes the `req` request from Paddle.com * and saves the data to MongoDB Atlas while * responding the `res` response. */ // Database interaction. const mongoose = require('mongoose'); const DATABASE = process.env.MongodbAtlas; // Connect to our Database and handle any bad connections mongoose.connect(DATABASE); mongoose.Promise = global.Promise; // Tell Mongoose to use ES6 promises mongoose.connection.on('error', (err) => { context.log(`ERROR→ ${err.message}`); }); // Sale Schema. require('./modelSale'); const Sale = mongoose.model('Sale'); // Create a Response. if (req.query.customFieldName) { // Simple authentication for the purpose of demo. // Build the data we need. const sale_gross = req.query.p_sale_gross || '0'; const earnings = JSON.parse(req.query.p_earnings)['16413'] || '0' const currency = req.query.p_currency || 'USD'; const memberSince = req.query.memberSince || new Date(); const customerEmail = req.query.customerEmail || ''; const event_time = new Date(); log('[OUTPUT]—— sale_gross: ' + sale_gross); log('[OUTPUT]—— earnings: ' + earnings); log('[OUTPUT]—— currency: ' + currency); const finalData = { sale_gross: sale_gross, earnings: earnings, currency: currency, memberSince: memberSince, customerEmail: customerEmail, event_time: event_time, } // Save to db. const sale = await (new Sale(finalData)).save(); log("[OUTPUT]—— SALE SAVED: ", sale); // Respond with 200. context.res = { status: 200, body: "Thank You for the payment! " + (req.query.customFieldName || req.body.customFieldName) }; } else { context.res = { status: 400, body: "Please pass a name on the query string or in the request body" }; } // Informs the runtime that your code has finished. You must call context.done, or else the runtime never knows that your function is complete, and the execution will time out. // @link: https://docs.microsoft.com/en-us/azure/azure-functions/functions-reference-node#contextdone-method context.done(); };
Step #10: Re-Deploy The Azure Function
Now let’s re-deploy the Azure function. For that, go-to the Azure Extension explorer present in the activity bar. From there access FUNCTIONS tab and click on the third Deploy to Function App icon.
>
Step #11: Test Azure Function via Paddle’s Webhook
Looks like we’re pretty much done. All that’s left is to test our Azure function by triggering a dummy webhook via Paddle.com. Let’s do that. Also, when things do work, let’s explore how our data looks in the MongoDB Compass.
Wow, Humph!!! That was a lot. Glad it worked. 🎉
🤔 So, What Just Happened?!
Prepare yourself for a mouthful. I created a small part of the Sales module in the custom WordPress Dashboard app that I am building. I used MongoDB Atlas and Compass, then created Microsoft ⚡Azure Function via Function App with VSCode, deployed the app with env secret as application string with the MongoDB connection string, updated the Node.js version and triggered the function via a dummy webhook from Paddle.com (like it will trigger when a sale happens) to send data (from Paddle + WordPress) to our Azure function and from there to MongoDB Atlas. And it worked, haha!
Machine Learning & Artificial Intelligence
Machine learning and artificial intelligence are always a mesmerizing topic in the world of software technology but we don’t talk a lot about that in the context of WordPress or in the WP Community.
I set to change that by adding a few small improvements to a select few WordPress sites for my client and have every intention of exploring the same with this custom WordPress dashboard.
I have discussed this topic before and shared what I am working on, take a look at this small artificial intelligence plugin I am building for WordPress, and integrating it with different Azure Cognitive Services.
I explained this in a video in another post that you can find here: Building A WordPress Artificial Intelligence Plugin →
I’ve accomplished similar results in this dashboard by the wpapi package. First I upload the image to cognitive services and then on a confident response, I send it to WordPress to uploaded via WordPress REST API, with image description that gets generated by Computer Vision AI.
/** * Get Image Alt Recognition with Computer Vision * using Azure Cognitive Services. */ var WPAPI = require('wpapi'); var wp = new WPAPI({ endpoint: 'http://src.wordpress-develop.dev/wp-json' }); /** * Handle Image Alt Generation. */ function processImage() { // ********************************************** // *** Update or verify the following values. *** // ********************************************** // Replace <Subscription Key> with your valid subscription key. var subscriptionKey = "<Subscription Key>"; // You must use the same region in your REST call as you used to get your // subscription keys. For example, if you got your subscription keys from // westus, replace "westcentralus" in the URI below with "westus". // // Free trial subscription keys are generated in the westcentralus region. // If you use a free trial subscription key, you shouldn't need to change // this region. var uriBase = "https://westcentralus.api.cognitive.microsoft.com/vision/v2.0/analyze"; // Request parameters. var params = { "visualFeatures": "Categories,Description,Color", "details": "", "language": "en", }; // Display the image. var sourceImageUrl = document.getElementById("inputImage").value; document.querySelector("#sourceImage").src= sourceImageUrl; // Make the REST API call. $.ajax({ url: uriBase + "?" + $.param(params), // Request headers. beforeSend: function (xhrObj) { xhrObj.setRequestHeader("Content-Type", "application/json"); xhrObj.setRequestHeader( "Ocp-Apim-Subscription-Key", subscriptionKey); }, type: "POST", // Request body. data: '{"url": ' + '"' + sourceImageUrl + '"}', }) .done(function (data) { // Show formatted JSON on webpage. $("#responseTextArea").val(JSON.stringify(data, null, 2)); // Extract and display the caption and confidence from the first caption in the description object. if (data.description && data.description.captions) { var caption = data.description.captions[0]; if (caption.text && caption.confidence >= 0.5) { const imgDescription = caption.text; // ⬆️ Upload to WordPress. wp.media() // Specify a path to the file you want to upload, or a Buffer .file(sourceImageUrl) .create({ title: imgDescription, alt_text: imgDescription, caption: imgDescription, description: imgDescription }) .then(function (response) { // Your media is now uploaded: let's associate it with a post var newImageId = response.id; return wp.media().id(newImageId).update({ post: associatedPostId }); }) .then(function (response) { console.log('Media ID #' + response.id); console.log('is now associated with Post ID #' + response.post); }); } } }) .fail(function (jqXHR, textStatus, errorThrown) { // Display error message. var errorString = (errorThrown === "") ? "Error. " : errorThrown + " (" + jqXHR.status + "): "; errorString += (jqXHR.responseText === "") ? "" : jQuery.parseJSON(jqXHR.responseText).message; alert(errorString); }); };
👀 Content Moderation Automation
One of the ideas we have is to put AI/ML from Azure to use as a content moderation platform which offers a built-in human-in-the-loop + machine learning to help moderate images, text, and videos. It’s a work in progress but it’s something really interesting that you should definitely take a look at.
🕵 WordPress Grammar (Nazi) Intelligence
Y’all have a habit of typing the typos over and over again. I do that all the time. The coolest thing ever is when search engines like Bing and Google can spell check and proofread the search query for you.
What if WordPress had that?! — So, I got to work and ended up cooking the same functionality in the WordPress admin area for when you type a typo in your post title or more than one typos for what I care.
I was so excited that I couldn’t contain myself, so there’s me in the left bottom corner. All happy and surprised! 🙌👐👏👊💪🎶☝😌🎧
It’s Your Turn Now!
I really hope that you enjoyed this potential integration between all these modern JavaScript frameworks, AI/ML products, and serverless functions.
This project is a lot of fun. I think if you give this tech-stack a shot you can have this crazy amount of fun as well. So, leaving it up to you to try MongoDB Atlas, in the context of WordPress — and maybe attach all that to a bunch of serverless functions.
It’d mean a lot to me if you share this post on Twitter → Also feel free to say 👋 to me there at @MrAhmadAwais.
Peace! ✌
via Scotch.io https://ift.tt/2lZwsEh
0 notes
minnievirizarry · 7 years
Text
What Is Social Media Engagement & Why Should I Care?
For numerous businesses, social media is a noisy and jam-packed place to try and build brand awareness. And the idea of social media management is overwhelming for some organizations because there’s simply too much that goes into targeting the right audience on each network.
By now you know there are tools to manage social media engagement, but it’s a whole other beast to make each channel work in your favor. The problem depends on how well you use these tools to create authentic interactions, monitor discussions and engage with others. But if you don’t have the right know-how to be actionable with social, your business is left in the dark.
A report from Thunderhead said only one in four businesses feel confident in their customer engagement methods. If you fall into that category, don’t worry–we won’t tell. Instead, let’s make sure you’re comfortable with how to engage and build your brand on social.
What is Social Media Engagement?
Social media engagement is essentially like a long-term relationship. You can imagine a committed and lengthy relationship takes dedication, readiness to adapt, the ability to think about the future and ensure the other party involved is happy for years to come.
Try not to think of engagement as just a single interaction with one of your customers. As Thunderhead shows, you’re creating an open line of communication over a period of time. While the term “customer relationship” may come to mind, engagement is different and on its own level.
Providing More to Social Customer Care
When we think about social media engagement, it’s about how you use networks like Facebook, Instagram, LinkedIn and Twitter to build a great customer experience. You want to be there there for your patrons through thick and thin.
As soon as customers decide to engage with your business on social media, they’re essentially putting trust into your brand to solve their problem.
As the clothing store Tarnish successfully showcases, reaching out to your customers when they have specific questions increases brand loyalty and even sparks the chance of a future purchase. All it takes is a bit of timely communication.
In the past, customers had to go to great lengths to get ahold of the brand to be heard. While the days of “we’re sorry–all of our customer service representatives are currently busy” still exists, businesses are getting better at making those troublesome interactions a thing of the past by enhancing engagement through social media.
Our Sprout Social Q2 2016 Index discovered social media is the most preferred channel for customers to engage with brands. This means you must ensure every potential or current customer conversation ends with satisfaction or resolve.
Exceeding Customer Expectations on Social
It’s easy to think customers don’t expect as much engagement from you on social media, so why invest? The same Sprout Q2 Index found 89% of social messages go ignored. However, users expect an answer from brands on social within four hours.
Jay Baer, president of Convince and Convert, discovered 42% of users complaining to brands via social expect a response in less than an hour. That should be a tall tale sign of what customers want and what you provide.
So the question we here at Sprout Social ask is what does your business gain by avoiding social media engagement?
Even though you can’t truly measure being nonexistent on social media, having tools to track and monitor your brand interactions pays off. Our powerful engagement reports provide real-time data on how customers interact. And at the same time, you gain critical insights into your team’s response efforts.
How to Improve Engagement
Improving engagement isn’t necessarily rocket science, but it does take effort. Try not to think of social business or social branding as something new. This type of marketing has been around for decades.
Now there’s a massive audience out there ready to be targeted, dissected and reached through social media engagement. The important thing is to know how to approach your audience, which is why we’re providing five tips to improve your social media engagement.
1. Start the Conversation
Like we mentioned before, try to think about social media engagement as a long-term relationship. Every great relationship needs someone to initiate the conversation to get things going. And in some cases, it has to be your brand.
Have 72 hours to see Chicago? This itinerary takes you through the highlights: https://t.co/OFWQIB29SM pic.twitter.com/5wTHZ33T7b
— Choose Chicago (@ChooseChicago) April 20, 2017
A great way to open the conversation between both parties is by providing blog posts that your audience actually wants. Choose Chicago is perfect brand to watch for examples. They constantly post great Tweets with links to content about why you should visit Chicago. It helps to get people talking in their industry.
However, it’s not always that easy to get a group together to converse. If you have issues with getting engagement from content, try hosting Q&As or Twitter Chats. But try joining a few first. Use your brand’s social accounts to join conversations within your field. Be active with questions and provide industry knowledge to users.
Avocados, nature's perfect fruit! Dr. Sue answering your nutrition & parenting questions w/ our partners @MissionAvocados #twitterchat pic.twitter.com/Qi4PAuoCcb
— The Kid's Doctor® (@TheKidsDoctor) December 1, 2016
You’ll be shocked at how quickly users will follow you. When people understand there’s a human behind the brand, their trust level increases. To build brand awareness, it’s all about trust and engagement.
Pro Tip: Be careful with your early conversations. Don’t promote right off the bat or else you’ll find little interactions and participation. Provide something of value like your industry insights or previous experience.
2. Promote Your Brand Enthusiasts
Another way to show you’re willing to get the conversation going is by promoting your brand enthusiasts’ content. For example, if you’re on Instagram, you could ask for customers to @mention you or use a branded hashtag to show off a new product or service.
Vans are not just one thing, and neither are you. Show us how you wear yours with #MyVans
A post shared by vans girls (@vansgirls) on Apr 24, 2017 at 9:02am PDT
Vans regularly uses its branded hashtag #myvans to get customers involved and to post their own content with the hashtag. When you post user-generated content, you’re essentially showcasing your customers and to further your social engagement. This also helps push others who are on the fence to interact with your brand by giving an avenue to communicate.
Why do you want people to use certain hashtag? It’s all about tracking.
Through Sprout Social, it’s simple to track the performance of a recent giveaway on social or to see how well your branded keywords performed.
You can also see the top influencers engaged with your brand in our Instagram analytics report . This allows you to be more selective with your branding efforts on social–especially when handling marketing assets such as hashtags, keywords or brand phrases.
With this data, you can see which users are the most engaged with your brand. And if these folks have massive audiences, it can lead to partnerships or co-marketing efforts to help both sides. Having your hashtags, keywords and @mentions available in a single-stream platform makes managing engagement efforts simple.
Pro Tip: Make sure you are completely transparent with your intentions and how you plan to use customers’ content if you do so. Try using social media contests to give away t-shirts, swag gift packs or your actual product. Encourage your audience to share your material and to use specific hashtags.
3. Jump on Current Events & Topical Subjects
When something is trending, going viral or simply in the news, you can use these topical events to bring new traffic to your social networks. You can cater it to things like hashtag holidays, events or live shows in your area.
#HitTheButton and sudden-death playoff golf. A win-win. #TheMasters
— Buffalo Wild Wings (@BWWings) April 9, 2017
Buffalo Wild Wings commonly uses sporting events to promote in real-time like they did for the Master’s. Addressing events in real time sparks engagement and provides a human aspect to your social efforts.
Hold onto the spirit of #EarthDay every day in sustainable denim. Learn more at https://t.co/9MXw7Q7Ohe. #GapForGood pic.twitter.com/JGm6mAWQUO
— Gap (@Gap) April 22, 2017
Brands like Gap also use current events like Earth Day to promote its sustainable denim. This is a great way to get users aware and to be seen in the action of the event.
At the same time, you need to be highly sensitive with this marketing tactic.
All too often, we see social media crises where a company used an inappropriate or untimely current event to promote their brand. Follow our social media policy guide so you’re not only prepared, but educated on what can cause a problem.
4. Be Receptive With Your Audience
An issue many businesses have with social media engagement is responding in time to answer questions. It’s always sad when you see a brand’s social network go years without any new content or customer interactions. You’re not only telling your audience you’re not present, but that you don’t want to provide additional avenues for communication.
Going just a day without a response can be detrimental to your brand. You have to be alert and attentive to your current and potential customers. So if you invest the time in social media engagement, you have to be active. Otherwise, people will think you don’t care.
Your goal is to get as many eyes on your brand as possible. Additionally, positive interactions lead people to recommend your brand to friends and family, or post about the great experience on social.
Home Depot does a great job at answering questions in full on Facebook posts within minutes. Providing your customers with quick and timely answers shows you’re fully invested. But using a simple “yes” or “no” to answer them is not enough to truly engage anyone.
5. Work as a Team on Social Media
As you know, your brand can receive a plethora of different questions, comments and concerns on social. To ensure you’re fully engaging users, make sure your social media team is well-equipped and ready to handle incoming messages.
To provide the most engagement, break out your team into specific categories to get the most out of social:
Content Creators: These folks develop, ideate and schedule your social content. Using a social media calendar helps planning across all teams and keeps you active on social.
Community Managers: Who’s there to handle a hostile customer or major news about your brand? Hopefully you have community managers to control situations and keep experiences positive.
Public Relations: To get your brand the appropriate exposure through bigger channels, you need public relations managers. This person would handle customers, clients and businesses all alike.
Sales and Enablement: If someone is interested in your brand, but wants to know more, where do you send them? Sales and enablement can provide specific content to drive engagement among interested parties.
Support: Things break and having someone control and update the situation is critical. Your support members are always available in a pinch and ready to put out fires.
If you don’t have enough members or spend for this team, that’s OK. However, it’s important to know those handling social media engagement have to wear many hats.
How to Measure Engagement
A big question still unanswered is how to actually measure engagement and benchmark stats for the future. Don’t worry–we’ve still got you covered.
Measuring engagement depends on the network, and as you know, there are unique aspects to each one.
We’ll always tell you it’s not a good idea to take them all on at once. Instead, try to find your quintessential networks first. If you’re still not sure, bookmark our social media marketing guide to get your feet wet with each social channel.
Find Your Core Engagement Metrics
Marketers always look for the value of social media, and the No. 1 spot is usually with the data. To ensure your audience is fully engaged, there are some key metrics to track and analyze on a regular basis.
Within Sprout Social, we provide essential analytical reports to best measure your overall engagement across networks. Some of the responsive engagement metrics include:
Inbound vs. Replies: The total amount of replies sent versus the total estimated inbound messages within your selected date range.
Average Daily Response Rates and Times: This is displayed by day and your overall totals within your selected date range.
Time Distribution: This displays the percentages of messages responded to within specific time periods.
Response Rate and Time: Totals are also broken out by day of the week and by hour.
Go In-Depth Within Each Network
To go even further, it’s important to dissect each social media channel where you’re present. Know that each network is different and could affect your business in its own unique way.
Common engagement metrics for your social channels, include:
Facebook: Organic Likes, Paid Likes, Unlikes, Mentions, Impressions, Post Engagements, Links Clicked, Reactions, Comments and Shares.
Twitter: Organic Impressions, Links Clicked, Mentions, Direct Messages, Retweets, Replies and Likes.
Instagram: Likes Received (Including Live and Stories), Comments, Engagement per Media and Most Engaged Hashtags.
LinkedIn: Impressions, Clicks, Likes, Comments and Shares.
OK, so How Do I Manage All of This?
We feel you–it’s not easy managing Facebook, Twitter, Instagram and LinkedIn accounts for a single business. It doesn’t matter how big or small your company is, you need a way to manage your customers’ inquiries without staring at your social networks and hitting refresh all day.
That’s where we come in. Sprout Social has an easy-to-use Smart Inbox to help manage in-bound messages, @mentions, new followers and brand keywords. To make your engagement strategies form a long-lasting relationship with your customers, ensure managing your social networks is a high priority.
One interaction will not always change the view of those seeing your company. Instead, you have to take action and be ready to give insightful information when customers reach out to your business on social media.
If you have any engagement tips, feel free to comment below!
This post What Is Social Media Engagement & Why Should I Care? originally appeared on Sprout Social.
from SM Tips By Minnie http://sproutsocial.com/insights/what-is-social-media-engagement/
0 notes