# Systenics Solutions - Full Website Content
This file contains the complete, high-fidelity content of the Systenics Solutions website for AI crawler ingestion. Detailed sections follow below.
Source site: https://www.systenics.com
Generated: 2026-10-13T09:28:47.576Z
---
## Page: About Us | Meet the Superhero Squad | Systenics Solutions
URL: https://www.systenics.com/about-us/
Description: Meet the Systenics Superhero Squad — 20 years of custom AI, Cloud, Web and AuctionWorx development with 100% successful missions for clients worldwide.
# Building
Squads, Products and Custom Solutions
## 100% Successful missions
for past 20 years!
## We strive to provide our global clients of various sizes with cost effective benefits of offshore development while providing expert technical services.
We have a Squad of well-rounded technical experts specializing in various Open Source and Microsoft technologies allowing us to apply the best mix of technologies for our client solutions. We specialize in building consumer centric and interactive Cloud, AI, Web, Desktop and Mobile application experiences. We take great pride in having Squad that constantly strives to apply the latest technology innovations to our client solutions. In this fast paced, quick changing, hi-tech world, we sprint along with our clients to ensure that the solutions we deliver for them keep pace with the current technological trends.
We understand our client's key concerns while investing in offshore software development; we have modeled our processes to alleviate any doubts. We promise complete transparency, honestly, professional attitudes, prompt responses and excellent support. We have adopted iterative processes help our clients smoothly progress from conceptualizing ideas, building proto-types/wireframes to bringing their product to market, giving our clients complete visibility and control at all times.
Our Squad has worked with clients of various sizes from start-up's, SME's to large enterprises located globally. We have built innovative solutions in a wide variety of business domains from Health Care, Advertising, Insurance, Marketing, Communication and Messaging, HR, Digital Media, Line of Business Applications, Saas application, Micro Services and DRM. We are Microsoft Gold Cloud Platform partners and provide the best MS Azure Cloud based solutions for our clients.
Work in latest technologies
Evolved processes
Promise complete transparency and honesty
Understand clients key concerns
Go extra mile for clients
Ensure client success from concept to exit
Our Mission:
**Spread the Happiness!**
- Happy Clients
- Happy Squad
- Happy Society
## Meet the Team
#### Saurabh Nandu Founder
Being Microsoft's Most Valued Professional (MVP) in Visual C# for 4 years, a veteran on the .NET platform since the early beta's of .NET and the brains behind Systenics Solutions are only a few of the feathers in Saurabh's cap. He has not only edited and reviewed but also written books on .NET for esteemed publications. Now he's got back into deep learning on AI and how clients can benefit from it.
#### Siddhi Nandu Founder
Siddhi is a Computer Engineer from Mumbai University with an MBA in Finance from JBIMS. Her fresh perspective and techno-management background helped our company grow by 500%! A woman in stem, she inspires, equips and educates everyone in the Systenics' Superhero Squad! As a process person, she bring fresh prespective into AI driven optimization and automation.
#### Shailesh Patel Account Manager
Computer Engineer from Mumbai University and a member of our Squad for over 15 years, Shailesh with his Superhero-skills will delicately execute every mission till a perfect launch. Over the years he has launched numerous projects for international clients. Years on working with clients he has deep domain knwoledge and supprises new clients with his ablity to simplify their complex problems and offer "aha" moments and solutions.
#### Nilesh Anchan Head of Engineering
Nilesh's Superpowers include his analytical and problem-solving skills with result oriented approach, leadership qualities and his years of experience with a wide array of platforms. Currently focusing on WPF, MVC4/Razor with Entity Framework, Windows 8 Apps & Silverlight. He spearheads AI adoption internally as well as externally.
#### Naresh Karandikar UI
Naresh enjoys working on anticipating UI challenges and coming up with UI designs that make user interactions on clients' websites easy and efficient. He is happiest when he is writing HTML, CSS, with a dash of Javascript to convert those Photoshop designs to high-fidelity functional web UI. He has improvised his skills to harness the power of AI in design and videos to accelerate the design process and deliver high quality designs.
---
## Page: AuctionWorx Add-On & Customization Pricing | Systenics
URL: https://www.systenics.com/auctionworx/pricing/
Description: Transparent one-time pricing for AuctionWorx mobile apps, add-ons and plugins from a RainWorx Premium Partner. No subscriptions, no hidden charges.
# AuctionWorx Pricing, Out in the Open
No mystery quotes. Every productized add-on and app we build for AuctionWorx has a one-time, fixed price — published right here. For custom development, we start with a free discovery call, provide ballpark estimates, and refine with detailed mockups before building in milestones. That's how a RainWorx Premium Partner does business.
## White-Label Mobile Apps
Native iOS and Android apps for your AuctionWorx Enterprise or Events marketplace — white-labeled, published under your brand, one-time purchase.
### $1799
#### Buyer
for AuctionWorx Enterprise/Events Edition
- One Time Purchase
- iOS + Android
- White Labeled
- Deployment Included
- Buyer side features
[Book a Demo](https://outlook.office.com/bookwithme/user/231015685f21467da5ef6e3eb8b50240@systenics.com/meetingtype/hbYq2z1Hj0C2e7DuwBqdnw2?anonymous&ep=mcard)
### $2299
#### Buyer + Seller
for AuctionWorx Enterprise/Events Edition
- One Time Purchase
- iOS + Android
- White Labeled
- Deployment Included
- Everything in Buyer plus seller features
[Book a Demo](https://outlook.office.com/bookwithme/user/231015685f21467da5ef6e3eb8b50240@systenics.com/meetingtype/hbYq2z1Hj0C2e7DuwBqdnw2?anonymous&ep=mcard) **AI Integration
### $2699
#### Buyer + Seller Pro
for AuctionWorx Enterprise/Events Edition
- One Time Purchase
- iOS + Android
- White Labeled
- Adds AI title & description generation
- Advanced search & swipe navigation
- Multi-language support
[Book a Demo](https://outlook.office.com/bookwithme/user/231015685f21467da5ef6e3eb8b50240@systenics.com/meetingtype/hbYq2z1Hj0C2e7DuwBqdnw2?anonymous&ep=mcard)
## Add-Ons & Plugins
Drop-in superpowers for your existing AuctionWorx installation. One-time price, deployment included.
### $2,799
#### Barcode Listing Creation
Scan a barcode, get a listing. Camera or handheld scanner, instant product images, specs and retail prices.
[Learn More](https://www.systenics.com/auctionworx/barcode-listing-creation/)
### $2,699
#### AI-Enhanced Listing Descriptions
AI-generated titles and descriptions for your sellers, tuned for auction conversions.
[Learn More](https://www.systenics.com/auctionworx/ai-enhanced-listings-description-generation/)
### $499
#### Listings Creation Excel Plugin
Bulk-create listings straight from Excel. Hundreds of lots in minutes.
[Learn More](https://www.systenics.com/auctionworx/listings-creation-excel-plugin/)
### $399
#### Community Activity Feed
A live activity stream that keeps bidders on your marketplace longer.
[Learn More](https://www.systenics.com/auctionworx/community-activity-feed/)
## Scoped to Your Mission
Custom AuctionWorx development requires deep understanding — so here's our transparent process from initial discovery and UI/UX mockups to milestone delivery, before you commit to anything.
Step 1 Discovery & Ballpark Estimate
Tell us what your marketplace needs in a free discovery call. We'll assess your requirements and provide an initial ballpark estimate.
Step 2 Requirements & Mockups
If the ballpark works for you, we dive into full-fledged requirements gathering and UI/UX mockups to give you a far closer, real-world estimate.
Step 3 Build in Milestones
We build and test your custom features iteratively in clearly defined milestones, keeping you in the loop every step of the way.
Step 4 Deploy & Support
We deploy straight to your AuctionWorx installation and support your customization through future AuctionWorx updates.
[Book a Demo](https://outlook.office.com/bookwithme/user/231015685f21467da5ef6e3eb8b50240@systenics.com/meetingtype/hbYq2z1Hj0C2e7DuwBqdnw2?anonymous&ep=mcard)
## Why Choose Systenics for Custom Development
### **Clear discovery, no guesswork
We don't throw around blind quotes or let meters run unchecked. With 15+ years on AuctionWorx, we conduct a free 1st discovery call, provide ballpark estimates, and refine them with detailed mockups and requirements before kickoff.
### **Best Practices based Development
As an official RainWorx partner with over 15+ years of hands-on experience, we architect customizations strictly following industry and platform best practices. We build through native extension points to deliver superior performance, robust security, and seamless upgrade compatibility that never breaks core functionality.
### **No rework bill later
We've rebuilt enough "affordable" AuctionWorx projects to know the pattern: a cheap shortcut upfront turns into an emergency fix a year later, then a full rebuild once the platform outgrows it. Read [why the cheapest AuctionWorx developer costs the most](https://www.systenics.com/blogs/why-the-cheapest-auctionworx-developer-costs-the-most/).
### **A full team, not one freelancer
Every custom mission draws on developers, QA and DevOps who already know the platform, not one person learning on your invoice. See [why an expert tech agency beats a solo hire](https://www.systenics.com/blogs/why-hire-an-expert-tech-agency-for-your-product-idea/).
## Pricing Questions, Answered
###
Yes, for our products. Every published add-on and mobile app price on this page is a one-time purchase that includes deployment on your AuctionWorx installation. No subscriptions, no per-listing fees, no surprise renewals.
###
No — AuctionWorx licenses are sold by RainWorx Software. We're a RainWorx Premium Partner: we build the apps, add-ons and customizations that run on top of your AuctionWorx Enterprise or Events license.
###
We start with a free 1st discovery call and provide a ballpark estimate. If you decide to proceed, we head into detailed requirements gathering with mockups to establish a far closer, real-world project estimate. Development is then structured and billed across clear milestones with seamless deployment.
###
That's most of our missions, honestly. Book a demo and tell us what your marketplace needs — after 15+ years on AuctionWorx, odds are we've built something like it before.
## Ready to Price Your Mission?
[Book a Demo](https://outlook.office.com/bookwithme/user/231015685f21467da5ef6e3eb8b50240@systenics.com/meetingtype/hbYq2z1Hj0C2e7DuwBqdnw2?anonymous&ep=mcard)
---
## Page: AuctionWorx Development & Customization | Systenics
URL: https://www.systenics.com/auctionworx/
Description: RainWorx Premium Partner with 15+ years on AuctionWorx. Mobile apps, add-ons, customization and end-to-end auction solutions — transparent one-time pricing.
# AuctionWorx Development, Customization & Platform Solutions
## Trusted RainWorx partner for enterprise builds, integrations, and product extensions
[View Pricing](https://www.systenics.com/auctionworx/pricing/) *
## Work with an experienced AuctionWorx development partner
Systenics Solutions is a RainWorx Premium Partner delivering AuctionWorx customization, bespoke development, mobile apps, and add-on products.
We have 15+ years of experience building and customizing AuctionWorx solutions for clients of all sizes. Our close partnership with the RainWorx team helps us deliver complex marketplace workflows, integrations, and operational improvements with less trial and error.
Deep understanding of AuctionWorx codebase helps us deliver faster and more powerful complex solutions for our clients across several business domains. Our processes have been fine-tuned over the years to ensure 100% project success and on-time delivery.
[Get in Touch Now!](#)
## End to End Solutions for Every Domain
#### Tailored AuctionWorx architectures across industries
### Antiques & Collectibles
Showcase rare items with curated catalog collections, provenance tracking, high-resolution zoom galleries, and interactive community discussion boards to connect passionate collectors with vintage treasures.
[Learn More *](https://www.systenics.com/auctionworx/power-your-antiques-collectibles-auction-marketplace-with-systenics/) *
### Automobile Buy & Sell
Empower automotive bidding with automated VIN decoding, 360° interactive damage annotation tools, ChromeData/CarProof vehicle history integrations, and radius-based geographic inventory search.
[Learn More *](https://www.systenics.com/auctionworx/end-to-end-solution-for-your-used-rare-or-new-automobile-auctions/) *
### E-Commerce Overstock
Dominate the digital shelf with Amazon SP-API integrations for automated catalog ingestion, box-damage grading, reverse logistics management, and bulk liquidation workflows.
[Learn More *](https://www.systenics.com/auctionworx/end-to-end-solution-for-auction-of-ecommerce-overstock-box-damaged-and-returned-items/) *
### Livestock & Husbandry
Connect ranchers and breeders with multi-generation lineage tracking family trees, medical history logs, weight tracking, and precision GPS location search for transparent livestock sales.
[Learn More *](https://www.systenics.com/auctionworx/streamline-livestock-auctions-with-systenics-end-to-end-solutions/) *
### Estate Sales & Liquidation
Streamline on-site estate liquidations with rapid mobile inventory intake, integrated appraisal valuation tools, verified buyer bidding networks, and scheduled curbside pickup appointments.
[Learn More *](https://www.systenics.com/auctionworx/end-to-end-solution-for-estate-sales-auctions-with-systenics/) *
### Property & Real Estate
Scale commercial and residential property auctions with automated bidder proof-of-funds verification, secure escrow deposit holds, CRM synchronization, and legal document vaults.
[Learn More *](https://www.systenics.com/auctionworx/power-your-property-auctions-with-systenics-innovative-end-to-end-solutions/)
## Our AuctionWorx Products
#### Turnkey add-ons, integrations & mobile extensions
*
### AuctionWorx Mobile Apps
Native iOS & Android Applications
Expand your active buyer pool by 50% with full-featured native iOS & Android apps. Features real-time push alerts for outbids, ending auctions, and instant biometric checkout.
[Learn More *](https://www.systenics.com/auctionworx/mobile-apps/) *
### Warehouse Management
Unified Inventory & Logistics
Centralize your physical auction floor with bin/rack location tracking, batch QR code printing, parcel label generation, and buyer appointment scheduling in a unified dashboard.
[Learn More *](https://www.systenics.com/auctionworx/warehouse-management/) *
### Live Auctions
High Definition Live Streaming
Broadcast live floor auctions to thousands of remote bidders in real time with ultra-low latency HD audio/video streaming, interactive clerking screens, and instant synchronized bidding.
[Learn More *](https://www.systenics.com/auctionworx/live-auctions/) *
### Excel Upload Plug-In
Bulk Listing Creation Tool
Create hundreds of auction listings 75% faster directly within Microsoft Excel. Includes direct image upload integrations, schema validation, and automated category mapping.
[Learn More *](https://www.systenics.com/auctionworx/listings-creation-excel-plugin/) *
### AI Description Generation
Automated & Unique Descriptions
Generate compelling, keyword-rich, and accurate listing descriptions automatically using enterprise-grade OpenAI models, enhancing search engine discoverability and buyer conversion.
[Learn More *](https://www.systenics.com/auctionworx/ai-enhanced-listings-description-generation/) *
### Barcode Listing Creation
Scan & Auto-Populate Listings
Accelerate cataloging by scanning UPC/EAN barcodes to automatically pull specifications, titles, and high-res images from major retail databases like Amazon and Home Depot.
[Learn More *](https://www.systenics.com/auctionworx/barcode-listing-creation/) *
### Community Feed
Comments, Replies, Votes & Bids
Transform auction listings into high-trust social discovery hubs with live comment threads, expert seller Q&A, upvoting, and real-time bid activity streams.
[Learn More *](https://www.systenics.com/auctionworx/community-activity-feed/) *
### Dutch Auctions
Descending-Price Auction Engine
Move bulk surplus inventory quickly with automated descending-price Dutch auction mechanics, scheduled automated price drops, and multi-quantity checkout support.
[Learn More *](https://www.systenics.com/auctionworx/dutch-auctions/) *
### Volume Buy
Tiered Bulk Pricing
Maximize average order value and attract wholesale B2B buyers with configurable quantity-based tier pricing, dynamic discount tables, and bulk ordering workflows.
[Learn More *](https://www.systenics.com/auctionworx/volume-buy/)
## Custom Modules
#### Specialized components implemented in AuctionWorx
*
### SMS Integration
Twilio & Nexmo SMS alerts for bids, outbids & wins
### Native URL Shortener
Branded short links without third-party plugins
### Auto-Complete Search
Instant listing, category & seller query suggestions
### Progressive Web App (PWA)
Fast, installable offline-capable browser app
### Restricted Access Listings
Gated dealer tiers & verified member viewing rules
### Admin 2-Factor Auth
Enhanced MFA security for admin control panel
### Custom Carousel Control
Dynamic featured lot & promotional banner rotators
### Homepage Ads & Listings
Monetized vendor banner placements & hero spots
### Similar Listings Engine
Contextual lot recommendations to increase views
### Spire .Doc/.XLS Reports
Automated invoice, manifest & settlement exports
## Custom Features & Integrations
#### Engineered to extend AuctionWorx platform capabilities
### Azure Cloud Deployment
High-availability auto-scaling infrastructure on Microsoft Azure
### SMS Notifications
Automated real-time SMS outbid & payment reminders
### Geolocation Search
Radius & distance search based on user and item coordinates
### Spire.Net Custom Reporting
Bespoke financial, seller settlement, and tax report generation
### Credit Hold Authorization
Pre-authorize credit card deposits before allowing bidding
### Shipment Tracking
Live carrier status integration with FedEx, UPS, and USPS
### Bespoke UI Customization
Tailored brand identity, responsive layouts, and modern themes
### ChromeData / CarProof
Integrated automotive vehicle history and equipment specs
### Analytics & GA4 Events
Comprehensive e-commerce funnel tracking and custom reporting
### Multilingual Support
Localized multi-language interfaces and international currencies
### Coupons & QR Code Scan
Promotional discount codes and rapid QR lot check-in tools
## Frequently Asked Questions
#### Everything you need to know about AuctionWorx customization
###
As a RainWorx Premium Partner with 15+ years of platform experience, Systenics builds custom features for AuctionWorx Enterprise and Events editions. Development services include custom bidding models like [Dutch auctions](https://www.systenics.com/auctionworx/dutch-auctions/) and sealed bids, tailored UI/UX design, third-party integrations (CRM, payment gateways, ERP, Twilio, and ChromeData), cloud deployments on Microsoft Azure, and ongoing platform maintenance.
###
Custom development is structured across clear milestones. We start with a free discovery call to review requirements and provide an initial ballpark estimate. Next, we prepare UI/UX mockups and detailed specifications to establish a refined budget before starting development. Learn more about fixed pricing options on our [AuctionWorx pricing page](https://www.systenics.com/auctionworx/pricing/).
###
Systenics offers pre-built products with deployment included as a one-time purchase. Available products include [white-label iOS and Android apps](https://www.systenics.com/auctionworx/mobile-apps/) starting at $1,799, the [Barcode Listing Creation plugin](https://www.systenics.com/auctionworx/barcode-listing-creation/) ($2,799), [AI-Enhanced Listing Descriptions](https://www.systenics.com/auctionworx/ai-enhanced-listings-description-generation/) ($2,699), the [Excel Upload Plugin](https://www.systenics.com/auctionworx/listings-creation-excel-plugin/) ($499), and the [Community Activity Feed](https://www.systenics.com/auctionworx/community-activity-feed/) ($399).
###
Systenics builds specialized tools tailored to specific auction models. Examples include real-time HD video and audio streaming for hybrid floor auctions via [Live Auctions](https://www.systenics.com/auctionworx/live-auctions/), physical inventory management with [WHMSPro warehouse management](https://www.systenics.com/auctionworx/warehouse-management/), automated VIN decoding for auto auctions, and bulk Excel ingestion tools.
###
Yes. Systenics handles platform upgrades, data migrations, server transfers, and custom code refactoring to move older AuctionWorx installations to current releases on Microsoft Azure cloud infrastructure.
## AuctionWorx (How to?)
#### Training Videos
*
##### How to Copy Lots within Events in AuctionWorx
* *
##### Bulk Relist Feature on AuctionWorx Events
* *
##### Make an Offer Feature on the AuctionWorx Events
[Explore Full Video Library**](https://www.systenics.com/auctionworx/videos/)
---
## Page: AuctionWorx Warehouse Management System (WMS) | Systenics
URL: https://www.systenics.com/auctionworx/warehouse-management/
Description: A unified warehouse management ecosystem built specifically for AuctionWorx. Streamline inventory, packaging, and delivery.
# Warehouse Management
## Built for AuctionWorx.
Centralize warehousing, racks, inventory, packaging, appointments, and delivery for your business — all in one unified AuctionWorx WMS ecosystem.
[Request a Demo](#)
## Key Highlights
### Unified Auction & Warehouse System
Extend AuctionWorx from just bidding to full operations — manage inventories, warehouse flow, and logistics in one place.
### Employee Management
Create warehouse staff, define roles, and assign permissions easily for efficient operational control.
### Add Warehouses & Racks
Digitize your physical layout by adding warehouses and rack structures with intuitive tools.
### Smart Inventory & QR Labels
Label products and racks with QR codes and map them for accurate tracking and fast picking.
### Calendar Appointment Booking
Let buyers book time slots intelligently with visibility into high and low traffic periods.
### Packaging & Delivery Optimization
Staff can pick, pack, and dispatch orders quickly with PIN-verified delivery confirmation.
## How It Works
Centralize warehousing, racks, inventory, appointments, packaging, and delivery — all inside one unified AuctionWorx ecosystem.
1
#### [Add Warehouse Employee](https://www.youtube.com/watch?v=sFgJYwUIe_E&list=PLTDJEB2ocIzLJ-Q8rBE_WdHO1sa7a_cob&index=1)
Add employees to AuctionWorx in just a few steps! This quick guide shows how sellers can easily create employee accounts, assign roles, and control access using the Employee Management feature.
2
#### [Add Warehouse](https://www.youtube.com/watch?v=0YM1R20RbwM&list=PLTDJEB2ocIzLJ-Q8rBE_WdHO1sa7a_cob&index=2)
Add a new warehouse in AuctionWorx in just a few steps! This quick guide shows how sellers can easily create and manage warehouse locations using the Warehouse Management feature.
3
#### [Upload Racks](https://www.youtube.com/watch?v=JBat9TJspiE&list=PLTDJEB2ocIzLJ-Q8rBE_WdHO1sa7a_cob&index=3)
Upload warehouse racks in AuctionWorx using CSV in just a few steps! This quick guide shows how to download the rack template, prepare rack data, and upload racks in bulk using the Warehouse Management feature.
4
#### [Create Inventory](https://www.youtube.com/watch?v=Yv3-Y5jqIjE&list=PLTDJEB2ocIzLJ-Q8rBE_WdHO1sa7a_cob&index=4)
Create inventory in AuctionWorx quickly and accurately! This quick guide shows how to add missing inventory, automatically generate inventory for new listings, and assign items to racks using QR codes.
5
#### [Print & Assign Product QR](https://www.youtube.com/watch?v=LUIi6GEtgtc&list=PLTDJEB2ocIzLJ-Q8rBE_WdHO1sa7a_cob&index=5)
Print and assign Product QR Codes in AuctionWorx in just a few steps! This quick guide shows how to generate QR labels, assign them to inventory items, and map products to rack locations using QR scanning.
6
#### [Assign Rack](https://www.youtube.com/watch?v=HhOvgwRGgLM&list=PLTDJEB2ocIzLJ-Q8rBE_WdHO1sa7a_cob&index=6)
Assign inventory to rack locations in AuctionWorx with ease! This quick guide shows how to assign rack labels by scanning Rack QR codes or entering rack paths manually—ensuring accurate storage and quick item retrieval.
7
#### [Schedule Appointments](https://www.youtube.com/watch?v=7At39aaUxOM&list=PLTDJEB2ocIzLJ-Q8rBE_WdHO1sa7a_cob&index=7)
Set up appointment templates and schedule slots in AuctionWorx effortlessly! This quick guide shows how to create reusable appointment templates and generate booking slots for buyers using the Appointment Management feature.
8
#### [Booking Appointments](https://www.youtube.com/watch?v=U8mqTcmQL30&list=PLTDJEB2ocIzLJ-Q8rBE_WdHO1sa7a_cob&index=8)
Book pickup appointments in AuctionWorx in just a few steps! This quick guide shows how buyers can select invoices, choose a date and time slot, confirm bookings, and add appointments to their calendar.
9
### [Invoice Packaging](https://www.youtube.com/watch?v=xu0C4h9XmXg&list=PLTDJEB2ocIzLJ-Q8rBE_WdHO1sa7a_cob&index=9)
Package invoice items efficiently in AuctionWorx! This quick guide shows how staff can pick invoice items, handle retained or skipped items, and assign new rack locations during the packaging process.
10
### [Attend Delivery](https://www.youtube.com/watch?v=uQ4PwVJQKjU&list=PLTDJEB2ocIzLJ-Q8rBE_WdHO1sa7a_cob&index=10)
Handle delivery appointments smoothly in AuctionWorx! This quick guide shows how staff can attend delivery appointments, verify payments, assign dispatchers, and confirm deliveries using Delivery PIN verification.
11
### [Final Delivery](https://www.youtube.com/watch?v=mHMq0Z7f9Pg&list=PLTDJEB2ocIzLJ-Q8rBE_WdHO1sa7a_cob&index=11)
Complete delivery pickups securely in AuctionWorx! This quick guide shows how buyers can verify bookings, review packages, and confirm delivery using a secure Delivery PIN for smooth handover.
## Detailed Walkthrough
Deep-dive into each feature with our comprehensive video tutorials.
### Employee Access & Role Management
### Manage Warehouses Efficiently
### How to Manage & Allocate Warehouse Racks
### Bulk Upload Racks with CSV
### Create Inventory & Assign Racks
### Print & Assign Product QR Codes
### How to Relocate Inventory Using QR Codes
### Schedule Appointment Slots
### How Buyers Book Pickup Appointments
### Staff Invoice Packaging Workflow
### Invoice Packaging for Skipped Items
### Attend Delivery Appointments
### Customer Delivery Pickup Experience
## See It In Action
Request a live demo and experience the Warehouse Management difference.
[Book a Demo](#)
---
## Page: Careers at Systenics
URL: https://www.systenics.com/jobs/
Description: Meet the Systenics Superhero Squad and see how we work. All positions are currently closed — check back for future openings in .NET, AI and mobile development.
# Join Our
Superhero
Squad
[Check Open Positions](#) Check Us on [*](https://www.linkedin.com/company/systenics-solutions)
## Freshers to Superheroes
### (Vita-Rays that transform)
#### In-depth
Training
Our freshers undergo an extensive 3-6 months of training which equips them with all our power tools (HTML, CSS, JS, C#, .NET and more!) to transform them into Superheroes!
#### Mentors
Having our founders and experts as their mentors through their journey, our freshers are given the opportunity to learn from and work with the best.
#### International
Exposure
As an offshore company, we never limit ourselves to geography. Since we cater to a global clientele our squad gains exposure from all over the world.
#### Personalised
Career Path
We have performance reviews and career meetings where our employees can discuss with us their goals for the next stretch and chart their career trajectories.
## Fresh Recruits
Arshad Viva Institute of Technology (2023) Jayesh SSBT COET Jalgaon (2023) Naresh S. Thakur College of Science & Commerce (2023) Palash Pillai HOC College of Engineering & Technology (PHCET) (2023) Rohan Annasaheb Chudaman Patil College of Engineering (ACPCE) (2023) Sohan. Genba Sopanrao Moze College Of Engineering (GSMCOE) (2023) Tushar Vasantdada Patil Prathisthans' College Of Engineering (VPPCOE) (2023) Jaydip Lukhdhirji Engineering College, Morbi (2023) Adarsh Jamia Millia Islamia (2022) Arjun Viva Institute of Technology (2022) Shubham P. SIES College of Management Studies (2022) Vishal A. C. Patil College (2022) Yash New Horizon Institute of Technology and Management (NHITM) (2022) Yasar V.V.P ENGINEERING COLLEGE RAJKOT (2022) Milan Marwadi Education Foundation (2022) Taapas V.V.P. Engineering College (2022) Netra Keraleeya Samajam's Model College (2021) Shivkumar J. K. College of Science and Commerce (2021) Shubham G. Vidyavardhini's College of Engineering and Technology (VCET) (2021) Rupesh Rajiv Gandhi College of Arts, Commerce & Science (2019)
## Squad Advantages
### Power
Tools
The sky is the limit to learning when you work at Systenics. We are constantly harnessing the latest technologies and power tools.
### Global
Missions
Being a part of the Systenics Squad opens up doors worldwide- from communicating with foreign clients to using the latest international technologies.
### Hotspot for
Superwomen
Systenics is a hotspot for many Superwomen who dream big and aim higher! We foster an environment that equips and empowers our women employees.
### Yearly
Boosters
With our annual performance appraisals and salary increments we ensure that you grow at Systenics- as a person and a professional.
## How to Join Us?
Step 1 Apply
Apply through your college
OR
Apply Online
Step 2 HR
Interview
Attend a scheduled interview with our Human Resources personnel
Step 3 Coding &
Technical Round
Solve our coding questions to show us your technical expertise.
Step 4 Interview
with Founders
A final interview to discuss your career trajectory and future at Systenics.
## Job Openings
[*Getting Hired in Systenics as Fresher](https://www.systenics.com/blogs/getting-hired-at-systenics-as-fresher/) *
##
#### Apply for Trainee Software Developer
Full Name * Email Address * Phone Number * College Name Degree Year of Passing Resume * PDF, DOC, DOCX (Max 5MB) *
#### Application Submitted!
Thank you for applying. Our team will evaluate your resume. Only selected candidates will hear back from us within 1 week.
**
#### Submission Failed
Something went wrong. Please try again later.
---
## Page: Custom Software Development for Small Business | Systenics
URL: https://www.systenics.com/solutions/
Description: Dedicated .NET teams, AI integration and app modernization for SMBs. Fixed-cost discovery and MVP phases — know your full budget before development begins.
# Custom Software
for Your Business:
Our Squad Delivers
## 100% Mission success
## Our Super-Powers
### Bespoke Software Development
Custom Platforms for Small Business
Custom software development for small businesses and entrepreneurs — from MVP to full-scale platform, tuned to bring your ideas into fruition.
Every client has a different need, different set of business problems to solve, different goals for the solutions that they want to build. We harness the power of latest technologies like Docker, Kubernetes, ASP.NET Core, Angular, MS Azure, OpenAPI in the right mix, to solve the business problems for our clients.
### Dedicated Development Squad
Extended Development Center
Your own dedicated .NET development team on a monthly mission, so you can focus on your business while we take care of all technology requirements.
Our extended development center service provides a fully managed, expert, dedicated offshore development team without any hassle of HR, project management, office space etc. Senior developers, timezone overlap with your team, zero hiring overhead.
### AI Integration
Document Processing, Chat Assistants, Automation
Our dedicated AI squad integrates artificial intelligence into your business applications — features that ship to production, not science experiments.
From AI document processing and data extraction to chat assistants and workflow automation, we build on Azure OpenAI and Semantic Kernel. Explore our AI lab's field notes at [Systenics AI](https://systenics.ai/) to see the squad's experiments in action.
### Application Platform Customization
AuctionWorx, Umbraco CMS, Nopcommerce
We provide application customization and development services for some of the following popular platforms
- [AuctionWorx Development and Customization Services](https://www.systenics.com/auctionworx/development-and-customization/)
- Content Management Systems - Umbraco, DotNetNuke
- eCommerce Platform - Nopcommerce
### Technical Consultancy
Consulting Services
For Clients who already have a development team in place but are looking for requirements analysis, architectural guidelines, prototype development, best development practices and pilot applications etc.
Our expert Squad can provide professional in-depth recommendations and guidelines for their development team to build upon.
### Mobile Development
Android, iOS, Universal Mobile Apps
We use the powerful and popular Angular and Ionic Framework to deliver cross platform hybrid mobile apps which are cost effective as well as immersive.
Mobile device proliferation has certainly trounced traditional platforms. We provide best in class Hybrid HTML5 based mobile app development for Android and iOS.
### DevOps on Microsoft Azure Cloud and AWS
Build CI/CD Pipelines, Automate Cloud Infrastructure
Every large scale project needs a CI/CD pipeline to ensure faster and modular deployments to various environments
Its essential for any Cloud Based Solutions to have DevOps Automation. Our squad is capable of configuring CI/CD pipelines in various platforms like Azure DevOps, Github Actions, Jenkins, Team City etc.
## Why choose us for your Missions?
### Technology / Domain Expertise
Our CEO has been Microsoft MVP for four consecutive years as well as he has authored and technical edited many books on .NET technologies. We are Microsoft Gold Partners on the Microsoft Azure Platform, we are Premium Partners for AuctionWorx.
### Listen and Deliver Outcomes
One of our core values is to LISTEN to our clients. Our Squad leaders are super sensitive to listening, analyzing and building what the client NEED's and ensuring delivery of 100% successful mission outcomes.
### In Budget, On Time, Quality Development
We work on flexible payment terms, selecting the right pricing model which makes sense for client needs. Our Squad processes have been fine tuned to ensure 100% mission success on time and on budget. No surprises, No hidden costs, No date slips!
### Honesty and Transparency
We have our clients best interests at our heart, always! Clients have complete visibility of the development progress to ensure the end result is always as per their expectations.
## How we save the day, the Systenics way!
Stage 1
#### Requirements Gathering and Planning
The most important step is the first one, where our Squad Leaders work with the client's team to listen and collaboratively build on the requirements for the mission.
Stage 2
#### Iterative Development
We begin development in sprints/iterations, keeping the client's team updated at every step with frequent test builds and mockups.
Stage 3
#### Final Production Deployment
On completion of the development and testing cycle, the application is finally installed/staged to the production servers.
Stage 4
#### Support and Maintenance
We have support coordinators and support ticketing systems in place to ensure our clients get timely support for their issues.
## Mission Briefing: Your Questions
###
Most of our SMB missions start with a fixed-cost discovery and MVP phase, so you know the full budget before development begins. We work on flexible pricing models — fixed cost per milestone or a dedicated monthly squad — with no hidden charges and no date slips.
###
Yes. Most of our clients are in the US, Canada, UK and Australia. Our squad schedules daily overlap hours with your timezone for standups, demos and support, and all communication happens in English over your preferred tools.
###
You do — 100%. All code, designs and documentation produced during your mission are your intellectual property, transferred in full, with source hosted in repositories you control.
###
A dedicated development squad is your own hand-picked team of Systenics .NET developers working exclusively on your product every month. We handle HR, mentoring, infrastructure and project coordination — you get senior engineering capacity without the overhead of hiring.
###
Microsoft .NET (ASP.NET Core, C#), Azure cloud, Angular, Ionic mobile apps, AI integration with Azure OpenAI and Semantic Kernel, plus platform customization for AuctionWorx, Umbraco and Nopcommerce.
###
Book a free discovery call. Our squad leaders listen to your business problem, then produce a requirements plan, architecture recommendation and transparent estimate — before you commit to anything.
---
## Page: Custom Software Development for SMBs | Systenics
URL: https://www.systenics.com/
Description: Our Superhero Squad builds custom AI, cloud, web and mobile platforms on .NET & Azure for SMBs and entrepreneurs — fixed-cost delivery, 100% launch success.
# We help build *success* build ** Custom Software
## Your partners from Concept to Exit
SMBs and entrepreneurs engage our Superhero Squad to build custom solutions for their business problems — with 100% launch success**
[Connect for mission launch](#)
## Our Super-Powers, Your Solutions
Whatever business problem stands in your way, our Squad has a power for it.
### Custom Platform Builds
Bespoke web and cloud platforms — marketplaces, portals and line-of-business apps built on ASP.NET Core and Azure, from first sketch to Mission Launch.
### AI Integration
Our dedicated AI squad wires intelligence into your business — document processing, chat assistants and automation that actually ship.
### Dedicated Development Squad
Your own hand-picked .NET squad on a monthly mission — senior developers, zero HR overhead, overlap with your timezone.
### AuctionWorx Customization & Products
AuctionWorx customization, migration, add-on products, and mobile apps built to scale your auction marketplace.
[Explore All Our Super-Powers](https://www.systenics.com/solutions/)
## Products Forged by Our Squad
Ready-to-deploy sidekicks that solve real business problems today — no waiting for a custom build.
### Data Standardize
Transform messy spreadsheets into pristine data. AI-powered cleaning, validation, and intelligent column mapping turn chaotic datasets into consistent output in minutes.
[Power Up](https://datastandardize.com/)
### BidOnlineAuction
Turn your Shopify store into a live auction arena — real-time bidding, countdown timers and popcorn bidding that keep buyers on the edge of their seats.
[Power Up](https://bidonlineauction.com/)
### Bank Statements CSV
PDF bank statements converted to clean CSV with 99.9% accuracy. No sign-up, files self-destruct in 24 hours — a true secret agent.
[Power Up](https://bankstatementscsv.com/)
### Card Statement CSV
Credit card statements to spreadsheet-ready CSV in one leap. Perfect for bookkeeping, expense tracking and reconciliation missions.
[Power Up](https://cardstatementcsv.com/)
### WHMSPro
Your entire warehouse operation under one roof — inventory, orders and fulfillment with QR-powered workflows. No special hardware required.
[Power Up](https://whmspro.com/)
### EquipRoute
Complete software for used equipment dealers — collect from consigners, store and QR-tag stock, publish listings, and deliver with a driver app.
[Power Up](https://equiproute.com/)
### LiquidationRoute
Warehouse software for liquidation auctions — reconcile manifests, grade and bin returns at the dock, build auction lots, and streamline buyer pickup.
[Power Up](https://liquidationroute.com/)
### LotsRoute
Free reseller inventory app — log purchases, calculate true costs, track auction & estate sale flips, and monitor profit offline on your phone.
[Power Up](https://www.lotsroute.com/) [See All Products](https://www.systenics.com/products/)
## Cross Domain Expertise
- Ecommerce
- Pharma
- Insurance
- Auctions
- Automobile
- Real Estate
## Our Clients, Our Champions who Vouch for Us!
### "surpassed my expectations!"
Coming from a non-technical background, Saurabh and his team at Systenics took my business idea and turned it into a fully functional application which surpassed my expectations! You can be sure with them that all your IT related concerns will be covered.
** Shobhan Shah CEO - IITJobs Inc **
### "only one was actually able to get the job done."
The ability Systenics showed in code signing and deploying my click once code in Microsoft visual was truly awesome. I interviewed and tested 6 different development companies and only one was actually able to get the job done - that was Systenics Solutions! Professional, courteous and reliable - I highly recommend them and am very happy and eager to continue growing our business relationship now and in the near future. Thank you Saurabh
** Andre Pierre President - Tech Fix Unlimited **
### "A completely satisfied customer!"
I contracted with Systenics about 6 months ago, in an effort to customize auction software for a new company I am launching in the US. The entire process was as smooth as could be. Their estimate for the project was reasonable, and very close to the final number. I would absolutely use this company again, and I have so much confidence in their ability to work with me, I even agreed to a support agreement with them long term.
** Joe Lefebvre CEO - Pharmabid, LLC **
### "They were very thorough in project discussions"
Systenics did a great job on our customization, they clearly understood the requirements and completed the task in a timely manner. They were very thorough in project discussions and made sure that we understood how the customization works and suggested improvements when required
** Mike Singh CEO - Dr. Liquidator **
### "increase our profitability."
Systenics Solutions deep understanding of the AuctionWorx platform has been invaluable to our business. They've helped us optimize our operations and increase our profitability.
** Neal Barnhill CTO - A-Stock **
### "stay ahead of the competition."
Systenics Solutions has consistently delivered innovative solutions that have helped us stay ahead of the competition.
** Rob Gaughan CTO - Pedigree Sales **
### "I have now found the perfect team"
After the inception of Lystabook in 2016, finding a team of programmers that displayed the team work, professionalism, and exuded the confidence I was searching for was difficult to come by until 2018 the year I met the magnificent team at Systenics Solutions.
** Reginald Richardson CEO - Lystabook LLC **
### "has been instrumental"
Systenics Solutions has been instrumental in the success of our online auction platform. Their development services are top-notch.
** Simon Willey CEO - MaxOGun **
### "professionalism and commitment to excellence"
Working with Systenics Solutions has been a pleasure. Their professionalism and commitment to excellence set them apart.
** Tony Director - MaxOGun **
### "reliable and solutions-focused development partner"
As an Implementation Specialist, I had the opportunity to work closely with the Systenics team throughout the delivery of a highly-customised platform.**
From project scoping to launch, the team consistently demonstrated professionalism, responsiveness, and strong technical expertise. Their structured approach and clear communication ensured all of us remained informed and aligned, while their proactive mindset helped identify potential challenges early and provide practical solutions to meet our bespoke requirements.
Their commitment to delivery also enabled us to successfully launch the platform ahead of schedule.
I would confidently recommend Systenics to any organisation seeking a reliable and solutions-focused development partner for the delivery of a customised platform.
Ged Sacramento Implementation Specialist - Gratifii **
### "executing perfectly and always delivering on time"
Working with Systenics and Auctionworx has been fantastic! Their experts provide highly professional service, executing perfectly and always delivering on time. I look forward to our ongoing collaboration and excellent results.
** Nader Abo Saleh Head of Ecommerce - AG Holding **
### "always be counted on to deliver on time and within budget"
Systenics has been a trusted and effective development partner for us since 2019. As a CTO and CEO, I've been involved in the creation of technology companies and platforms for over three decades and this is the best relationship I've ever had with a team of out-of-house developers.
** Ted Silverman CEO - Homesale Plus **
## Why choose Systenics for your critical missions?
-
-
-
### Cloud and AI based Solutions
We are at the cusp of exciting new discoveries in Cloud and AI space which are transforming every business and its processes. Our Super Hero Tech Squad excels at building bespoke solutions to help your business leverage the power Cloud and AI to build innovative solutions. We have built [dedicated AI squad](https://systenics.ai/) to cater to this emerging market.
### AuctionWorx Premium Partner
We are Premium Partners for RainWorx's [AuctionWorx platform](https://www.systenics.com/auctionworx/). We have a suite of products, mobile apps and pre-built solutions for the AuctionWorx platform. Our in-depth partnership with AuctionWorx and our squad's years of experience ensures that we can deliver scalable and complex bespoke solutions, from [development and customization](https://www.systenics.com/auctionworx/development-and-customization/) to mobile apps and integrations.
### Microsoft .Net Platform Experts
Our Squad has deep expertise on the Microsoft .NET Platform. ASP.NET Core, Blazor, MAUI, TypeScript, MS SQL, LLM's and other Azure based cloud technologies. Building on the trusted Microsoft platform ensures that your solution is enterprise grade and scalable.
### Diversely Skilled Squad
We have assembled a diversely skill-full squad who engages with our clients at their comfort levels. Our Squad leaders can engage with both Technical and Non-Technical clients equally comfortably. Most of our clients are non-technical, our Squad Leaders have in-depth experience to guide them through the technological maze.
### Listen and Deliver Outcomes
One of our core values is to LISTEN to our clients. Our Squad leaders are super sensetive to listening, analyzing and building what the client NEED's' and ensuring delivery of 100% successful mission outcomes.
### Technology / Domain Expertise
Our CEO has been Microsoft MVP for four consecutive years as well as he has authored and technical edited many books on .NET technologies. We are Microsoft Gold Partners on the Microsoft Azure Platform, we are Preminium Partners for AuctionWorx.
### In Budget, On Time, Quality Development
We work on flexible payment terms, selecting the right pricing model which makes sense for client needs. Our Squad processes have been fine tuned to ensure 100% mission success on time and on budget.
### Honesty and Transparency
We have our clients best intrests at our heart, always! Clients have complete visibility of the development progress to ensure the end result is always as per the their expectations to ensure 100% mission success.
### 1. Requirments Gathering and Planning
The most important step is the first one, where our Squad Leaders work with the client's team to listen and collobratively build on the requirements for the mission.
### 2. Iterative Development
We begin development in sprints/iterations, keeping the client's team updated at every step with frequent test builds and mockups to ensure that they are fully updated on the progress.
### 3. Final Production Deployment
The application is finally installed/staged to the production servers and the client's team is given a short training on the solution.
### 4. Support
We have support co-ordinators and support ticketing systems in place to ensure our client's get timely support for their issues to ensure worry-free production experience.
## Fresh Dispatches from the Squad
30-Sept-2026
### [AuctionWorx vs the Alternatives: Choosing Your Auction Platform](https://www.systenics.com/blogs/auctionworx-vs-alternatives-choosing-your-auction-platform/)
An honest comparison of AuctionWorx against SaaS auction tools, PHP scripts and no-code marketplace builders, from a team that's built on it for 15+ years.
30-Sept-2026
### [How to Choose an AuctionWorx Development Partner](https://www.systenics.com/blogs/how-to-choose-an-auctionworx-development-partner/)
Seven questions to ask before hiring anyone to customize your AuctionWorx marketplace, and why RainWorx partner status should be the first one.
20-Sept-2026
### [AuctionWorx Enterprise vs Events Edition](https://www.systenics.com/blogs/auctionworx-enterprise-vs-events-edition-comparison/)
AuctionWorx Enterprise runs marketplace listings with independent closing times, while Events Edition runs scheduled, cataloged auction sales. Here is how to pick.
[Read All Dispatches](https://www.systenics.com/blogs/)
---
## Page: Privacy Policy | Systenics Solutions
URL: https://www.systenics.com/privacy-policy/
Description: How Systenics Solutions collects, uses and protects your personal information across our website and services.
# Privacy Policy
#### Systenics Solutions wants you to fully understand our privacy practices.
Your loyalty as a client, job seeker, customer or visitor is important, and we hope that our concerns regarding your privacy, as described in this policy (the "Privacy Policy" or "Policy"), demonstrate our commitment to making your experience with Systenics Solutions an enjoyable and satisfying one.
Although Systenics Solutions respects the privacy of all those who visit our Web sites and use our online services, we do collect information from our visitors, including job seekers and customers. This Privacy Policy governs your interaction with the Systenics Solutions web site and your registration for and use of Systenics Solutions online services (collectively, the "Services"). Except as set forth within this Privacy Policy and other published guidelines, we do not release personally identifiable information about our members and visitors without their permission.
Note that, by using the Services, you signify your agreement to this Privacy Policy. If you do not agree to this Policy, please do not use the Services. Your continued use of the Services subsequent to changes to this Policy will mean that you accept the changes. If you have any questions regarding this Privacy Policy, or any other privacy issues in connection with the Services please e-mail at info @ systenics.com.
Please read this Privacy Policy to learn more about the ways in which we use and protect your personal information. Systenics Solutions reserves the right to change this Privacy Policy at any time and without any notice by posting a revised Privacy Policy on our Web site. Any such revision will become effective immediately upon posting.
##### Disclosure of Personal Information
We do not share, sell or rent your personal information to third parties – ever.
##### Information We Collect and How We Use That Information
Non-personally identifiable information (information that does not identify a specific individual): When visitors use the Services, we collect and aggregate information indicating, among other things, which pages were visited, the order in which they were visited, and which links were clicked. Collecting such information involves the collection and logging of IP addresses, operating system, and browser software used by each user of the Services. Although such information is not personally identifiable, we can determine from the IP address a visitor's Internet Service Provider and the geographic location of his or her point of connectivity.
The non-personally identifiable information we collect helps us identify the most popular areas of our web site and determine the effectiveness of our promotional activities.
We do not make use of cookies - that is, small text files placed on your computer's hard drive.
##### We do not share, sell or rent your personal information to third parties – ever.
In certain areas of the Services - such as those in which you attach your résumé or send us a request for proposal - we may request that you provide us with certain personally identifiable information, such as your e-mail address and name. We will, in such situations, seek to identify which informational items are required and which are optional.
Job seekers should post profiles and resumes on Systenics Solutions only if they wish such information to be viewed by Systenics Solutions recruitment team.
The Services are not available to children under 18 years of age. We do not knowingly collect personally identifiable information from children under 18 years of age.
Please note that Systenics Solutions cannot control the acts of users of the Services. All members and visitors should be aware that, when they disclose personally identifiable information in a resume or profile or other medium, the information may be collected and used by recruitment team to send that person email from within Systenics Solutions. In the event that you encounter any Systenics Solutions user who is improperly collecting or using information about you or other users, please contact info @ systenics.com.
##### How we use (and do not use) personally identifiable information
Systenics Solutions does not sell, re-sell or distribute for re-sale your personally identifiable information.
Please note that Systenics Solutions reserves the right to disclose information submitted by or concerning any visitor or member as we reasonably feel is necessary to protect our systems or business. Specifically, but without limitation, we reserve the right to disclose such information when a visitor or member is in violation of our Terms of Agreement or other published guidelines, or partakes (or is reasonably suspected of partaking) in any harmful, infringing or illegal activity, even without a subpoena, warrant, or other court order, and to disclose such information in response to court and governmental orders, civil subpoenas, discovery requests, and as otherwise required by law, as well as in response to allegations of infringement.
We cooperate with law enforcement agencies in identifying those who may be using our servers or services for illegal activities. We also reserve the right to report any suspected illegal activity to law enforcement for investigation or prosecution, or to suspend or terminate your membership in connection with any suspected illegal or infringing activity. Finally, Systenics Solutions reserves the right to assign, sell, license, or otherwise transfer to a third party your personally identifiable information in connection with an assignment, sale, joint venture, or other transfer or disposition of any portion or all of Systenics Solutions or its affiliated entities, assets or stock.
All information made available to Systenics Solutions may be made available to our contractors and consultants, and professional advisors (such as attorneys or accountants), but only to the extent necessary for them to perform services on our behalf, and only under a duty of confidentiality.
##### Questions?
Questions regarding this Privacy Policy should be directed to info @ systenics.com
---
## Page: Software Products & AuctionWorx Add-Ons | Systenics
URL: https://www.systenics.com/products/
Description: Data Standardize, EquipRoute, LiquidationRoute, BidOnlineAuction for Shopify, statement converters, WHMSPro WMS and priced AuctionWorx add-ons from a RainWorx Premium Partner.
# Products built by our Superhero Squad
*
## Standardize, Clean and Normalize CSV Data
Messy spreadsheets are the arch-nemesis of every growing business. Data Standardize is the AI-powered sidekick that defeats them — intelligent cleaning, smart column mapping, and automated normalization that turns chaotic CSV files into pristine, consistent datasets in minutes. Built for operations teams, bookkeepers, and anyone drowning in manual data formatting missions.
### Product Details
- Technologies : OpenAI, .NET Core, Gemini AI
- Speciality : CSV & Data Standardization, AI Column Mapping
[Read in Detail *](https://datastandardize.com/)
## BidOnlineAuction — Shopify Auction App
*
Turn your Shopify store into a live auction arena. Our Squad built BidOnlineAuction so merchants can unleash real-time bidding, countdown timers, popcorn bidding, reserve pricing and buy-now options — keeping buyers on the edge of their seats and driving engagement and sales with superhero-grade urgency.
### Product Details
- Technologies : Shopify
- Speciality : Live Bidding, Countdown Timers, Popcorn Bidding
[Read in Detail *](https://bidonlineauction.com/)
## Convert PDF Bank Statement to CSV
*
Your bank statement to clean CSV in one leap — with 99.9% accuracy. No sign-up required, and files self-destruct in 24 hours like every good secret mission. The trusted sidekick for bookkeepers, accountants and business owners on reconciliation duty.
### Product Details
- Technologies : AI, Data Extraction
- Speciality : PDF to CSV Bank Statement Conversion
[Read in Detail *](https://bankstatementscsv.com/)
## Convert Credit Card Statement to CSV
*
Credit card statements, meet your match. Card Statement CSV converts PDF statements to spreadsheet-ready CSV with 99.9% accuracy — no sign-up, files auto-deleted in 24 hours. Expense tracking, bookkeeping and reconciliation missions, completed in seconds.
### Product Details
- Technologies : AI, Data Extraction
- Speciality : PDF to CSV Credit Card Statement Conversion
[Read in Detail *](https://cardstatementcsv.com/)
## WHMSPro – Warehouse Management Software
*
WHMSPro brings your entire warehouse operation under one command center. Our Squad armed it with QR-powered workflows for inventory, orders, storage and fulfillment — no special hardware needed, no chaos left standing. Built for liquidators, resellers and growing operations that outgrew spreadsheets.
### Product Details
- Technologies : Web, Mobile, QR Scanners
- Speciality : Warehouse Management, Order Fulfillment
[Read in Detail *](https://whmspro.com/)
## EquipRoute — Software for Used Equipment Dealers
*
EquipRoute connects every stage of your used equipment dealership from a single platform. Collect from consigners with digital agreements and condition photos, tag and map inventory to warehouse bin locations with QR scans, publish to your sales channels simultaneously, and manage deliveries with a dedicated driver app and verified proof of delivery.
### Product Details
- Technologies : Web, Mobile, QR Scanners, Driver GPS
- Speciality : Consignment Intake, QR Warehouse Management, Delivery Route Proof
[Read in Detail *](https://equiproute.com/)
## LiquidationRoute — Warehouse Software for Liquidation Auctions
*
From dock door to hammer drop, LiquidationRoute is built for liquidation auction operators handling return truckloads. Reconcile supplier manifests at the dock, apply standardized condition grades as labels print, assign warehouse bins via phone camera QR scanning, bundle items into auction lots, and streamline buyer pickup appointments without phone tag or dock congestion.
### Product Details
- Technologies : Web, Mobile, QR Scanners, Multi-Channel API
- Speciality : Manifest Reconciliation, Intake Condition Grading, Lot Building & Buyer Pickup
[Read in Detail *](https://liquidationroute.com/)
## LotsRoute — Free Reseller Inventory & Profit Tracker App
*
LotsRoute is a free, offline-first inventory app for resellers who buy at auctions, estate sales, and flea markets. Log every purchase, calculate true costs including buyer's premium and fees, track your flips from purchase to sale, and monitor profit at a glance on your phone. Works 100% offline with no account, no email, and no cloud tracking required.
### Product Details
- Technologies : iOS, Android, SQLite, Local Offline Storage
- Speciality : On-Device Inventory Ledger, Event Purchase Tracking, Profit Analytics, Zero Account/Email Required
[Read in Detail *](https://www.lotsroute.com/)
## AuctionWorx Add-Ons
Running an AuctionWorx marketplace? Our Squad has built a full arsenal of add-ons and extensions for the platform — see [transparent one-time pricing](https://www.systenics.com/auctionworx/pricing/) for every add-on below.
- [Mobile Apps for iOS & Android](https://www.systenics.com/auctionworx/mobile-apps/)
- [Live Auctions — Real-Time Audio & Video](https://www.systenics.com/auctionworx/live-auctions/)
- [Warehouse Management System (WMS)](https://www.systenics.com/auctionworx/warehouse-management/)
- [Listings Creation Excel Plug-In](https://www.systenics.com/auctionworx/listings-creation-excel-plugin/)
- [AI Enhanced Listing Descriptions](https://www.systenics.com/auctionworx/ai-enhanced-listings-description-generation/)
- [Barcode Listing Creation](https://www.systenics.com/auctionworx/barcode-listing-creation/)
- [Community & Activity Feed](https://www.systenics.com/auctionworx/community-activity-feed/)
- [Dutch Auctions Engine](https://www.systenics.com/auctionworx/dutch-auctions/)
- [Volume Buy — Tiered Bulk Pricing](https://www.systenics.com/auctionworx/volume-buy/)
- [Development & Customization Services](https://www.systenics.com/auctionworx/development-and-customization/)
---
## Page: Systenics Blog | Insights on AuctionWorx, .NET, Web Dev & AI
URL: https://www.systenics.com/blogs/
Description: Explore our latest insights on AuctionWorx development, web technology trends, and how we
# Blogs
27 Mar 2024 0 Comments
## [Systenics Website Reimagined - Relaunch!](https://www.systenics.com/blogs/systenics-website-relaunch/)
**by:** Saurabh Nandu **in:** General **tags:**[*website*](https://www.systenics.com/blogs/tag/website/)
Systenics Solutions has reimagined itself over the years and a brand-new website has been designed and launched which demonstrates our core values.
[Continue Reading](https://www.systenics.com/blogs/systenics-website-relaunch/) *
## Latest Posts
30 Sept 2026 0 Comments
### [AuctionWorx vs the Alternatives: Choosing Your Auction Platform](https://www.systenics.com/blogs/auctionworx-vs-alternatives-choosing-your-auction-platform/)
**by:** Saurabh Nandu **in:** General **tags:** [AuctionWorx*](https://www.systenics.com/blogs/tag/auctionworx/)
An honest comparison of AuctionWorx against SaaS auction tools, PHP scripts and no-code marketplace builders, from a team that's built on it for 15+ years.
[Continue reading](https://www.systenics.com/blogs/auctionworx-vs-alternatives-choosing-your-auction-platform/) 30 Sept 2026 0 Comments
### [How to Choose an AuctionWorx Development Partner](https://www.systenics.com/blogs/how-to-choose-an-auctionworx-development-partner/)
**by:** Saurabh Nandu **in:** General **tags:** [*AuctionWorx*](https://www.systenics.com/blogs/tag/auctionworx/)
Seven questions to ask before hiring anyone to customize your AuctionWorx marketplace, and why RainWorx partner status should be the first one.
[Continue reading](https://www.systenics.com/blogs/how-to-choose-an-auctionworx-development-partner/) 20 Sept 2026 0 Comments
### [AuctionWorx Enterprise vs Events Edition](https://www.systenics.com/blogs/auctionworx-enterprise-vs-events-edition-comparison/)
**by:** Saurabh Nandu **in:** General **tags:** [*AuctionWorx,*](https://www.systenics.com/blogs/tag/auctionworx/)[*Auction Platform,*](https://www.systenics.com/blogs/tag/auction-platform/)[*Comparison*](https://www.systenics.com/blogs/tag/comparison/)
AuctionWorx Enterprise runs marketplace listings with independent closing times, while Events Edition runs scheduled, cataloged auction sales. Here is how to pick.
[Continue reading](https://www.systenics.com/blogs/auctionworx-enterprise-vs-events-edition-comparison/) 20 Sept 2026 0 Comments
### [AuctionWorx Upgrade Playbook: Protect Customizations](https://www.systenics.com/blogs/auctionworx-upgrade-playbook-keep-customizations-safe/)
**by:** Saurabh Nandu **in:** Programming **tags:** [*AuctionWorx,*](https://www.systenics.com/blogs/tag/auctionworx/)[*Upgrades,*](https://www.systenics.com/blogs/tag/upgrades/)[*.NET,*](https://www.systenics.com/blogs/tag/net/)[*DevOps*](https://www.systenics.com/blogs/tag/devops/)
A practical playbook for upgrading AuctionWorx without breaking your custom features, integrations, or database changes.
[Continue reading](https://www.systenics.com/blogs/auctionworx-upgrade-playbook-keep-customizations-safe/) 20 Sept 2026 0 Comments
### [Build vs Buy: Custom Software vs SaaS for SMBs](https://www.systenics.com/blogs/build-vs-buy-custom-software-vs-saas-small-business/)
**by:** Saurabh Nandu **in:** General **tags:** [*Custom Software,*](https://www.systenics.com/blogs/tag/custom-software/)[*SMB Growth,*](https://www.systenics.com/blogs/tag/smb-growth/)[*SaaS,*](https://www.systenics.com/blogs/tag/saas/)[*Software Strategy*](https://www.systenics.com/blogs/tag/software-strategy/)
A custom software founder's perspective on when to build, when to buy, and when to extend the systems you already run.
[Continue reading](https://www.systenics.com/blogs/build-vs-buy-custom-software-vs-saas-small-business/) 20 Sept 2026 0 Comments
### [Auction Platform Lessons for Marketplace Builders](https://www.systenics.com/blogs/lessons-from-auction-platforms-for-building-a-marketplace/)
**by:** Saurabh Nandu **in:** General **tags:** [*Marketplace,*](https://www.systenics.com/blogs/tag/marketplace/)[*AuctionWorx,*](https://www.systenics.com/blogs/tag/auctionworx/)[*Custom Software,*](https://www.systenics.com/blogs/tag/custom-software/)[*Product Strategy*](https://www.systenics.com/blogs/tag/product-strategy/)
Over fifteen years of engineering auction platforms taught us what makes two-sided marketplaces thrive. Here is what we have learned.
[Continue reading](https://www.systenics.com/blogs/lessons-from-auction-platforms-for-building-a-marketplace/)
- [1](https://www.systenics.com/blogs/)
- [2](https://www.systenics.com/blogs/2/)
- [3](https://www.systenics.com/blogs/3/)
- [4](https://www.systenics.com/blogs/4/)
- [5](https://www.systenics.com/blogs/5/)
- [6](https://www.systenics.com/blogs/6/)
- [7](https://www.systenics.com/blogs/7/)
- [8](https://www.systenics.com/blogs/8/)
- [9](https://www.systenics.com/blogs/9/)
- [next »](https://www.systenics.com/blogs/2/)
All categories
- [DevOps (1)](https://www.systenics.com/blogs/category/devops/)
- [General (20)](https://www.systenics.com/blogs/category/general/)
- [Programming (30)](https://www.systenics.com/blogs/category/programming/)
Tags
- [*.NET (7)*](https://www.systenics.com/blogs/tag/net/)
- [*AI (1)*](https://www.systenics.com/blogs/tag/ai/)
- [*ASP.NET Core (3)*](https://www.systenics.com/blogs/tag/aspnet-core/)
- [*ASP.NET MVC (16)*](https://www.systenics.com/blogs/tag/aspnet-mvc/)
- [*Ajax (1)*](https://www.systenics.com/blogs/tag/ajax/)
- [*Analytics (1)*](https://www.systenics.com/blogs/tag/analytics/)
- [*Android (3)*](https://www.systenics.com/blogs/tag/android/)
- [*Artificial Intelligence (1)*](https://www.systenics.com/blogs/tag/artificial-intelligence/)
- [*Auction Platform (1)*](https://www.systenics.com/blogs/tag/auction-platform/)
- [*AuctionWorx (16)*](https://www.systenics.com/blogs/tag/auctionworx/)
- [*Automobile Auctions (1)*](https://www.systenics.com/blogs/tag/automobile-auctions/)
- [*Azure (3)*](https://www.systenics.com/blogs/tag/azure/)
- [*Bootstrap (4)*](https://www.systenics.com/blogs/tag/bootstrap/)
- [*C# (7)*](https://www.systenics.com/blogs/tag/c-sharp/)
- [*ClickOnce (1)*](https://www.systenics.com/blogs/tag/clickonce/)
- [*Cloud Architecture (1)*](https://www.systenics.com/blogs/tag/cloud-architecture/)
- [*Comparison (1)*](https://www.systenics.com/blogs/tag/comparison/)
- [*Continuous Integration (1)*](https://www.systenics.com/blogs/tag/continuous-integration/)
- [*Custom Software (3)*](https://www.systenics.com/blogs/tag/custom-software/)
- [*Customization (2)*](https://www.systenics.com/blogs/tag/customization/)
- [*Dedicated Teams (2)*](https://www.systenics.com/blogs/tag/dedicated-teams/)
- [*DevOps (1)*](https://www.systenics.com/blogs/tag/devops/)
- [*Development (1)*](https://www.systenics.com/blogs/tag/development/)
- [*IOS (2)*](https://www.systenics.com/blogs/tag/ios/)
- [*Interview (1)*](https://www.systenics.com/blogs/tag/interview/)
- [*Linux (1)*](https://www.systenics.com/blogs/tag/linux/)
- [*Logistics (1)*](https://www.systenics.com/blogs/tag/logistics/)
- [*Marketplace (1)*](https://www.systenics.com/blogs/tag/marketplace/)
- [*Mobile App (1)*](https://www.systenics.com/blogs/tag/mobile-app/)
- [*Node.js (1)*](https://www.systenics.com/blogs/tag/nodejs/)
- [*Offshore Development (1)*](https://www.systenics.com/blogs/tag/offshore-development/)
- [*Operations (1)*](https://www.systenics.com/blogs/tag/operations/)
- [*Phonegap (3)*](https://www.systenics.com/blogs/tag/phonegap/)
- [*Product Strategy (1)*](https://www.systenics.com/blogs/tag/product-strategy/)
- [*Razor (5)*](https://www.systenics.com/blogs/tag/razor/)
- [*SMB Growth (3)*](https://www.systenics.com/blogs/tag/smb-growth/)
- [*SQL CE 3.5 SP2 (1)*](https://www.systenics.com/blogs/tag/sql-ce-35-sp2/)
- [*SQL Server (1)*](https://www.systenics.com/blogs/tag/sql-server/)
- [*SaaS (1)*](https://www.systenics.com/blogs/tag/saas/)
- [*SalesForce (3)*](https://www.systenics.com/blogs/tag/salesforce/)
- [*Socket.io (1)*](https://www.systenics.com/blogs/tag/socketio/)
- [*Software Architecture (1)*](https://www.systenics.com/blogs/tag/software-architecture/)
- [*Software Strategy (1)*](https://www.systenics.com/blogs/tag/software-strategy/)
- [*Sync Framework 2.1 (1)*](https://www.systenics.com/blogs/tag/sync-framework-21/)
- [*Umbraco (11)*](https://www.systenics.com/blogs/tag/umbraco/)
- [*Upgrades (1)*](https://www.systenics.com/blogs/tag/upgrades/)
- [*VMWare ESXI (1)*](https://www.systenics.com/blogs/tag/vmware-esxi/)
- [*Visual Studio (2)*](https://www.systenics.com/blogs/tag/visual-studio/)
- [*WCF (1)*](https://www.systenics.com/blogs/tag/wcf/)
- [*WPF (3)*](https://www.systenics.com/blogs/tag/wpf/)
- [*Warehouse Management (1)*](https://www.systenics.com/blogs/tag/warehouse-management/)
- [*Web Development (2)*](https://www.systenics.com/blogs/tag/web-development/)
- [*marketing (1)*](https://www.systenics.com/blogs/tag/marketing/)
- [*website (1)*](https://www.systenics.com/blogs/tag/website/)
---
## Page: AI Enhanced Listings Description Generation | Systenics
URL: https://www.systenics.com/auctionworx/ai-enhanced-listings-description-generation/
Description: AI-enhanced AuctionWorx listing description generation to create accurate, consistent listing content faster across high-volume catalogs.
# AI Enhanced AuctionWorx Listings Description Generation
## Generate stronger, more consistent listing descriptions at scale with AI assistance.
Our AI-powered product acts like a content sidekick for your team, helping generate unique and accurate descriptions for thousands of auction listings.
[Contact Us](#) AI Enhanced AuctionWorx Listings Description Generation helps build unique, accurate and descriptive listing descriptions. Enjoy 25% increase in sales due to accurate and complete listing descriptions. Detailed item descriptions help enhance the SEO for the listing as well as help increase sales interest in the item. Our AI powered product helps ease the pain of generating unique descriptions for thousands of Auction listings. Core Features
- Power of Open AI
- Enterprise grade AI to ensure privacy of your data
- Reasonable usage-based pricing
- Increase in site SEO due to better descriptions
- Time and effort saving for generating unique descriptions for all listings
- Fully integrated into AuctionWorx saving precious time vs manually copy paste from ChatGPT
## Pricing
### One Time Fixed Cost - No Hidden Charges
Includes the Buyer+Seller Pro mobile app with AI-powered description generation
## $2699
#### AI Enhanced Listings
for AuctionWorx Enterprise/Events Edition
- One Time Purchase
- **Includes Buyer+Seller Pro Mobile App**
- AI-Powered Description Generation
- Enterprise Grade AI for Data Privacy
- Increased Site SEO from Better Descriptions
- Works on Android & iOS
- Enterprise & Events Edition Support
[Learn More about the Buyer+Seller Pro Mobile App **](https://www.systenics.com/auctionworx/mobile-apps/)
[Contact Us](#)
---
## Page: AuctionWorx Community & Activity Feed | Systenics
URL: https://www.systenics.com/auctionworx/community-activity-feed/
Description: Engage your auction community with real-time bid activity, voting, ratings and comment moderation. See bids as they happen in your activity feed.
# Community & Activity Feed
## for AuctionWorx
### Engage. Vote. Bid. Together!
See every bid as it happens. Our unique activity feed displays bid amounts alongside community comments, ratings, and votes — building trust and engagement like never before, powered by your AuctionWorx community sidekick.
[Contact Us](#) *
**Systenics Community & Activity Feed for AuctionWorx** transforms your auction listings into vibrant community hubs. Watch as bids, comments, and votes flow together in a unified activity feed — giving buyers and sellers unprecedented transparency. This is the perfect solution for those seeking a Reddit-style community auction interface.
The **unified activity feed** is the game-changer. Every bid placed shows up instantly in the activity stream with the exact amount, timestamp, and bidder. Combined with community comments, upvote/downvote feedback, your marketplace builds trust organically.
Core Features
- **Activity Feed** — See bid amounts, comments, and votes
- **Mark Top Posts** — Mark posts as top posts for greater visibility
- **Upvote/Downvote Voting** — Surface the best community insights automatically
- **Sorted Views** — Sort comments by New, Top Rated, or Most Helpful
- **User Badges** — Moderator can assign badges to specific expert users
- **User Reputation Scores** — Build trust with visible contribution counts
- **Comment Moderation** — Admin controls to maintain community quality
Why It Matters
- Increase buyer confidence with transparent bidding
- Single Activity Feed for bids, comments, and votes
- Build engaged communities
- Reduce disputes with visible history
- Encourage repeat participation
- Stand out from competing platforms
## Pricing
### One Time Fixed Cost - No Hidden Charges
Note: You can purchase the mobile app separately.
## $399
#### Community & Activity Feed
for AuctionWorx
- One Time Purchase
- Real-time Activity Feed
- Community Comments & Voting
- User Reputation & Badges
- Sorted Views (Best/Top/New)
- Admin Moderation Tools
[Learn More about the AuctionWorx mobile app *](https://www.systenics.com/auctionworx/mobile-apps/)
[Contact Us](#)
---
## Page: AuctionWorx Development & Customization Services | Systenics
URL: https://www.systenics.com/auctionworx/development-and-customization/
Description: AuctionWorx development and customization services for integrations, feature delivery, UI upgrades, and platform enhancements by an experienced RainWorx partner.
# AuctionWorx Development and Customization Services
Work with an experienced team for AuctionWorx development, feature delivery, integrations, and platform customization.
[Contact Us](#) Systenics Solutions is a RainWorx partner focused on AuctionWorx development and customization. Our Superhero Squad brings 15+ years of platform experience, helping teams ship features, integrations, and workflow upgrades without losing momentum.
## Why Choose Systenics?
- **Premium Partners:** Our close relationship with the AuctionWorx ecosystem helps us design, estimate, and deliver customizations with less risk and fewer surprises.
- **Proven Expertise:** Our Superhero developers bring hands-on delivery experience across enterprise and events implementations.
- **Customized Solutions:** We don't believe in one-size-fits-all. Your customized solution will be crafted to match your specific requirements.
- **Secure and Scalable Technology:** Our solutions are crafted with specific focus on security and scalability to ensure your investments give long returns.
## Our Comprehensive Development Services
- **Custom AuctionWorx Development:** From concept to launch, our Superhero Squad builds and ships your priority marketplace features.
- **UI/UX Optimization:** Create an intuitive, engaging user experience that keeps bidders coming back.
- **Feature Integration:** Enhance your platform with innovative tools and third-party integrations like HubSpot, SalesForce, Invoicing, Payment Gateways, Escrow etc.
- **Platform Migration & Upgrades:** Seamlessly transition to the latest AuctionWorx release taking advantage of the latest platform upgrades.
- **Azure Cloud Hosting:** Take advantage of the best Microsoft Azure Cloud hosting infrastructure to complement your growing business.
## Our Products on AuctionWorx Platform
- **AuctionWorx Mobile app for Android and iOS:** AuctionWorx Mobile application helps AuctionWorx clients who want to provide mobile experience for their customers. [Learn More](https://www.systenics.com/auctionworx/mobile-apps/)
- **Live Auctions for AuctionWorx:** Live Auctions for AuctionWorx Events edition is an add-on product which brings the power for real-time, low-latency Video / Audio Live auctions to RainWorx's AuctionWorx product. [Learn More](https://www.systenics.com/auctionworx/live-auctions/)
- **Listings Creation Excel Plug-In:** AuctionWorx Listings Creation Excel Plug-In has been built for RainWorx's AuctionWorx clients enabling easy creation and management of bulk listings. [Learn More](https://www.systenics.com/auctionworx/listings-creation-excel-plugin/)
- **AI Enhanced Listings Description Generation:** AI Enhanced AuctionWorx Listings Description Generation helps RainWorx's AuctionWorx build accurate and descriptive listing descriptions for their auctions listings.[Learn More](https://www.systenics.com/auctionworx/ai-enhanced-listings-description-generation/)
## Join Our Success Stories
From niche collectors to large-scale liquidators, we've helped businesses of all sizes thrive in the online auction space. Our clients consistently report increased engagement, higher bid values, and streamlined operations after partnering with Systenics Solutions.
**Ready to elevate your auction business?**[Contact Us](#) and call in our Superhero Squad for a practical development roadmap tailored to your AuctionWorx goals. See why Systenics Solutions is the trusted choice for serious AuctionWorx customers worldwide.
---
## Page: AuctionWorx Mobile App Development Services (iOS & Android) | Systenics
URL: https://www.systenics.com/auctionworx/mobile-apps/
Description: White-label AuctionWorx mobile app development for iOS and Android. Launch buyer and seller apps with real-time bidding, push notifications, and branded workflows.
# AuctionWorx Mobile App
## White-label iOS and Android apps for real-time bidding, buyer engagement, and seller workflows, built by your AuctionWorx Superhero Squad.
Mobile apps for AuctionWorx Enterprise and Events Edition with branding, notifications, listings, and auction management features.
[Contact Us](#) Our AuctionWorx mobile apps help auction businesses give buyers and sellers a faster, more convenient way to bid, browse, manage listings, and stay updated in real time. White-label branding, push notifications, and seller workflows make the app a practical extension of your AuctionWorx platform instead of a separate product. Think of it as your mobile sidekick for marketplace growth. Features
- Native mobile application user experience
- Real-time bidding on Auction listings
- Push notifications on Android and iOS phones when Outbid or on Winning Auction.
- Ease of use in creating/editing listings.
- Use Camera or Gallery to upload photos for listings.
- AI Title & Description Generation
- Multiple Language Support*
- Maintenance Mode
** Additional Add-On Features
- Employee Specific role to restrict access to sensitive data
- Migrate all website customizations to mobile app
- Logo and Branding to match your website
- Integration with UPC barcode (Amazon, Home Depot) for quick listing creation
- Warehouse Management integration
- Delivery Management and Pickup Scheduling
## AuctionWorx Mobile Apps for Buyers and Sellers
### White-label mobile experiences built for bidding, listings, and marketplace operations with Superhero-grade execution
Give your customers and team a better mobile AuctionWorx experience. Our apps support real-time bidding, seller listing workflows, and on-the-go marketplace management from Android and iOS devices, without changing how your core AuctionWorx operations run.
Built for real AuctionWorx missions:****Whether you need a buyer-only app or a broader buyer-and-seller experience, the mobile app extends your AuctionWorx platform with workflows that match how your marketplace actually operates.
Manage Listings:****Create, edit, and manage auction listings from a phone. Upload photos, set pricing details, and keep activity moving without waiting to get back to a desktop command center.
Browse and Search:****Help bidders discover listings quickly with mobile- friendly browsing, search, and filtering across your AuctionWorx inventory.
Push Notifications:****Keep users engaged with alerts for outbids, wins, status changes, and important marketplace updates, exactly when action is needed.
Secure and Reliable:****Deliver a stable, branded mobile experience that stays aligned with your AuctionWorx platform and operating workflows, backed by a team that already knows the platform inside out.
Benefits for Buyers:****Make it easier to bid on the go, follow auctions in real time, and respond immediately when bidding activity changes.
Benefits for Sellers:****Support faster listing creation, photo uploads, seller-side updates, and team responsiveness from mobile devices, so your team can move faster during peak auction windows.
Available for deployment on the App Store and Google Play with your branding, workflows, and selected feature set. Your buyers get a smoother experience; your team gets a stronger mobile toolkit.
## Your Brand AuctionWorx App
#### White Labelled, Perfectly Customized!
*
Seamless Transition from
Web to Mobile
Our hybrid mobile app works in iPhone, Android, and any web browser
##### Your Branding to
Establish Trust
Re-inforce your brand identity with logo, brand colors, and UI style
##### Published on
Your App Store Accounts
Full ownership of the app on the App Stores. Can access various reports generated by the App Stores.
## Mobile App Pricing
#### One Time Fixed Cost - No Hidden Charges
Choose the plan that best fits your auction needs
## $1799
#### Buyer
for AuctionWorx Enterprise/Events Edition
- One Time Purchase
- Published on both iOS and Android
- White Labeled
- One time deployment included
- Buyer side features
[Book a Demo](https://outlook.office.com/bookwithme/user/231015685f21467da5ef6e3eb8b50240@systenics.com/meetingtype/hbYq2z1Hj0C2e7DuwBqdnw2?anonymous&ep=mcard)
## $2299
#### Buyer + Seller
for AuctionWorx Enterprise/Events Edition
- One Time Purchase
- Published on both iOS and Android
- White Labeled
- One time deployment included
- Buyer + Seller Features
[Book a Demo](https://outlook.office.com/bookwithme/user/231015685f21467da5ef6e3eb8b50240@systenics.com/meetingtype/hbYq2z1Hj0C2e7DuwBqdnw2?anonymous&ep=mcard) *AI Integration
## $2699
#### Buyer + Seller Pro
for AuctionWorx Enterprise/Events Edition
- One Time Purchase
- Published on both iOS and Android
- White Labeled
- All Buyer + Seller Features
- AI Title & Description Generation
- Advanced Search & Swipe Navigation
- Multi-Language Support
[Book a Demo](https://outlook.office.com/bookwithme/user/231015685f21467da5ef6e3eb8b50240@systenics.com/meetingtype/hbYq2z1Hj0C2e7DuwBqdnw2?anonymous&ep=mcard)
- *
-
### Download Our Demo Apps Now
Download our demo Buyer + Seller AuctionWorx mobile app below to explore its features.
-
##### AuctionWorx Enterprise Edition
-
-
##### AuctionWorx Events Edition
-
## Compare Mobile App Features
#### Choose the Right Plan for Your Needs
Explore the complete feature set of our mobile applications. Compare Buyer, Buyer + Seller, and Buyer + Seller Pro to find the right fit.
Feature Buyer
$1,799 Buyer + Seller
$2,299 *Pro
$2,699 **General Home (Default Page) ** ** ** Contact Us ** ** ** About Us ** ** ** Privacy Policy ** ** ** Terms & Conditions ** ** ** Feedback ** ** ** Category Menu ** ** ** Browse Events and Lots - Grid & List view (Events) ** ** ** Browse Listings - Grid & List view (Enterprise) ** ** ** Browse Listings or Lots ** ** ** Listing Details ** ** ** Event Details ** ** ** Lot Details ** ** ** Previous - Next Event Lots ** ** ** Follow Auctions Live ** ** ** Q&A ** ** ** Share Listing or Lot (with Deep Link) ** ** ** Google Maps ** ** ** Multi-Currency ** ** ** Custom Field Types (Clickable Links, Large Text Areas, Data Lists, Option Lists) ** ** ** Advanced Search ** ** ** Recent Search ** ** ** Swipe to see more Lots ** ** ** Multi-Language Resource based including Arabic Support (additional cost) ** ** ** **Accounts Login ** ** ** Registration ** ** ** My Account Summary ** ** ** My Account ** ** ** Edit Account ** ** ** Change Password ** ** ** Forgot Password ** ** ** Credit Card ** ** ** Addresses ** ** ** Messaging ** ** ** Site Fees ** ** ** My Active Bids ** ** ** Invoices ** ** ** Invoice Details ** ** ** Bid History ** ** ** Offer History ** ** ** **Seller Create / Edit Event ** ** ** Create / Edit Lot ** ** ** Create / Edit Listing ** ** ** My Listings ** ** ** Events - Draft, Published, Closed, Archived, Sales Reports, Seller Invoices ** ** ** Consignor - Manage Consignors, Active, Statements, Fees, Preferences, Reports ** ** ** Event - Sale Reports, View Lot Order, View Auto Extend Group, View Invoices, Email All Invoices ** ** ** Event - Summary, Create Similar Event, Create All Invoices, Archive Event, Change Event Owner ** ** ** Listing - Draft, Active, Scheduled, Successful, Unsuccessful, Ended, Sales Reports, Invoices, Invoice Reports ** ** ** Listing - Edit, Delete, End Early ** ** ** Lot - Extend Lot Group, Delete, List Similar, End Early, Edit ** ** ** Audit Bid History (Admin only) ** ** ** **AI Title & Description Generation ** ** ** **Push Notifications Admin Dashboard ** ** ** Outbid ** ** ** Purchase (Fixed & Lot) ** ** ** Daily Watchlist Summary ** ** ** Bidder Reminder to Bidder Or All Users (Event Closing) ** ** ** Listing Ended Unsuccessfully (Seller) ** ** ** Closing Soon (Lot & Listing) ** ** ** New Event Published Notifications ** ** ** User Push Notification Preference ** ** ** Push Notify - Site Announcement ** ** ** Notification History - All included in Push Notify ** ** ** **App Settings Features Mobile App Settings ** ** ** App Settings - Store Links, App Icon, Splash Screen, Stripe Keys, OneSignal Keys ** ** ** Home & Category Banner ** ** ** Enable Consignors ** ** ** Enable Regions ** ** ** Display Site Time Zone ** ** ** User Messaging ** ** ** Feedback ** ** ** Require Authentication ** ** ** Show Bid History User Names ** ** ** Under Construction Mode ** ** ** Time Remaining Style ** ** ** Force Mobile App Update ** ** ** Firebase Analytics ** ** ** ** Included ** Not Available ** Pro Exclusive
## Terms and Conditions
One-Time Cost**** The AuctionWorx mobile apps are provided with a one-time cost and supported only on the latest version of RainWorx AuctionWorx software at the time of purchase and is liked with that version.
Support**** Post-deployment, we offer free email support for AuctionWorx mobile app issues reported within the first 30 days. This includes bug fixes only.
Annual Charges**** We do not charge any annual maintenance fees.
Customization**** If you require new features, design changes, or version upgrades, these will be treated as customization requests and estimated separately and implemented upon your approval.
AuctionWorx Platform Updates**** RainWorx provides two kind of releases:
- Minor releases** which usually have bug fixes but releases frequently
- **Major version releases** which can contain a larger number of new features as well as bug fixes. These may get released once a year.
**Minor Release Update**** It's not possible to update the mobile app for every new minor release, we will internally assess whether any new features are critical to the mobile app. Based on that evaluation, we may update the app accordingly. These updates are not guaranteed and are handled at our discretion.
There is a smaller cost (around $300) involved if the customer wishes to update to the new minor release, both website migration as well as mobile app migration need to be undertaken. Major Release Update**** RainWorx usually releases new features on major releases. So evaluating those features larger set of new features may get enabled in the mobile app as well. Hence there is a larger cost for both website and mobile app migration to the largest major release. Its at customers discretion to update the app. If a customer has made larger number of customizations then their cost increases in proportion to the effort required to migrate and test the new releases.
Mobile OS Compatibility & Future Upgrade Costs**** Every 1–2 years, Google and Apple mandate updates to all mobile applications to ensure compatibility with the latest Android/iOS versions. Such upgrades will be chargeable. Based on the past experience, the AuctionWorx mobile app compatibility upgrade costs typically range between USD $500–$1000, though in some cases they may be lower.
Apple Developer Account Renewal**** Since we publish white label mobile apps under the customers account on the Mobile App Store. The customer needs to renew their Apple Developer account annually (USD $99). Failure to do so may result in Apple delisting your app from the App Store.
3rd Party Services**** We use OneSignal services for Push Notifications to mobile devices. AI subscriptions are using for AI Title & Description Generation. Barcode Lookup Service is used for product lookup. Based on the usage of these services, the customer may have to pay for the higher plans from these service providers.
IP and Source Code**** The AuctionWorx mobile app built by Systenics, the IP (Intellectual Property) is owned by Systenics Solutions LLP. We do not distribute the source code of the mobile app and its customizations to any customer. The client is provided with a self-use license world-wide.
If a client wants to own IP, then a separate customized app can be provided for them.
AuctionWorx Customizations and Changes**** Once the AuctionWorx mobile app is deployed for the customer any new customizations of migrations on the AuctionWorx website as well as mobile app can only be done by Systenics. No 3rd party developer or company is provided with the source code to perform other customizations or migrations.
Liability and Losses**** Systenics provides the AuctionWorx mobile app as is basis. Systenics is not liable for indirect, special, or consequential damages.
Guarantee of App Publish on Mobile Stores**
Both Apple and Google, keep updating their app stores policies from time to time. There are certain business which are not allowed on the app store. Systenics will make best effort to comply with all policies but cannot guarantee listing of the mobile app on the app store.
---
## Page: AuctionWorx Video Tutorials & How-To Guides | Systenics
URL: https://www.systenics.com/auctionworx/videos/
Description: Explore our library of AuctionWorx tutorials. Learn how to configure Enterprise and Event editions, manage listings, and optimize your auction platform.
Mission Support
# AuctionWorx
How To Videos
Master your AuctionWorx mission.
Built by our expert Superheroes to help you succeed.
Filter by version and edition to find the exact tactical briefing you need.
**
##### Filters
###### Version
* AuctionWorx v3.6 AuctionWorx v3.5
###### Edition
Enterprise Edition Events Edition *
##### Filters
###### Version
* AuctionWorx v3.6 AuctionWorx v3.5
###### Edition
Enterprise Edition Events Edition * * Showing all 53 videos * 1:38 3.6 Enterprise
###### [Organize Users Data Using Option List Dropdowns in AuctionWorx Enterprise 3.6](#)
* * 1:33 3.6 Enterprise
###### [Turn Text into Clickable Links For Users in AuctionWorx Enterprise 3.6](#)
* * 1:04 3.6 Enterprise
###### [Add to Watchlist as You Browse in AuctionWorx Enterprise 3.6](#)
* * 1:22 3.6 Enterprise
###### [Configure Option List Radio Button Custom Fields for Listings in AuctionWorx Enterprise 3.6](#)
* * 1:20 3.6 Enterprise
###### [Organize Listing Data Using Option List Dropdowns in AuctionWorx Enterprise 3.6](#)
* * 1:16 3.6 Enterprise
###### [Discover the Power of Multi-Column List Fields in AuctionWorx Enterprise 3.6](#)
* * 1:31 3.6 Enterprise
###### [Use Large Text Areas to Enhance Listings in AuctionWorx Enterprise 3.6](#)
* * 1:15 3.6 Enterprise
###### [Turn Text into Clickable Links For Auction Listing in AuctionWorx Enterprise 3.6](#)
* * 1:10 3.6 Enterprise
###### [How to Add Google Maps to Auction Listings in AuctionWorx Enterprise 3.6](#)
* * 1:22 3.6 Events
###### [Organize Lot Data Using Option List Dropdowns in AuctionWorx Events 3.6](#)
* * 1:15 3.6 Events
###### [Discover the Power of Multi-Column List Fields in AuctionWorx Events 3.6](#)
* * 1:31 3.6 Events
###### [Use Large Text Areas to Enhance Lots in AuctionWorx Events 3.6](#)
* * 1:15 3.6 Events
###### [Turn Text into Clickable Links For Auction Lots in AuctionWorx Events 3.6](#)
* * 1:13 3.6 Events
###### [New Search & Browse Tools for Auction Events in AuctionWorx Events 3.6](#)
* * 1:10 3.6 Events
###### [How to Add Google Maps to Auction Listings in AuctionWorx Events 3.6](#)
* * 1:21 3.6 Events
###### [Configure Option List Radio Button Custom Fields for Lots in AuctionWorx Events 3.6](#)
* * 1:04 3.6 Events
###### [Add to Watchlist as You Browse in AuctionWorx Events 3.6](#)
* * 1:51 3.6 Events
###### [Customize Auction Event List Display Styles in AuctionWorx Events 3.6](#)
* * 1:13 3.6 Events
###### [Discover the Power of Multi-Column List Events Fields in AuctionWorx Events 3.6](#)
* * 1:38 3.6 Events
###### [Organize Events Data Using Option List Dropdowns in AuctionWorx Events 3.6](#)
* * 1:22 3.6 Events
###### [Configure Option List Radio Button Custom Fields for Events in AuctionWorx Events 3.6](#)
* * 1:34 3.6 Events
###### [Use Large Text Areas to Enhance Events in AuctionWorx Event 3.6](#)
* * 1:10 3.6 Events
###### [Turn Text into Clickable Links For Auction Events in AuctionWorx Events 3.6](#)
* * 2:18 3.5 Enterprise
###### [Configuring Multiple Currencies in AuctionWorx Enterprise](#)
* * 1:46 3.5 Enterprise
###### [Extend Listings on AuctionWorx Enterprise - Easily Manage Auction Timelines](#)
* * 1:13 3.5 Enterprise
###### [Boost Your Auctions with YouTube Videos in AuctionWorx Enterprise](#)
* * 1:46 3.5 Enterprise
###### [A Guide to Adding and Editing SEO on the AuctionWorx Enterprise](#)
* * 1:45 3.5 Enterprise
###### [Bulk Relist Feature on AuctionWorx Enterprise - Efficient Auction Management](#)
* * 2:22 3.5 Enterprise
###### [Auto Relist Feature on AuctionWorx Enterprise - Complete Setup Guide](#)
* * 1:36 3.5 Enterprise
###### [Understanding Proxy Bidding on the AuctionWorx Enterprise - A Complete Guide](#)
* * 1:43 3.5 Enterprise
###### [Change Site Header & Layout on AuctionWorx Enterprise - Customization Guide](#)
* * 2:01 3.5 Enterprise
###### [Master the Search Listings Tool on AuctionWorx Enterprise](#)
* * 1:51 3.5 Enterprise
###### [Large Bid Confirmation on AuctionWorx Enterprise- How to Enable & Use](#)
* * 2:04 3.5 Enterprise
###### [Post Questions & Answers on AuctionWorx Enterprise - Step-by-Step Tutorial](#)
* * 2:38 3.5 Enterprise
###### [Promote and Highlight to Upgrade Your Listings on the AucionWorx Enterprise](#)
* * 1:48 3.5 Enterprise
###### [Enable Under Construction Mode Feature on the AuctionWorx Enterprise](#)
* * 2:13 3.5 Enterprise
###### [Create Classified Listing on the AuctionWorx Enterprise - Easy Tutorial](#)
* * 2:05 3.5 Enterprise
###### [Create Fixed Price Listing on the AuctionWorx Enterprise - Easy Tutorial](#)
* * 3:01 3.5 Events
###### [How to Copy Lots within Events in AuctionWorx](#)
* * 2:43 3.5 Events
###### [How to Move Lots within Events in AuctionWorx](#)
* * 2:08 3.5 Events
###### [How to Search Lots in AuctionWorx](#)
* * 2:43 3.5 Events
###### [Mastering Advanced Search in AuctionWorx](#)
* * 2:32 3.5 Events
###### [How to Edit Email Templates in AuctionWorx](#)
* * 3:50 3.5 Events
###### [How to Customize Static Content in AuctionWorx](#)
* * 2:49 3.5 Events
###### [Static Content Examples in AuctionWorx](#)
* * 2:16 3.5 Events
###### [How to Change the Seller of an Event in AuctionWorx](#)
* * 2:50 3.5 Events
###### [Make an Offer Feature on the AuctionWorx Events : Step-by-Step Overview](#)
* * 4:11 3.5 Events
###### [Custom Fields in AuctionWorx Events - Comprehensive Guide](#)
* * 2:10 3.5 Events
###### [Change Site Logo on the AuctionWorx Events : Easy Tutorial](#)
* * 2:12 3.5 Events
###### [Create Classified Listing on the AuctionWorx Events - Easy Tutorial](#)
* * 1:47 3.5 Events
###### [Enable Under Construction Mode Feature on the AuctionWorx Events](#)
* * 2:20 3.5 Events
###### [Promote and Highlight to Upgrade Your Lots on the AucionWorx Enterprise](#)
* * 2:05 3.5 Events
###### [Create Fixed Price Listing on the AuctionWorx Events - Easy Tutorial](#)
**
#### No signals found
Try adjusting your filters or search terms to re-establish contact.
---
## Page: Dutch Auctions: Descending-Price Auction Engine | AuctionWorx
URL: https://www.systenics.com/auctionworx/dutch-auctions/
Description: Turn stagnant inventory into urgency-driven sales with Dutch Auctions for AuctionWorx. Automate descending-price strategies with reusable templates, flexible scheduling, and zero re-entry.
# Dutch Auctions for AuctionWorx
## Turn stagnant inventory into urgency-driven sales with descending-price auctions.
The price drops. The clock ticks. Buyers act fast. Our Squad built the ultimate Dutch Auction engine so your inventory moves — on autopilot.
[Get in Touch](#)
## Inventory Sitting on the Shelf?
Traditional auctions rely on ascending bids — but what happens when buyers aren't competing? Your items sit. Bids don't come in. Warehouse costs pile up. Dutch Auctions flip the model and get your inventory **moving**.
**
#### Traditional Auction
Ascending Bid
- Price starts low and rises with competitive bids
- Relies on multiple active bidders competing
- Sold to the highest bidder at the end
- Risk: Items may go unsold if no bids come in
**
#### Dutch Auction
Descending Price
- Price starts high and drops in automated steps
- Instant buy when a buyer accepts the current price
- Price freezes on purchase — no waiting for auction end
- **Result:** Urgency drives action, inventory moves fast
## That Dropping Price Creates Real Urgency
Every tick of the countdown moves you closer to a sale. Dutch Auctions transform passive browsers into decisive buyers.
**
#### Urgency
Buyers act fast as prices drop. Every second the clock ticks, the deal gets better — creating a natural pressure to commit before someone else does.
**
#### Demand
Attract buyers who skip traditional auctions. A transparent, dropping price appeals to bargain hunters and strategic buyers who want a fair deal on their terms.
**
#### Sales
Liquidate overstock, slow-moving, and returned inventory efficiently. Dutch Auctions transform warehouse deadweight into revenue — automatically.
## How It Works
Three steps. Full autopilot.
Drop Configuration **Discount Strategy** **Fixed Amount / Percentage / Variable **Minimum (Floor) Price** $ 1,000 **Drop Amount** $ 50 **Drop Interval** 60 minutes Step 1
### Set Your Pricing Rules
Configure exactly how the Dutch Auction price decreases over time. Choose from **Fixed Amount**, **Percentage**, or **Variable** discount strategies. Set your floor price to ensure you never sell below your minimum — our Squad engineered this for **complete control**.
Define the drop amount and interval once, and the engine handles the rest. Prices decrease automatically at your configured cadence until a buyer accepts or the floor is reached.
Schedule & Activation **Start Date** 06/29/2026 **End Date** 07/02/2026 **Time Ranges** 8:00 AM – 9:00 AM 12:00 PM – 3:00 PM 5:00 PM – 7:00 PM **Recurrence** **Daily / Weekly Step 2
### Schedule Your Execution
Run it on your schedule — or keep it running daily. Set date ranges, define **multiple time windows** throughout the day, and choose **Daily or Weekly** recurrence patterns. The mission runs itself.
Perfect for "Friday Flash Sales" or daily clearance windows. Prices drop only during active time windows, giving you precise control over when the action happens.
Listing Feature **Feature Type** **Dutch Auction Templates **Select Template** **DA 01 Template **Template applied — that's it! Step 3
### Apply Templates to Listings
Create a template. Reuse it forever. Build your Dutch Auction strategy once, then apply it to any listing with a single click. Select a template at listing creation —**that's it**.
One template can power Listing A, B, C and beyond. No re-entry, no reconfiguration. Your team saves time and maintains consistent pricing across the board.
Why It Matters
## Built for Teams Running Auctions at Scale
**
#### Reusable Templates
Build once, use everywhere. Define your Dutch Auction strategy once and apply it across hundreds of listings.
**
#### Automatic Scheduling
Phases sequence themselves. Set time windows and recurrence, and the price drops handle themselves — on mission autopilot.
**
#### Zero Re-Entry
Consistent pricing, every time. No manual reconfiguration needed. Your team focuses on the mission while the engine runs the auctions.
[Connect for Mission Launch](#)
## The Buyer Experience
Simple, transparent, and compelling for your customers.
Dutch Auction Current Price $1,000.00 Next drop 0 Days 01:47:11 Floor price: $100.00 Accept Current Price
Buyers see the **current price**, the **countdown to the next drop**, and the **floor price** — all in one clean interface. One click on "Accept Current Price" and the deal is sealed instantly.
No waiting for auction end. No outbidding. The buyer decides when the price is right and acts. It's a mission-ready buying experience that drives conversions.
## Perfect For These Missions
Dutch Auctions supercharge results across multiple auction domains.
**
##### Overstock & Returns
Clear out surplus inventory, box-damaged, and returned items with automated price drops.
**
##### Estate Sales
Move large inventories efficiently with timed price reductions that drive buyer action.
**
##### Antiques & Collectibles
Create urgency for rare items with descending prices that reward decisive collectors.
**
##### eCommerce Liquidation
Run daily or weekly clearance sales on autopilot with scheduled price drops.
## Ready to Launch Dutch Auctions?
Our Squad is ready to power up your AuctionWorx platform with Dutch Auctions. Connect with us for mission launch.
[Get in Touch Now!](#)
---
## Page: eCommerce Listing Creation via Barcode | Systenics
URL: https://www.systenics.com/auctionworx/barcode-listing-creation/
Description: Scan product barcodes to auto-populate AuctionWorx listing details from Amazon & Home Depot. Save time with our barcode-to-listing sync.
# eCommerce Listing Creation
using Barcode
## for AuctionWorx
### Scan. Fetch. List. In seconds!
Auto-populate listing details and images from Amazon & Home Depot by simply scanning a product barcode
[Contact Us](#)
**Systenics eCommerce Listing Creation Mobile App for AuctionWorx** revolutionizes how you create auction listings. Simply scan a product's barcode and watch as the app instantly fetches complete product details including images from leading eCommerce stores like **Amazon** and **Home Depot**.
This solution is engineered specifically for **high-volume warehouses**,**liquidation sellers**, **resellers**, and businesses handling large quantities of inventory. Instead of typing product data manually, your team can scan the barcode, review the auto-filled details, and publish listings with greater speed and consistency.
Available for both **Sellers** creating their own listings and **Employees** managing listings on behalf of the business. Whether you're processing returns, overstock, or box-damaged items, our barcode scanning feature eliminates tedious manual data entry, dramatically reduces errors, and provides a faster, smarter workflow.
Transform your listing workflow from minutes to seconds. Scan once, and get the Title, Description, Category, UPC, and even Product Images — all auto-populated and ready for your AuctionWorx event. Move from item intake to live listings in seconds!
Core Features
- **Auto-Fetch from Amazon & Home Depot** — Scan UPC barcodes to retrieve complete product information
- **Saves Time & Reduces Errors** — Eliminate manual data entry and typos
- **Product Images Included** — Automatically retrieves product photos from the source
- **Cross-Platform** — Works on both Android and iOS devices
- **For Sellers & Employees** — Flexible access for different user roles
- **Works with AuctionWorx Enterprise & Events** — Seamlessly integrates with both editions
- **80%+ Faster Listing Creation** — Go from scan to published listing in seconds
*
Barcode Scanner
Auto-Populated Details
Fetched Images
## Pricing
### One Time Fixed Cost - No Hidden Charges
Includes the Buyer+Seller mobile app with barcode scanning capabilities
## $2799
#### Barcode Listing Creation
for AuctionWorx Enterprise/Events Edition
- One Time Purchase
- **Includes Buyer+Seller Mobile App**
- Barcode Scanning from Amazon & Home Depot
- Auto-Populate Title, Description & Images
- Works on Android & iOS
- Enterprise & Events Edition Support
[Learn More about the Buyer+Seller Mobile App *](https://www.systenics.com/auctionworx/mobile-apps/)
[Contact Us](#)
---
## Page: Listings Creation Excel Plug-In | Systenics
URL: https://www.systenics.com/auctionworx/listings-creation-excel-plugin/
Description: Bulk create and manage AuctionWorx listings up to 75% faster with our Excel Plug-In for Enterprise and Events editions.
# AuctionWorx Listings
Creation Excel Plug-In
## Bulk-create listings up to 75% faster.
Bulk Create/Manage AuctionWorx Listings without leaving MS Excel
[Contact Us](#)
AuctionWorx Listings Creation Excel Plug-In has been built for RainWorx's AuctionWorx clients enabling easy creation and management of bulk listings. Auction listing creation and management can end up being a huge hassle as the number of items grows.
Our clients report 75% time savings for creating bulk listing compared to Import CSV feature. Our plug-in minimizes errors, makes uploading listing images a breeze.
Systenics' Excel Plug-In helps your backend team to create and manage listings without leaving Excel! This brings significant speed and time benefits in creation and management of bulk listings.
Core Features
- Works for both AuctionWorx Enterprise and Events Edition
- Supports creation of 100's of listings from 1 Excel sheet
- Supports direct listing file uploads from Excel itself
- Save time and money managing multiple listings from a single Excel sheet
- Combine the plug-in with 'Employee' role feature to ensure limited access provided only to Employees to generate listings
- Cross-Platform works on Windows and Mac
- Needs Office 2019 or Office 365 version Excel
## Pricing
### One Time Fixed Cost - No Hidden Charges
Get the Excel Plugin for a one-time fee
## $499
#### Listings Creation Excel Plug-In
for AuctionWorx Enterprise/Events Edition
- One Time Purchase
- Enterprise & Events Edition Support
- Unlimited Bulk Listings
- Image Import Features
- Windows & Mac Compatible
[Contact Us](#)
---
## Page: Live Auctions: Real-Time Audio & Video | Systenics
URL: https://www.systenics.com/auctionworx/live-auctions/
Description: Add real-time audio and video streaming to your AuctionWorx platform with low latency and support for 1000+ concurrent users.
# Real-Time Live Auctions for AuctionWorx
## Stream your live auction to 1000+ online users on desktop and mobile in high definition.
Experience the power of Low-Latency Live Streaming. Conduct Online and Offline auctions simultaneously.
[Contact Us](#) Your browser does not support the video tag. Live Auctions for AuctionWorx Events edition is a white labeled add-on product which brings the power for real-time, low-latency Video / Audio Live auctions to RainWorx's AuctionWorx product. Built upon the robust AuctionWorx platform, Live Auctions enables a whole new set of capabilities for clients looking to conduct simultaneous Online and Offline live auctions. The Live Auction product can be deployed on your personal servers or the cloud close to the clients servers to ensure real-time, low-latency Video / Audio Live auctions experience. Live Streaming Features
**High quality broadcasting****Enjoy the clarity of full HD live broadcasting with no bitrate or resolution restrictions.
Low Latency streaming****Real time audio video transmission with a latency of 500ms or less.
Adaptive streaming****Adaptive streaming technology ensures that your users are able to view live streaming based on their device bandwidth capability.
Record your broadcasts****Record your broadcasts and share them with your audience for future viewing.
Mobile compatible****Use modern smartphones to capture high quality videos without the need of specialized equipment.
Legacy software compatible****Take advantage of the legacy streaming software platforms like OBS Studio, Wirecast, and more.
Live Auctions Features
Easy Live auction setup****Get your Live Auctions scheduled quickly and easily with our service.
Multi-channel setup****Take advantage of multi-channel support for streaming with audio only mode and video independently.
Offline Auction Team****Create efficient offline auction team for enhancing action results.
Dedicated Auctioneer screen.****Auctioneering made easy with a dedicated screen for tracking bids and see who is winning.
Mobile compatible****Use modern smartphones to capture high quality videos without the need of specialized equipment.
Legacy software compatible****Take advantage of the legacy streaming software platforms like OBS Studio, Wirecast, and more.
## How Live Auction Works
Built upon the robust AuctionWorx platform, Live Auctions enables a whole new set of capabilities for clients looking to conduct simultaneous Online and Offline live auctions
Schedule an Event and Team:****The seller has the ultimate authority to plan and execute the Event Live, as well as assign team members for offline activities. Schedule your Live auctions date and time. Setup your Offline team.
Setup your video recording:****Start Streaming and Bidding The Offline team is equipped with the tools to manage the Auctions during Live Event. Recorder starts the stream
Event managed by the team:**
Team member manages offline bids Stop Streaming and End Event. The event is stopped by the Team Manager. Recorder stops the recording. Team member stops the Event. Event is closed
---
## Page: Volume Buy: Tiered Bulk Pricing | AuctionWorx Enterprise
URL: https://www.systenics.com/auctionworx/volume-buy/
Description: Boost your average order value and attract wholesale buyers with Volume Buy for AuctionWorx. Offer real-time tiered discounts to incentivize bulk purchases.
# Volume Buy for AuctionWorx
## Boost average order value with automated tiered bulk pricing.
The more they buy, the more they save. Our Squad built the ultimate Volume Buy feature so you can offer real-time wholesale discounts and move inventory faster — with 100% mission success.
[Connect for Mission Launch](#)
## Selling One Item at a Time?
Standard fixed pricing is great for retail, but what happens when you have deep inventory? Buyers want deals for buying in bulk, and without built-in incentives, you miss out on massive B2B orders.**Volume Buy** changes the game by automatically discounting prices based on quantity.
**
#### Standard Listing
Fixed Price
- Price remains identical regardless of quantity
- No incentive for buyers to increase order size
- Alienates wholesale and B2B customers
- Risk: Slower inventory turnover
**
#### Volume Buy
Tiered Bulk Pricing
- Price drops automatically as quantity increases
- Real-time dynamic price updates for the buyer
- Transparent discount tiers encourage larger orders
- **Result:** Higher Average Order Value and fast liquidation
## Incentivize Big Orders
Our experts designed Volume Buy to empower your marketplace. It transforms standard checkouts into highly optimized wholesale engines.
**
#### For Sellers
Drastically boost Average Order Value (AOV), attract B2B wholesale buyers, and clear out overstock inventory rapidly with automated bulk incentives.
**
#### For Buyers
Transparent tiered discounts make it easy to see the savings. The unit price updates dynamically in real-time, delivering a seamless checkout experience.
**
#### Dashboard Control
Manage your discount campaigns right from the seller dashboard. Track Volume Buy transactions seamlessly alongside your standard orders.
## How It Works
Three steps to wholesale success.
Seller Setup **Volume Buy** **Enable Volume Buy **Tier 1** Buy 5 - 9 at $45.00/each **Tier 2** Buy 10+ at $40.00/each Step 1
### Define Your Tiers
The seller simply checks "Enable Volume Buy" during listing creation. You configure the minimum and maximum quantities for each tier and assign a discounted unit price.
Set as many tiers as you need to drive wholesale demand. The pricing rules are instantly saved and applied to your listing.
Buyer Interaction **10+ Items** $40.00 / ea **Quantity: 12 ** Total: $480.00 Step 2
### Dynamic Price Updates
Buyers see a clean, dedicated pricing table directly on the listing page. As they adjust the purchase quantity, the active tier is highlighted instantly.
The unit price and total price update dynamically in real-time, providing total transparency and encouraging buyers to hit the next discount threshold.
Invoice & Checkout **Shopping Cart** Product (x12) $40.00 ea Step 3
### Seamless Checkout
The selected tier pricing is securely locked in and carries over seamlessly through the cart and the checkout process.
The final invoice clearly displays the discounted unit price, ensuring buyers are confident in their savings from start to finish.
## Perfect For These Missions
Volume Buy powers up bulk sales across different domains.
**
##### B2B & Wholesale
Perfect for platforms catering to business buyers who purchase supplies in massive quantities.
**
##### Overstock Liquidators
Clear out warehouses quickly by offering irresistible bulk discounts on surplus inventory.
**
##### Retail Marketplaces
Increase consumer order sizes for daily goods by showing them exactly how much they save.
## Ready to Empower Your Sellers?
Our Squad is standing by to integrate Volume Buy into your AuctionWorx platform. Transform your sales strategy and connect with us for mission launch.
[Get in Touch Now!](#)
---
## Page: Antiques & Collectibles Auction Marketplace Solutions | Systenics
URL: https://www.systenics.com/auctionworx/power-your-antiques-collectibles-auction-marketplace-with-systenics/
Description: Create a trusted marketplace for rare treasures. Secure auction software for antiques, artifacts, and collectibles with community engagement features.
# End-to-End Solutions for Antiques & Collectibles Auctions
## Increase sales by 50%
[Get Started Now!](#) * The world of antiques and collectibles demands authenticity, trust, and a seamless user experience. Systenics delivers custom software solutions to help auction houses and marketplaces showcase rare items, connect with passionate collectors, and streamline operations.
Our platforms provide exclusive access to vintage treasures while ensuring transparency and engagement.
Built on the powerful **[AuctionWorx](https://www.systenics.com/auctionworx/)** platform, Systenics offers a complete end-to-end solution for antiques and collectibles auctions. Build a premium marketplace for high-value items with our solution.
### Power Your Antiques & Collectibles Auction Marketplace with Systenics
* Curated Collections
Showcases a curated selection of antiques and collectibles, organized by category, theme, or type. It helps customers easily browse, discover, and explore unique items within specific groups or featured collections.
** Vintage Discussion Board
Community space where collectors, enthusiasts, and experts can share knowledge, discuss rare finds, ask questions, and exchange insights about antiques, artifacts, and collectibles.
** Exclusive Discount Coupons
Tool that allows businesses to create, manage, and track promotional codes, discounts, and special offers. It helps attract customers, boost sales, and increase customer loyalty by offering personalized or rule-based coupons that can be applied during checkout across web, app, or marketplace channels.
** AI enhanced Listing Description
A good product item description is crucial for its sale as well as helps enhance your sites SEO. Our AI enhanced listing description generator tool helps you harness the power of AI to generate unique and SEO focused descriptions for antique listing created every day. Using the photos of the artefacts AI and identify and provide rich details about the item to enhance your listing.
** Accounting System Integration
Synchronize financials, track transactions, and automate invoicing through QuickBooks or Xero to ensure smooth and transparent accounting.
** Reverse Logistics
Involves initiating return requests, scheduling product pickups, inspecting returned items, and processing refunds or replacements.
** Referral Program Integration
Incentivize users to refer others to the platform with a built-in referral system—amplifying user acquisition and platform growth organically.
** [Mobile Apps](https://www.systenics.com/auctionworx/mobile-apps/) for both Buyers and Sellers
Mobile apps help increase your buyer reach giving them the ease of being able to bid on items from anywhere. Push notification ensure they are locked in and in the loop to drive up more bids.
Sellers can use the mobile apps to quickly make listings on the fly. Click and upload multiple hi-res product photos to make your listings attractive and accurate right from the mobile app saving your team tons of time in creating correct listing.
---
## Page: eCommerce Overstock & Returns Auction Solutions | Systenics
URL: https://www.systenics.com/auctionworx/end-to-end-solution-for-auction-of-ecommerce-overstock-box-damaged-and-returned-items/
Description: Turn overstock, box-damaged, and returned items into revenue. Scalable end-to-end auction platforms for eCommerce sellers and liquidators.
# End-to-End Solutions for eCommerce Auctions
## Increase sales by 50%. Slash backend costs by 40%
[Get Started Now!](#) * Built on the powerful **[AuctionWorx](https://www.systenics.com/auctionworx/)** platform, Systenics offers a complete end-to-end solution for eCommerce auctions. Maximize recovery value for overstock and returned items. Our platform streamlines the auctioning of box-damaged and eCommerce inventory.
At Systenics, we have worked with several growing eCommerce clients to refine a set of products that go far beyond managing auctions. Our scalable solutions are designed to grow with your business, whether you are just starting up or an established seller.
From warehouse management to customer engagement, we deliver end-to-end platform tailored to your unique needs.
### Key Features to dominate the Digital Shelf
* Amazon Product Advertising API Integration
Integration using Amazon / Home Depot official API for accessing product details and generating affiliate links programmatically. Save time from manual product searches and create more accurate product listings.
** CRM Integration
Connect with popular CRM systems like HubSpot, Zoho, Dynamics 365, or a custom ERP to manage customer profiles, product listings, and engagement history. CRM integration helps you to drive digital campaigns and advertisements to increase reach of your stores. We can build one-way or two way integration with these systems to stop duplication of item content.
** Exclusive Discount Coupons
Tool that allows businesses to create, manage, and track promotional codes, discounts, and special offers. It helps attract customers, boost sales, and increase customer loyalty by offering personalized or rule-based coupons that can be applied during checkout across web, app, or marketplace channels.
** AI enhanced Listing Description
A good product item description is crucial for its sale as well as helps enhance your sites SEO. Our AI enhanced listing description generator tool helps you harness the power of AI to generate unique and SEO focused descriptions for antique listing created every day. Using the photos of the artefacts AI and identify and provide rich details about the item to enhance your listing.
** Warehouse Management
Streamlines daily warehouse operations, improves customer satisfaction, and boosts operational efficiency. It tracks stock location in real time, optimizes picking and packing processes, ensures accurate, on-time deliveries managed through QR codes, and efficiently operates multiple warehouses or fulfilment centers.
** Reverse Logistics
Involves initiating return requests, scheduling product pickups, inspecting returned items, and processing refunds or replacements.
** Referral Program Integration
Incentivize users to refer others to the platform with a built-in referral system—amplifying user acquisition and platform growth organically.
** [Mobile Apps](https://www.systenics.com/auctionworx/mobile-apps/) for both Buyers and Sellers
Mobile apps help increase your buyer reach giving them the ease of being able to bid on items from anywhere. Push notification ensure they are locked in and in the loop to drive up more bids.
Sellers can use the mobile apps to quickly make listings on the fly. Click and upload multiple hi-res product photos to make your listings attractive and accurate right from the mobile app saving your team tons of time in creating correct listing.
---
## Page: Estate Sales Auction Software & End-to-End Solutions | Systenics
URL: https://www.systenics.com/auctionworx/end-to-end-solution-for-estate-sales-auctions-with-systenics/
Description: Streamline estate liquidation auctions with specialized software. Rapid inventory categorization, integrated valuation tools, and verified buyer networks for estate auctioneers.
# End-to-End Solutions for Estate Sales Auctions
## Increase sales by 50%
[Get Started Now!](#) * Built on the powerful **[AuctionWorx](https://www.systenics.com/auctionworx/)** platform, Systenics offers a complete end-to-end solution for estate sales. Streamline estate liquidation with rapid inventory processing, integrated valuation tools, and verified buyer networks.
Our platform supports bulk inventory uploads, rapid categorization, and automated descriptions that transform weeks of manual work into days of efficient liquidation.
From warehouse management to buyer verification and community engagement, we deliver an end-to-end platform tailored to your estate liquidation workflow.
### Key Features for Estate Sales Auctions
* Bulk Inventory Upload & Categorization
Upload 100+ items at once with AI-powered automatic categorization. Organize furniture, jewelry, [collectibles](https://www.systenics.com/auctionworx/power-your-antiques-collectibles-auction-marketplace-with-systenics/), and more into market-ready listings in minutes. Reduces manual data entry time by up to 75%.
** Integrated Valuation & Appraisal Tools
Access real-time market comparables and historical sale data. Reference databases for fine art, furniture, jewelry, and collectibles help you confidently value complex estates and price items competitively.
** AI-Enhanced Listing Descriptions
Transform photos and manual notes into SEO-rich, compelling descriptions automatically. Our AI identifies condition, era, materials, and provenance from images, attracting serious buyers and improving search visibility.
** Time-Sensitive Bidding Mechanics
Set strategic auction end dates to maintain buyer urgency. Escalating bid notifications and countdown timers drive competitive bidding, typically increasing final hammer prices by 20-40% compared to fixed-price listings.
** Buyer Authentication & Verification
Attract and verify serious collectors, dealers, and institutions. Track buyer ratings, payment history, and return patterns. Premium buyer status encourages higher bids and reduces fraud risk.
** Warehouse Management & QR Tracking
Track every item from intake through delivery. QR-based inventory management, multi-location support, and automated pick-and-pack workflows reduce errors and accelerate fulfillment.
** Community Discussion Forum
Build a community of estate specialists — appraisers, collectors, dealers, and enthusiasts. Enable discussions and expert commentary on listings to drive engagement, build trust, and increase sale prices.
** [Mobile Apps](https://www.systenics.com/auctionworx/mobile-apps/) for Buyers and Sellers
List new estates on the go. Buyers bid from anywhere with push notifications for price alerts and countdown timers. Field agents photograph and upload hi-res images directly from estate walks, dramatically reducing admin overhead.
---
## Page: Livestock Auction Software & End-to-End Solutions | Systenics
URL: https://www.systenics.com/auctionworx/streamline-livestock-auctions-with-systenics-end-to-end-solutions/
Description: Streamline your livestock auctions with specialized software. We connect breeders and buyers with lineage tracking, GPS search, and live bidding.
# End-to-End Solutions for Livestock Auctions
## Increase sales by 50%
[Get Started Now!](#) * Built on the powerful **[AuctionWorx](https://www.systenics.com/auctionworx/)** platform, Systenics offers a complete end-to-end solution for livestock auctions. Digitalize livestock auctions with our specialized software. Manage cattle, sheep, and other livestock bidding with real-time updates.
Our platforms support live online bidding, rare breed showcases, and robust tools to manage animal lineage and market trends, ensuring a seamless auction experience.
### Key Features for Livestock Auctions
* Lineage Tracker (Family Tree)
Easily record and view animal lineage with a visual and searchable family tree for smarter breeding decisions.
** Livestock Discussion Board
Community space where collectors, enthusiasts, and experts can share knowledge, discuss rare finds, ask questions, and exchange insights about breeds, animals, and livestock.
** Exclusive Discount Coupons
Tool that allows businesses to create, manage, and track promotional codes, discounts, and special offers. It helps attract customers, boost sales, and increase customer loyalty by offering personalized or rule-based coupons that can be applied during checkout across web, app, or marketplace channels.
** CRM Integration
Connect with popular CRM systems like HubSpot, Zoho, Dynamics 365, or a custom ERP to manage customer profiles, product listings, and engagement history. CRM integration helps you to drive digital campaigns and advertisements to increase reach of your stores. We can build one-way or two way integration with these systems to stop duplication of content.
** AI enhanced Listing Description
A good product item description is crucial for its sale as well as helps enhance your sites SEO. Our AI enhanced listing description generator tool helps you harness the power of AI to generate unique and SEO focused descriptions for antique listing created every day. Using the photos of the artefacts AI and identify and provide rich details about the item to enhance your listing.
** Nearby Listings and Locations
Find animals or farms close to you with precision-based GPS radius search.
** Stockyard Forum
Join the conversation on the Stockyard Forum where ranchers, breeders, and livestock enthusiasts connect, trade advice, and talk market trends.
** Accounting System Integration
Synchronize financials, track transactions, and automate invoicing through QuickBooks or Xero to ensure smooth and transparent accounting.
**[Mobile Apps](https://www.systenics.com/auctionworx/mobile-apps/) for both Buyers and Sellers
Mobile apps help increase your buyer reach giving them the ease of being able to bid on items from anywhere. Push notification ensure they are locked in and in the loop to drive up more bids.
Sellers can use the mobile apps to quickly make listings on the fly. Click and upload multiple hi-res product photos to make your listings attractive and accurate right from the mobile app saving your team tons of time in creating correct listing.
** Lead Generation Tool
Attract more buyers and sellers to livestock markets by offering tailored tools that generate high-quality leads, streamlining connections and driving market growth.
---
## Page: Own Your Auto Auction Platform | White-Label Car Auction Software | Systenics
URL: https://www.systenics.com/auctionworx/end-to-end-solution-for-your-used-rare-or-new-automobile-auctions/
Description: Launch your own branded automobile auction marketplace. Auto Auction Suite gives you full ownership — your domain, your fees, your leads. VIN decoding, damage annotation, live bidding, mobile apps & more.
# Run Your Own Online Auto Auction Platform
## Your brand. Your rules. Your profit.
Stop paying commissions to third-party marketplaces. Launch a fully branded automobile auction site on our [car auction software](https://www.systenics.com/auctionworx/pricing/), with every tool your buyers and sellers need — from VIN decoding to live bidding.
[Get Started Now!](#)[** View Live Demo](https://autoauctionsuite.systenics.com/) *
Why Build Your Own Auction Platform?
## Own the Platform. Own the Market.
Third-party auction marketplaces lock your sellers into their platform, take a cut of every sale, and keep your buyer data for themselves. Auto Auction Suite puts you in complete control — every listing, lead, and transaction belongs to you.
*
#### Your Brand, End-to-End
Your logo, your domain, your colors — on web and mobile. Buyers associate every bid with your brand, not someone else's marketplace.
**
#### You Set the Fees
Define your own buyer's premium, seller fees, and commission structure. No percentage skimmed by an intermediary — every dollar goes directly to your business.
**
#### Full Control, Zero Limits
From auction rules and listing requirements to community moderation and custom data exports — you configure every aspect of the platform your way.
** Your Marketplace Homepage
## A Homepage That Wins Buyers on First Visit
### Live Bids. Featured Listings. Instant Action.
Your homepage is your auction floor. A sleek vehicle slider showcases your premier listings front and center, while a **Live Recent Bids** feed tracks the 6 most active auctions in real time — building urgency that drives bidders deeper into your platform.
The **Featured Listings** grid gives buyers everything at a glance: high-resolution imagery, current bid, end date, and location. A single **Quick Bid** button lets them place an offer in seconds — no page-by-page hunting required.
- **Hero vehicle slider with real-time countdown
- **Live Recent Bids feed — admin toggleable (Admin can Toggle)
- **Quick Bid from the listing grid
- **Fully branded to your business
**autoauctionsuite.systenics.com *
* Mobile App — Home
* *autoauctionsuite.systenics.com/listing/details/... * Vehicle Specifications — auto-populated via VIN decoding
* Same experience on mobile — listing detail, Carfax badge & Quick Bid always visible
* * Listing Detail Pages
## Every Detail, Built for Confident Bidding
### Transparency That Converts Browsers to Bidders
A well-designed listing page reduces hesitation. The top of every listing pins critical info in view — vehicle title, subtitle, current price, live countdown timer, and quick-action buttons for **Watch List** and social sharing — so buyers never scramble for key details.
Dedicated **Pricing** and **Seller Information** sections ensure financial details and seller credibility are always front-and-center. Below the fold, a structured vehicle specs table is auto-populated directly from VIN decoding — no manual entry, no guesswork.
- **Sticky bid bar with live countdown
- **Watchlist + social share buttons
- **VIN-decoded specs table — 30+ data fields (customizable)
- **Seller profile & pricing section
** VIN Decoding
## One VIN. Every Spec. Zero Manual Entry.
### Accurate Data, Instantly Populated
Sellers on other platforms spend precious time filling in each vehicle spec by hand — and buyers pay the price with incomplete or inaccurate listings. Auto Auction Suite eliminates that friction. Enter a VIN and the platform instantly pulls verified specifications from leading data providers:**Carfax**, **DVLA**,**Vehicle Data Global**, and **ChromeData**.
Admins can individually enable or disable **any** data provider from the control panel. Sellers can use their own API credentials or rely on the site's shared credentials — giving you the flexibility other platforms simply don't offer.
- **Auto-populates Make, Model, Trim, Engine, Transmission & more
- **4 provider integrations: Carfax, DVLA, VDG, ChromeData
- **Per-provider toggle from admin control panel
- **Seller or site-wide API credentials
VIN Decoder — Seller View * Admin Control Panel — VIN Provider Settings
* VIN Decoding on Mobile — sellers decode from anywhere
* Mark Damage — Seller Annotation Tool Damage Inspection — Buyer View with Zoom
* Mark & inspect damage on mobile — pin, zoom, review
* * Vehicle Damage Annotation
## Vehicle Damage Annotation
### Interactive Inspections That Eliminate Surprises
Photos alone can hide defects or create misleading impressions. The **Damage Annotation Tool** lets sellers place precise, categorized pins directly on vehicle images — choosing from **Cracked**,**Dent**, **Scratched**, or **Paint Chip** — mapped with numbered markers and a corresponding legend.
Buyers get a **zoom and full-screen viewer** to inspect every marker with clarity before placing a bid. The result: fewer disputes, higher buyer satisfaction, and a level of pre-sale transparency that no third-party listing marketplace currently provides.
- **Interactive damage pins on real vehicle photos
- **Categorized: Cracked, Dent, Scratched, Paint Chip
- **Numbered legend matched to markers
- **Buyer zoom + full-screen inspection view
** Vehicle Location & Distance
## Vehicle Location & Distance
### Geographic Search No Marketplace Offers
Many buyers prefer to inspect a vehicle in person before committing to a bid. Auto Auction Suite's integrated location tools make that possible. From any listing, buyers can instantly calculate distance and view driving routes between their address and the vehicle's location — powered by Google Maps.
On the browse page, a flexible **Radius Filter** narrows results to vehicles within a set distance of any city or zip code. Buyers can use saved addresses, enter a new location manually, or tap **"Get Current Location"** for instant, GPS-accurate results. No other auto auction platform includes this level of geographic discovery built-in.
- **Google Maps driving directions from any listing
- **Radius filter on browse page (by city or zip)
- **Saved addresses + GPS "current location"
Get Directions — Google Maps Integration * Radius Filter — Browse Select Location
* Full location tools on mobile — radius filter, GPS, Google Maps directions
* Marketplace Discussions — Listing View Rich Discussion Comments Vehicle Discussion Hub — User Profile
* Community discussions built into the mobile app
* * Community Discussions
## A Community That Belongs to You
### Transparent, Engaged, Moderated — On Your Platform
The community discussion thread is one of the most powerful trust-building features an auction platform can offer. Auto Auction Suite includes a fully-featured real-time discussion hub on every listing — with **upvote/downvote** voting, threaded replies, and live updates so conversations flow naturally without page refreshes.
Your admins can pin **"Top Comments"** to surface expert insights and ensure quality advice is seen first. Users can flag misleading data or abusive behavior with a single click. Every participant builds a**Discussion Impact Score** in their profile — keeping your community engaged and accountable, on *your* platform — not feeding another site's engagement metrics.
- **Real-time updates — no page refresh needed
- **Upvote/downvote + threaded replies
- **Admin-controlled "Top Comment" pinning
- **Community Impact Score in user profiles
** Lead Generation
## Capture Sellers Before They List Elsewhere
### Turn Visitors into Consignors — Automatically
The built-in **Lead Generation Tool** gives potential sellers a professional, high-converting *"Request a Consultation"* experience directly on your platform. A dual-layout design combines compelling marketing copy on the left with a structured intake form on the right.
The form captures everything your team needs upfront: VIN, odometer readings, and **media uploads** including high-resolution photos and even engine audio files. The moment a form is submitted, your team receives an automatic notification — and admins can configure multiple recipient email addresses directly from the control panel.
- **Branded "Request a Consultation" page
- **VIN, odometer, condition, and media uploads
- **Instant email notification to your team
- **Multi-recipient email — admin configurable
Request a Consultation — Lead Generation Form * * White-Label Mobile Apps
## Bid. Browse. Sell. All From Your Phone.*
### Fully Branded iOS & Android Apps Your Buyers Will Actually Use
Most third-party auction platforms don't offer dedicated mobile apps at all. Auto Auction Suite includes fully branded **iOS and Android apps** — your logo, your name, published on the App Store and Google Play. Every screen your buyers and sellers see carries your brand, not ours.
**
##### Live Bidding, On the Go
Buyers browse, bid, and watch auctions from anywhere. The app mirrors every real-time update from the web platform — live countdown timers, current bid amounts, and Quick Bid buttons all behave identically on mobile.
**
##### Push Notifications That Drive Bids
Outbid alerts, auction ending reminders, and watchlist notifications are pushed directly to the buyer's lock screen. Bidders stay engaged even when they're not actively browsing — keeping auction energy high through to the close.
**
##### Sell & List Directly From Mobile
Sellers can photograph a vehicle, decode the VIN, annotate damage, and publish a listing — all without touching a desktop. The full Create Listing flow, including Carfax/DVLA lookup and Mark Damage tool, is available in the app.
**
##### Browse, Filter & Discover
Grid and list view, category menus, radius filter, saved recent searches — the full browse experience is built into the mobile app. Buyers can find vehicles near them using GPS and filter by distance, category, price, and status.
**
##### Full Account & Invoicing
Buyers and sellers can manage their account, review invoices, track bid history, view purchased lots, and update payment details — all from the app. No need to switch to a desktop for post-auction management.
**
##### Multi-Language & Multi-Currency*
The mobile app supports multiple languages — including full Arabic (RTL) support — and displays amounts in your platform's configured currencies. Reach international buyers without friction.
[** Explore Mobile Apps in Detail](https://www.systenics.com/auctionworx/mobile-apps/) * * ** Carfax Integration
### Verified History Reports — On Your Platform
Buyers trust Carfax. Now that trust works for you. Sellers can link any vehicle's official **Carfax Vehicle History** report directly to their listing — displaying a verified badge and a *"View Report"* button that gives buyers instant access to accident history, service records, and ownership data.
The same trust signals buyers expect from the biggest marketplaces — now featured on your branded platform, driving confidence without sending traffic elsewhere.
*
Carfax Report Available
* ** Mobile Apps
### White-Label iOS & Android Apps
While most third-party auction marketplaces offer no dedicated mobile experience, Auto Auction Suite ships with fully white-labeled **iOS and Android apps** — your name, your logo, published on the App Store and Google Play under your brand.
Buyers receive **push notifications** for outbid alerts, auction ending reminders, and daily watchlist summaries — keeping them engaged even when the app is closed. Sellers can photograph vehicles, run a VIN decode, annotate damage, and go live with a listing without ever touching a desktop.
** Outbid push alerts ** Mobile listing creation ** In-app VIN decoder ** GPS radius search ** Invoices & bid history ** Multi-language & RTL *
Consultation
Vehicle Details
Media Upload
[* Explore Mobile Apps](https://www.systenics.com/auctionworx/mobile-apps/)
## Everything to Run a World-Class Auction
### Enterprise-Grade Tools, Built Into Every Licence
Beyond the headline features, Auto Auction Suite ships with a full stack of business-critical capabilities — no extra modules, no add-on fees.
**
##### Automated VIN Decoding
Instantly pull verified specifications from Carfax, DVLA, VDG, and ChromeData. Eliminate manual entry errors and provide buyers with accurate vehicle data automatically.
[View Demo **](#) **
##### Interactive Damage Annotation
Let sellers place precise, categorized pins on vehicle photos. Interactive inspection tools with zoom allow buyers to see every defect before they place a bid.
[View Demo **](#) **
##### Nearby Vehicle Discovery
Integrated Google Maps and radius filters help buyers find auctions close to home. GPS-accurate search makes local inspection and pickup easy for your users.
[View Demo **](#) **
##### Community Discussion Hub
Build trust with real-time threaded comments on every listing. Features include upvote/downvote, admin pinning, and community impact scores for better engagement.
[View Demo **](#) **
##### Branded Lead Generation
Capture potential sellers with professional consultation forms. Automatically collect VIN, condition data, and high-res media to grow your inventory pipeline.
[View Demo **](#) **
##### White-Label Mobile Apps
Your own branded iOS and Android apps published on official stores. Drive engagement with push notifications for outbid alerts and real-time auction updates.
** Platform Comparison
## Why Build Your Own vs. List on Someone Else's?
Third-party auction marketplaces take a cut of every sale and own your buyers. Auto Auction Suite gives you the same powerful features — on your own platform, under your own brand.
Feature Other Platforms
Third-Party Marketplaces **Auto Auction Suite
Your Own Platform **Platform Ownership & Branding Own your domain & brand identity ** ** White-label mobile app (iOS & Android) ** ** Set your own buyer's premium & seller fees ** ** All seller leads go to you ** ** Keep your buyer data & email list ** ** **Listing Tools & Discovery High-res photo galleries ** ** Carfax / vehicle history report integration ** ** **VIN decoding — auto-populates all specs ** ** **Interactive damage annotation with zoom viewer ** ** **Location-based search with radius filter ** ** AI-generated listing descriptions ** ** **Bidding & Auction Management Online timed auctions ** ** Anti-sniping / bid extension timer ** ** Watchlist with outbid notifications ** ** Reserve & no-reserve support ** ** Quick Bid from listings grid ** ** **Community Tools Per-listing buyer/seller discussions ** ** Upvote / downvote comments ** ** Admin-pinned "Top Comments" ** ** Community Discussion Impact Score ** ** Dedicated automotive marketplace forum ** ** **Business Operations & Integrations Seller lead generation tool ** ** Admin control panel & configuration ** ** **Mobile Experience Mobile-responsive web interface ** ** **Dedicated iOS & Android apps (your branding) ** ** Push notifications for bids & auctions ** ** Mobile listing creation (photos + upload) ** ** ** Included ** Not Available ** Auto Auction Suite Exclusive
## Frequently Asked Questions
###
Marketplaces rent you their audience and keep the buyer relationship. This is your own branded auto auction platform — your domain, your fees, your bidder list, with VIN decoding, damage annotation and live bidding built in.
###
Yes — registration can be gated to verified dealers, with public, dealer-only or hybrid auction lanes on the same platform.
###
A branded platform on AuctionWorx typically launches in weeks, not months — the auction engine exists; we configure, customize and deploy it for your business.
## Ready to Launch Your Own Auto Auction Platform?
Stop building your competitor's audience. Auto Auction Suite gives you a complete, white-label automobile auction platform — every feature included, fully branded to you from day one.
[** Explore the Live Demo](https://autoauctionsuite.systenics.com/)[** Book a Consultation](#)
---
## Page: Real Estate Auction Software & Platform Development | Systenics
URL: https://www.systenics.com/auctionworx/power-your-property-auctions-with-systenics-innovative-end-to-end-solutions/
Description: Launch a branded real estate auction platform — foreclosures, land, luxury and off-market property. White-label software with escrow-ready workflows, from a RainWorx Premium Partner.
# Real Estate Auction Software, Built for Your Brand
## Run foreclosure, land and luxury-property auctions on a platform you own — your domain, your fees, your buyer list.
[Get Started Now!](#) * Built on the powerful **[AuctionWorx](https://www.systenics.com/auctionworx/)** platform, Systenics builds complete **real estate auction software** for property and real estate auctions. Transform your business with a white-label **property auction platform** you own outright. Streamline real estate listings, bidding, and closing processes effectively.
Systenics builds secure, user-friendly platforms to connect buyers and sellers, ensuring trust and efficiency.
Our solutions streamline the auction process, from buyer verification to escrow management, helping you unlock the full potential of property markets.
### Essential Features for Property Auctions Success:
* Buyer Verification
Ensure secure registration by verifying name, email, and credit card details. This helps prevent fraud and builds trust with genuine buyers.
** Escrow & Deposits
Safely manage deposits and escrow funds during transactions. Protect both buyers and sellers while ensuring a smooth auction process. 3rd party Escrow services are perfect for large value property transactions. Take a pre-auction deposit ensures that only genuine buyers participate in the auction process.
** CRM Integration
Connect with popular CRM systems like HubSpot, Zoho, Dynamics 365, or a custom ERP to manage customer profiles, product listings, and engagement history. CRM integration helps you to drive digital campaigns and advertisements to increase reach of your stores. We can build one-way or two way integration with these systems to stop duplication of content.
** Accounting System Integration
Synchronize financials, track transactions, and automate invoicing through QuickBooks or Xero to ensure smooth and transparent accounting.
** Lead Generation Tool
Attract more buyers and sellers to [livestock](https://www.systenics.com/auctionworx/streamline-livestock-auctions-with-systenics-end-to-end-solutions/) markets by offering tailored tools that generate high-quality leads, streamlining connections and driving market growth.
** Nearby Listings & Location Search
Easily discover homes near you using Google Maps-powered radius search. Find the perfect property in your preferred area with pinpoint accuracy. Automate Backend Workflows Property purchase involves a lot of paperwork, our solutions helps you automate your workflow so that sales are not stuck in tedious paperwork and the process can flow as smoothly as possible. Our end to end tools help you extend the full life cyle of a property sale.
** AI Enhanced Listing Description
A good product item description is crucial for its sale as well as helps enhance your sites SEO. Our AI enhanced listing description generator tool helps you harness the power of AI to generate unique and SEO focused descriptions for antique listing created every day. Using the photos of the artefacts AI and identify and provide rich details about the item to enhance your listing.
** Online/Offline Live Property Auction
Bid online or on-site, with live broadcasts with an Auctioneer. Buyers can participate from anywhere in the world through live online bidding or attend the physical auction site.
** [Mobile Apps](https://www.systenics.com/auctionworx/mobile-apps/) for both Buyers and Sellers
Mobile apps help increase your buyer reach giving them the ease of being able to bid on items from anywhere. Push notification ensure they are locked in and in the loop to drive up more bids.
Sellers can use the mobile apps to quickly make listings on the fly. Click and upload multiple hi-res product photos to make your listings attractive and accurate right from the mobile app saving your team tons of time in creating correct listing.
** Bulk Listing Creation in Excel
Our Excel Plug-in allows your backend team to create listing in bulk on AuctionWorx. Collect data from various sources in a simple to manage Excel sheet and directly upload 1000's for items and their respective images.
## Frequently Asked Questions
###
Yes — auction formats, deposit requirements and disclosure documents are configurable per listing, so foreclosure, trustee and traditional sales can run side by side.
###
You decide. The platform supports deposit holds, document-gated registration and manual bidder approval for high-value property auctions.
###
Your own. White-labeled on your domain with your branding, your commission structure and your customer data — we build and deploy it, you own it.
---
## Page: Why the Cheapest AuctionWorx Developer Costs the Most
URL: https://www.systenics.com/blogs/why-the-cheapest-auctionworx-developer-costs-the-most/
Description: Understanding the hidden costs of cheap AuctionWorx customizations, and why platform expertise is critical for business continuity and long-term success.
# Why the Cheapest AuctionWorx Developer Costs the Most
**by:** Saurabh Nandu **in:** [General](https://www.systenics.com/blogs/category/general/) **tags:**[*AuctionWorx*](https://www.systenics.com/blogs/tag/auctionworx/), [*Development*](https://www.systenics.com/blogs/tag/development/), [*Customization*](https://www.systenics.com/blogs/tag/customization/)
Every few months, we get a call that starts the same way.
"We hired someone to customize our [AuctionWorx](https://www.systenics.com/auctionworx/) site six months ago. It was affordable — under thousand dollars. But now nothing works. Incomplete customizations, broken features, unstable sites, undocumented features. Our latest changes have been throwing errors for three weeks, and the developer stopped responding."
We call these "rescue missions." And over 15+ years of hands-on AuctionWorx experience, we've handled enough of them to spot a pattern. The cheapest developer almost always costs the most — you just don't see the bill until months later.
This isn't about convincing you to spend more than you need to. It's about understanding where the real costs hide when you choose a developer based on price alone, and why AuctionWorx — a platform we've specialized in for over a decade — is particularly unforgiving when corners get cut.
## The Real Cost of "Affordable" AuctionWorx [Customization](https://www.systenics.com/auctionworx/development-and-customization/)
Let's look at what actually happens when an AuctionWorx customization goes wrong. These aren't hypothetical scenarios. They're pulled from projects our Superhero Squad has stepped in to fix.
### The $750 UI Redesign That Broke the Bidding Engine
A client hired the lowest freelancer on upwork to redesign their AuctionWorx theme. The rate was cheap, the portfolio looked decent, and the work was delivered in three weeks. The mockups looked great, the actual site implementation - not so much.
What they didn't know: the developer had directly modified core AuctionWorx view files instead of working through the platform's theming system. The theme appeared partially, every few days they kepy finding new pages which were not styled right. Eventually, the developer stopped responding since the scope of work far increased the time he had estiamted.
The client lost weeks of auction revenue before anyone noticed. Fixing it required our [AuctionWorx development team](https://www.systenics.com/auctionworx/development-and-customization/) to rebuild the customizations properly on the updated platform. Total cost: more than four times the original $750 — plus the revenue lost during downtime.
### The Migration That Took Down the Database
Another client needed to migrate their AuctionWorx 3.5 installation 3.6. The developer they found quoted a flat $800 for the migration — significantly lower than our scoped estimate.
The migration never compeleted, because the developer failed to access all the customizations made to the system. The client didnt document the customizations made to the system, the developer didnt discover them before. Midway through the migration, the developer ran into issues and the scope increased. The developer disappeared with a broken half migration.
Our team spent the next 48 hours recovering the database, indexing the undocumented customizations and fixing the migration issues. The emergency fix cost more than what an experienced developer would have charged to do the deployment right the first time.
### It started good, but over time it went south
We also get clients who come to us after 3 to 6 months of working with the cheapest developer. They start with small customizations. The developer is able to do them and the client is happy. Over time, the client comes up with more customizations. The developer is still able to do them. But slowly the quality of work starts to decline.
Our clients typically reach out when the customizations start failing, the performance of the site deteriorates or they realize the developer is not able to handle complex customizations. When we take over the project, we discover that the initial simple customizations were done right but over time the developer started taking shortcuts. In the end, the client pays more to fix the mess than what it would have costed to hire the right developer in the first place.
## Where the Cheap Developer Model Breaks Down
AuctionWorx isn't a WordPress site. It's a .NET MVC application with deep integration points, multi-tenant seller logic, real-time bidding infrastructure, and a payment processing pipeline that handles actual money. Cut corners here, and you're not risking a broken contact form — you're risking auction integrity. Years of platform-specific experience matter in ways that general .NET development cannot substitute.
Here's where low-cost developers consistently fall short.
### Platform Architecture Knowledge
AuctionWorx has been evolving for over two decades. Version 3.5 introduced significant API changes. Version 3.6 overhauled the payment pipeline. The Events Edition has its own extension architecture. A developer who treats AuctionWorx like a generic ASP.NET application — which is what most budget developers do — will modify the wrong files, break upgrade paths, and introduce conflicts that surface weeks or months later.
Our team has been working with AuctionWorx since well before these modern versions existed. We know which files to touch, which to extend through the platform's own APIs, and how to ensure your customizations survive upgrades. That knowledge isn't a line item on an invoice — but its absence is.
### Bidding Infrastructure at Scale
Most AuctionWorx customization looks fine on a development server with five test users. The problems appear when 200 people are bidding simultaneously on a lot closing in sixty seconds.
Real-time bidding under load requires understanding SignalR connection management, database locking strategies during bid resolution, and how AuctionWorx's event pipeline processes concurrent requests. Get any of this wrong, and you get the nightmare scenario: the bidder who clicked first doesn't win, and the audit trail shows it.
We've tuned bidding infrastructure for platforms handling thousands of concurrent users. Our [AuctionWorx Live Auctions](https://www.systenics.com/auctionworx/live-auctions/) product alone required months of latency optimization to support real-time video alongside sub-second bid processing. You can't bolt that expertise onto a fixed-price customization project.
### Security and PCI Compliance
AuctionWorx platforms process payments. That means PCI compliance, secure credit card handling, and proper encryption — not just on the checkout page, but throughout the platform's data layer.
We've inherited projects where developers stored partial card data in custom database tables they'd added to the AuctionWorx schema. They didn't realize the platform already had a tokenized payment storage system. The client faced a compliance audit six months later with no idea this data existed in their environment.
As [Microsoft Gold Cloud Platform partners](https://www.systenics.com/about-us/), our deployments follow Azure's security best practices by default. Your platform runs in an environment designed for enterprise workloads, not a generic VPS with default firewall rules.
### The Upgrade Dead End
This is the cost that catches up with every cheap customization eventually. RainWorx releases updates regularly — security patches, new features, API improvements, .NET framework upgrades. If your customizations modified core files instead of extending through supported APIs, every upgrade becomes a breaking change.
You now have two options: skip updates and run an increasingly vulnerable platform, or pay someone to rebuild the customizations properly. Either way, the savings from the original cheap project evaporate — and the rebuild usually costs more than doing it right the first time because someone has to untangle the mess before they can fix it.
## Why Experience Changes the Economics
A developer who's done ten AuctionWorx projects has already made the mistakes. A developer doing their first one will make them on your platform, with your revenue at stake.
We're not being dramatic. AuctionWorx is a sophisticated platform with edge cases that only reveal themselves in production — under load, during payment processing, across different seller configurations, through upgrade cycles. The difference between an expert AuctionWorx specialist with a decade of deployment experience and a general .NET developer isn't talent. It's scar tissue. We know what breaks because we've already broken it, fixed it, and built products to prevent it from breaking again — across enterprise platforms handling thousands of concurrent bidders.
That's also why we've invested in building our own [AuctionWorx add-on products](https://www.systenics.com/products/) — [mobile apps](https://www.systenics.com/auctionworx/mobile-apps/), warehouse management, live auction streaming, Excel listing tools, and AI-powered description generation. Each product was born from a client need that a simple customization couldn't solve. Instead of building a one-off fix, we built a reusable solution. Today, those products give our clients capabilities that no freelancer — and frankly, no other AuctionWorx developer — can offer.
If you're evaluating development partners, our [AuctionWorx platform team](https://www.systenics.com/auctionworx/) can walk you through what each product does and whether it fits your roadmap.
## How to Evaluate an AuctionWorx Developer (Without Focusing on Price)
If you're comparing developers right now, here are five questions that reveal more than a price quote ever will:
**1. "Show me an AuctionWorx platform you've customized that's been running for more than two years."**
A portfolio of freshly-built sites tells you nothing about longevity. You want to see platforms that have survived multiple AuctionWorx version upgrades. Ask what version they started on and what version they're running now. If they can't answer, they probably modified core files — and their clients are sitting on ticking upgrade bombs.
**2. "What does your development lifecycle look like?"**
Are the changes properly documented? Are they tested? Are there any development standards followed? Do they provide you with a proper test enviorment to ensure through testing of all new feautres before deployment to production? Do they have a strategy to to manage changes during future updates or upgrades of AuctionWorx? Does the developer have the expertise to handle complex scenarios and edge cases?
**3. "Have you developed complex AuctionWorx customizations?"**
As your auctions business grows, so does the complexity of your requirements. A developer who can handle simple customizations might not be equipped to handle complex ones. Most of our clients have been with us for more than 5 years. Not everyone customizes at one go. Some of them start with simple customizations and then slowly scale up as their business grows. This is possible only when the developer has the expertise to handle complex scenarios and edge cases. It needs deep thiniking and understanding of the platform. Your platform will evolve with your business. A partner who's invested in your long-term success is worth more than a cheap hourly rate. So many times we get clients who have done cheap customization but they have not been implemented correctly and dont scale or work. They end up paying us again to redo them correctly. Integrations with external systems like crm, accounting, ERP, WMS etc are common. Automating backend processes is common. AI based features are becoming common. All these need deep understanding of the platform. Can your choosen developer handle these ?
**4. "What happens when I need something beyond customization?"**
Most developers can customize AuctionWorx. Almost none can build you a white-label mobile app for iOS and Android. Or a complete warehouse management system that integrates with your auction platform. Or a live streaming solution with an auctioneer dashboard. When you work with a developer who only does customization, every new requirement becomes a new vendor search. Our [AuctionWorx mobile apps](https://www.systenics.com/auctionworx/mobile-apps/), [warehouse management system](https://www.systenics.com/auctionworx/warehouse-management/), and [live auctions platform](https://www.systenics.com/auctionworx/live-auctions/) exist because our clients needed capabilities that went beyond what customization alone could deliver.
**5. "Does RainWorx know who you are?"**
This one sounds like a gatekeeping question, but it matters. We're the partner most referred by RainWorx for enterprise customization and migration work. That relationship didn't come from a certification program — it came from a decade of delivering projects that made their platform look good. When RainWorx releases a new version, we get early access. When they're planning API changes, we're in the loop. When their enterprise clients need custom work, they send them to us. That relationship directly benefits every client on our roster.
## The Math That Matters
Here's the real comparison. A budget AuctionWorx customization might cost you $750 to $3,000 upfront. A properly scoped engagement with a specialist might run $5,000 to $15,000.
If the budget version works perfectly for two years, survives every upgrade, handles your peak traffic, and never creates a security or compliance issue — you saved money. We haven't seen that happen yet, but it's theoretically possible.
What we actually see: the budget customization costs $1,500 upfront, then $4,000 to fix broken upgrades a year later, then $6,000 to rebuild it properly when the platform grows beyond what the original developer designed for. Plus the revenue lost during downtime, the bidders who don't come back after a failed auction, and the months of anxiety wondering what else is going to break.
The specialist engagement costs more upfront and less over three years. It also comes with something the budget option never includes: the confidence that your platform will still work tomorrow at 2 PM when a hundred bidders are fighting over a closing lot.
That's not a cost question anymore. That's a business continuity question.
We've been [developing and customizing AuctionWorx](https://www.systenics.com/auctionworx/development-and-customization/) for over ten years. We've built products on top of it that no other developer offers. We're the partner RainWorx trusts with their enterprise referrals. And we've rescued enough failed budget projects to know exactly what the cheapest developer actually costs.
If you're building on AuctionWorx — or fixing something that broke — let's talk before you spend twice.
## Related pages on Systenics
- [AuctionWorx platform overview](https://www.systenics.com/auctionworx/)
- [AuctionWorx development and customization](https://www.systenics.com/auctionworx/development-and-customization/)
## Need help implementing this for your business?
Our team helps plan, build, and scale marketplace and auction workflows. Explore [industry solutions](https://www.systenics.com/solutions/), [platform products](https://www.systenics.com/products/), and [custom development services](https://www.systenics.com/auctionworx/development-and-customization/) tailored to your goals.
[Book a quick consultation](https://outlook.office.com/bookwithme/user/231015685f21467da5ef6e3eb8b50240@systenics.com/meetingtype/hbYq2z1Hj0C2e7DuwBqdnw2?anonymous&ep=mcard).
---
## Page: Why High-Performing SMBs Choose a Dedicated .NET Development Squad Over Freelance Chaos
URL: https://www.systenics.com/blogs/why-smbs-choose-dedicated-dotnet-development-squad/
Description: Discover how growing businesses scale engineering velocity with a dedicated, fully managed .NET Extended Development Center without domestic hiring overhead or freelance date slips.
# Why High-Performing SMBs Choose a Dedicated .NET Development Squad Over Freelance Chaos
**by:** Saurabh Nandu **in:** [General](https://www.systenics.com/blogs/category/general/) **tags:**[*.NET*](https://www.systenics.com/blogs/tag/net/), [*Dedicated Teams*](https://www.systenics.com/blogs/tag/dedicated-teams/), [*Software Architecture*](https://www.systenics.com/blogs/tag/software-architecture/), [*SMB Growth*](https://www.systenics.com/blogs/tag/smb-growth/)
For a growing small or mid-sized business, software development is rarely just about writing code. It is about speed to market, architectural integrity, and the survival of your core business roadmap.
Yet when CTOs, product managers, and founders set out to scale their engineering capacity, they frequently find themselves caught between two equally frustrating extremes:
- **The Prohibitive Domestic Hiring Cycle:** Spending 3 to 6 months recruiting local senior .NET engineers, paying $140k to $180k+ salaries plus hefty benefits and recruitment commissions, only to repeat the process when developers jump ship eighteen months later.
- **The Freelance Roulette:** Assembling ad-hoc contractors from freelance portals who work without cohesive architecture, juggle multiple client gigs, and suddenly disappear when project complexity escalates.
There is a third, proven path that high-performing SMBs rely on to launch on time and on budget: **The Dedicated Development Squad (Extended Development Center)**.
## The Hidden Friction of Piecemeal Freelancing
Freelancers are fine for a quick one-off script. But when you are building mission-critical enterprise platforms on .NET and Microsoft Azure, the hidden costs of disconnected contract talent pile up fast:
- **Zero Collective Ownership:** A freelancer is incentivized to close their individual ticket and log billable hours. Nobody is looking at the macro architecture, long-term database query performance, or enterprise security posture.
- **The Communication Disconnect:** Without seasoned squad leaders who understand business domain language (from warehouse logistics to complex auction mechanics), requirements get lost in translation.
- **Date Slips and Disappearing Acts:** When unexpected technical roadblocks arise midway through a sprint, unmanaged contractors often stall or walk away, leaving behind undocumented code that your team has to pay someone else to untangle.
## What is a Dedicated Development Squad?
At Systenics, our [Dedicated Development Squad](https://www.systenics.com/solutions/) model is a direct, high-velocity extension of your core organization.
Instead of managing individual developers, you engage a battle-tested, fully equipped engineering squad:
- **Senior .NET & Azure Engineers:** Certified developers with deep expertise in ASP.NET Core, modern C#, microservices, and cloud infrastructure.
- **Leadership Under a Microsoft MVP:** Led by our CEO (a 4-time consecutive Microsoft MVP and technical author on .NET technologies), ensuring every line of code follows gold-standard architectural patterns.
- **Managed DevOps & QA:** Automated CI/CD pipelines in Azure DevOps or GitHub Actions, unit testing, and continuous code quality audits baked into every sprint.
## How Our Squad Delivers: The 4-Stage Mission Process
We treat every client engagement as a critical mission with a singular mandate: **100% Mission Success**. We achieve this through our fine-tuned 4-stage delivery process:
#### Stage 1: Astute Discovery & Planning
We listen first. Our Squad leaders analyze your business objectives, operational workflows, and budget boundaries to construct a crystal-clear roadmap before any code is written.
#### Stage 2: Architecture & Prototype Design
We map database schemas, interface mockups, and cloud topologies. Clients receive full visibility into how the platform will operate and scale.
#### Stage 3: Agile Iterative Engineering
Sprint demos, continuous integration, and transparent status tracking. You see real, working software delivered in two-week milestones with zero surprise scope creep.
#### Stage 4: Mission Launch & Scaling
Flawless production deployment on Microsoft Azure, comprehensive documentation, and proactive ongoing support as your user base expands.
## Why SMBs Trust Systenics for Long-Term Engineering
Our relationship with clients does not end with a single delivery. We become your dedicated technical superpower from concept all the way to exit:
- **Fixed-Cost Predictability:** No surprise invoices. We establish clear milestone pricing so you know your exact investment before work commences.
- **Deep Domain Expertise:** Beyond general software, we bring 15+ years of specialized experience in high-concurrency auction marketplaces, warehouse logistics, and AI document automation.
- **Honesty and Complete Transparency:** You have direct access to your squad leaders, full visibility into source code repositories, and weekly video syncs.
## Scale Your Engineering Capacity with 100% Confidence
Stop letting developer shortages or unreliable freelancers slow down your product roadmap. Partner with a dedicated Superhero Squad that treats your business goals as its own mission.
[Connect for Mission Launch **](https://outlook.office.com/bookwithme/user/231015685f21467da5ef6e3eb8b50240@systenics.com/meetingtype/hbYq2z1Hj0C2e7DuwBqdnw2?anonymous&ep=mcard)
## Related pages on Systenics
- [AuctionWorx development and customization](https://www.systenics.com/auctionworx/development-and-customization/)
- [About Systenics](https://www.systenics.com/about-us/)
## Need help implementing this for your business?
Our team helps plan, build, and scale marketplace and auction workflows. Explore [industry solutions](https://www.systenics.com/solutions/), [platform products](https://www.systenics.com/products/), and [custom development services](https://www.systenics.com/auctionworx/development-and-customization/) tailored to your goals.
[Book a quick consultation](https://outlook.office.com/bookwithme/user/231015685f21467da5ef6e3eb8b50240@systenics.com/meetingtype/hbYq2z1Hj0C2e7DuwBqdnw2?anonymous&ep=mcard).
---
## Page: Why Hire an Expert Tech Agency for Your Product Idea
URL: https://www.systenics.com/blogs/why-hire-an-expert-tech-agency-for-your-product-idea/
Description: Why Hire an Expert Tech Agency for Your Product Idea to get to market faster
# Why Hire an Expert Tech Agency for Your Product Idea
**by:** Saurabh Nandu **in:** [General](https://www.systenics.com/blogs/category/general/) **tags:**[*marketing*](https://www.systenics.com/blogs/tag/marketing/)
In today's fast-paced digital landscape, turning your innovative product idea into reality requires more than just a vision—it demands technical expertise, industry knowledge, and a team of skilled professionals. This is where hiring an expert tech agency can make all the difference. Whether you're a startup founder, an established business looking to innovate, or an entrepreneur with a groundbreaking concept, partnering with a specialized agency can be the key to bringing your product to life successfully. In this comprehensive guide, we'll explore the numerous benefits of collaborating with [Systenics](https://www.systenics.com/about-us/) and why it might be the best decision for your product's future.
## The Complexity of Modern Software Development
In recent years, the landscape of software development has become increasingly complex. From [mobile apps](https://www.systenics.com/auctionworx/mobile-apps/) to web platforms, enterprise solutions to IoT devices, the technical requirements for building successful products have grown exponentially. This complexity stems from several factors:
- **Diverse technology stacks**: Modern applications often require a mix of front-end, back-end, and database technologies.
- **Integration challenges**: Products need to seamlessly integrate with various third-party services and APIs.
- **Cross-platform compatibility**: Ensuring your product works across different devices and operating systems is crucial.
- **User experience expectations**: Today's users demand intuitive, responsive, and feature-rich interfaces.
- **Security concerns**: With cyber threats on the rise, robust security measures are non-negotiable.
Navigating this intricate landscape requires a deep understanding of various technologies and best practices. Systenics brings this knowledge to the table, ensuring that your product is built on a solid foundation from the start.
## Access to a Diverse Pool of Talent
One of the most significant advantages of hiring a tech agency like Systenics is gaining access to a diverse team of specialists. While building an in-house team can be time-consuming and expensive, Systenics provides immediate access to:
- **Full-stack developers**: Proficient in both front-end and back-end technologies.
- **UX/UI designers**: Experts in creating intuitive and visually appealing interfaces.
- **Project managers**: Skilled in coordinating complex projects and ensuring timely delivery.
- **Quality assurance specialists**: Dedicated to thorough testing and bug-free products.
- **DevOps engineers**: Specialists in streamlining development processes and ensuring smooth deployments.
- **Data scientists and AI experts**: For products requiring advanced analytics or machine learning capabilities.
This diverse skill set allows agencies to tackle multifaceted projects efficiently. Moreover, Systenics has experience across various industries, bringing valuable insights and best practices to your project.
## Cost-Effectiveness in the Long Run
While the initial cost of hiring an agency might seem higher than building an in-house team, it's often more cost-effective in the long run. Here's why:
- **No recruitment costs**: You avoid the expenses associated with hiring and onboarding new employees.
- **Reduced overhead**: You don't need to invest in office space, equipment, or software licenses for additional team members.
- **Flexible scaling**: You can easily scale the team up or down based on project needs without the complexities of hiring or layoffs.
- **Efficient resource allocation**: We can allocate resources optimally, ensuring you only pay for the skills you need when you need them.
- **Reduced training costs**: Our teams stay updated with the latest technologies, eliminating the need for ongoing training expenses.
By partnering with Systenics, you transform fixed costs into variable ones, allowing for better budget management and resource allocation.
## Faster Time-to-Market
In the competitive tech industry, speed to market can be a crucial factor in a product's success. Systenics is well-equipped to accelerate your development process:
- **Established workflows**: We have refined processes that allow for efficient development and quick iteration.
- **Ready-to-go infrastructure**: We have pre-configured development environments and tools, eliminating setup time.
- **Parallel development**: With larger teams, we can work on multiple components simultaneously.
- **Experience with rapid prototyping**: Systenics excels at creating MVPs (Minimum Viable Products) quickly to validate ideas.
- **Agile methodologies**: We employ agile practices, ensuring flexibility and faster delivery of working features.
This acceleration can give you a significant competitive advantage, allowing you to capture market share and start generating revenue sooner.
## Scalability and Flexibility
As your product grows and evolves, your technical needs will change. Systenics offers the scalability and flexibility to adapt to these changing requirements:
- **Easy team expansion**: We can quickly bring in additional experts as your project scope expands.
- **Technology pivots**: If you need to switch technologies or add new features, we have the diverse skill set to accommodate these changes.
- **Handling peak loads**: During intense development phases, we can allocate more resources to meet deadlines.
- **Long-term scalability planning**: Systenics builds products with future growth in mind, ensuring your architecture can handle increased user loads.
This flexibility allows you to respond rapidly to market feedback and evolving business needs without the constraints of a fixed in-house team.
## Focus on Your Core Business
Developing a technical product requires significant time and energy. By outsourcing this to Systenics, you and your team can focus on what you do best:
- **Business strategy**: Concentrate on refining your business model and go-to-market strategy.
- **Market research**: Dedicate more time to understanding your target audience and their needs.
- **Fundraising**: For startups, focus on securing investment without the distraction of technical challenges.
- **Customer relationships**: Build and nurture relationships with early adopters and key clients.
- **Product vision**: Spend more time on the overall product vision and roadmap.
This division of labor allows you to leverage your strengths while leaving the technical execution to experts, potentially leading to a more well-rounded and successful product launch.
## Reduced Risk and Increased Security
Building a software product comes with inherent risks, from technical failures to security vulnerabilities. Systenics can help mitigate these risks:
- **Best practices implementation**: We follow industry-standard security practices and coding standards.
- **Regular security audits**: We conduct routine security checks to identify and address vulnerabilities.
- **Compliance expertise**: For products in regulated industries, we have experience ensuring compliance with relevant standards (e.g., GDPR, HIPAA).
- **Disaster recovery planning**: We implement robust backup and recovery systems to protect your data.
- **Code quality assurance**: We have code review processes in place to maintain high-quality, secure code.
By leveraging our expertise, you significantly reduce the risk of costly security breaches or technical debt that could hamper your product's success.
## Staying Ahead with Cutting-Edge Technologies
The tech world evolves rapidly, with new tools, frameworks, and methodologies emerging constantly. Staying current can be challenging for in-house teams, but it's a core competency for Systenics:
- **Continuous learning**: Our teams are required to stay updated with the latest technologies as part of their job.
- **Diverse project experience**: Working on various projects exposes our teams to a wide range of technologies and approaches.
- **Innovation focus**: We have dedicated R&D teams exploring emerging technologies.
- **Industry connections**: We have partnerships with technology providers, giving them early access to new tools and platforms.
This commitment to staying current ensures that your product is built using the most appropriate and efficient technologies available.
## Quality Assurance and Testing
Quality is paramount in software development. A buggy or unreliable product can quickly lose users and damage your reputation. Systenics prioritizes quality assurance:
- **Dedicated QA teams**: We have specialized quality assurance professionals.
- **Comprehensive testing strategies**: From unit tests to end-to-end testing, we implement thorough testing processes.
- **Automated testing**: We use automated testing tools to catch issues early and ensure consistent quality.
- **User acceptance testing**: We help organize and conduct UAT to gather valuable user feedback.
- **Performance testing**: Ensuring your product can handle expected user loads is a standard part of our workflows.
This focus on quality results in a more stable, reliable product that's ready to face the demands of real-world usage.
## Post-Launch Support and Maintenance
Launching your product is just the beginning. Ongoing support and maintenance are crucial for long-term success. Systenics offers valuable post-launch services:
- **Bug fixes and updates**: Quickly address issues that arise after launch.
- **Feature enhancements**: Continuously improve your product based on user feedback and market demands.
- **Performance optimization**: Monitor and optimize your product's performance as it scales.
- **Security updates**: Keep your product protected against evolving security threats.
- **24/7 support**: We offer round-the-clock support to handle critical issues.
This ongoing support ensures that your product remains competitive and continues to meet user needs long after its initial release.
## Building a Long-Term Technology Partner
When you hire Systenics, you're not just getting a one-time service provider; you're potentially gaining a long-term technology partner:
- **Strategic technology consulting**: We provide ongoing advice on technology trends and opportunities.
- **Seamless knowledge transfer**: As your product evolves, we efficiently onboard new team members or transfer knowledge to your in-house team.
- **Consistent support**: Having a long-term partner ensures consistent support and understanding of your product's history and vision.
- **Aligned incentives**: We are motivated to deliver high-quality work to secure long-term partnerships.
This long-term relationship can be invaluable as you navigate the challenges of growing and evolving your product in a competitive market.
## Conclusion: Empowering Your Vision with Expert Support
In the complex world of software development, turning a product idea into a successful reality requires more than just ambition—it demands technical expertise, industry knowledge, and a dedicated team of professionals. Hiring Systenics provides you with all these elements, along with the flexibility, scalability, and cost-effectiveness that can be crucial for your product's success.
From accelerating your time-to-market and ensuring top-notch quality to providing ongoing support and staying ahead of technological trends, Systenics can be the catalyst that transforms your vision into a market-leading product. By choosing to partner with experts, you're not just building a product; you're investing in a foundation for long-term success and growth.
As you embark on your product development journey, consider the immense value that Systenics can bring to your project. With the right partner by your side, you'll be well-equipped to navigate the challenges of the tech industry and bring your innovative ideas to life. Your next big success story could be just one partnership away.
[Connect with us](#) today to embark on a new partnership with Systenics.
## Related pages on Systenics
- [AuctionWorx products](https://www.systenics.com/products/)
- [About Systenics](https://www.systenics.com/about-us/)
## Need help implementing this for your business?
Our team helps plan, build, and scale marketplace and auction workflows. Explore [industry solutions](https://www.systenics.com/solutions/), [platform products](https://www.systenics.com/products/), and [custom development services](https://www.systenics.com/auctionworx/development-and-customization/) tailored to your goals.
[Book a quick consultation](https://outlook.office.com/bookwithme/user/231015685f21467da5ef6e3eb8b50240@systenics.com/meetingtype/hbYq2z1Hj0C2e7DuwBqdnw2?anonymous&ep=mcard).
---
## Page: Unleashing Growth: Why Your Auction Business Needs a Mobile App
URL: https://www.systenics.com/blogs/why-an-auctionworx-mobile-app-is-essential-for-growth/
Description: Discover the real-world benefits of purchasing the AuctionWorx Mobile App, backed by data showing skyrocketing user engagement, strong conversion rates, and expanded global reach.
# Unleashing Growth: Why Your Auction Business Needs a Mobile App
**by:** Saurabh Nandu **in:** [General](https://www.systenics.com/blogs/category/general/) **tags:**[*AuctionWorx*](https://www.systenics.com/blogs/tag/auctionworx/), [*Mobile App*](https://www.systenics.com/blogs/tag/mobile-app/), [*Analytics*](https://www.systenics.com/blogs/tag/analytics/)
The shift toward mobile commerce is undeniable, and the auction industry is no exception. Today’s buyers expect seamless, on-the-go access to their favorite auctions. At Systenics Solutions, our Superhero Squad has developed the [AuctionWorx Mobile App](https://www.systenics.com/auctionworx/mobile-apps/) to provide exactly that.
But how does a mobile app actually impact your bottom line? Let's take a look at aggregated, anonymized trends and real-world metrics from our client missions to see why launching the [AuctionWorx](https://www.systenics.com/auctionworx/) Mobile App is a highly beneficial step for your auction business.
## Trend 1: Skyrocketing User Engagement
A [mobile app](https://www.systenics.com/auctionworx/mobile-apps/) creates a dedicated space for your auctions on a user's most personal device. This direct access translates to significantly higher engagement compared to traditional web browsing.
In recent data analysis across our client base, we've observed exceptional engagement. While mid-sized regional platforms see a robust average engagement time of **23 to 32 minutes** per active user with **5 to 8 engaged sessions** over a 30-day period, highly active platforms experience skyrocketing engagement.
For instance, users of a prominent machinery and farm equipment auction platform and a high-volume consumer goods marketplace average **1 hour 22 minutes** and **1 hour 28 minutes** of active engagement respectively, with **12 to 16 engaged sessions** per user. At the top end, active users of an enterprise-scale consumer liquidation marketplace spend an astounding **2 hours and 2 minutes** of monthly engagement across **20 distinct engaged sessions**. This means users aren't just downloading the app and forgetting it; they are actively returning to browse lots, monitor [live auctions](https://www.systenics.com/auctionworx/live-auctions/), and place bids repeatedly. High engagement directly correlates to more competitive bidding and higher final sale prices.
## Trend 2: Exceptional App Store Conversion Rates
Launching a mobile app opens up new acquisition channels through the Apple App Store and Google Play Store. It also serves as a powerful retention tool.
While standard e-commerce websites struggle with typical conversion rates of 1% to 3%, our clients' iOS App Store listings show incredibly high conversion rates. Analytics show strong performance: regional liquidators and consumer marketplace apps enjoy conversion rates in the **11% to 14% range**, while an automotive salvage specialist sits at **13.3%**. High-performing platforms fly past this: a specialized exotic auction platform achieves a **20.2%** conversion rate, a prominent machinery and farm equipment auction app reaches **32.4%**, and an enterprise-scale liquidation app boasts a massive **44.2%** conversion rate (converting 28.5K first-time downloads from 125K impressions). This confirms that a dedicated app store presence is highly effective at turning views into active bidders.
## Trend 3: Broad Global Reach and High-Value Demographics
A mobile app removes geographical barriers and caters to users across a wide spectrum of devices.
Active mobile users span multiple countries, from North America to Europe, Australia, and Asia. Furthermore, device demographics show a heavy concentration of users on flagship, premium devices. In our data, while standard models like the iPhone 13 or iPhone 15 are widely represented, we see thousands of active users on premium **Pro and Pro Max devices (such as the iPhone 15 Pro and iPhone 14 Pro Max)**.
For instance, on a machinery and farm equipment auction platform, the iPhone 15 Pro Max, iPhone 15 Pro, and iPhone 14 Pro Max are the most active device cohorts. For an enterprise-scale consumer liquidation marketplace, premium Pro/Pro Max devices (such as 6.3K iPhone 15 Pro Max users, 3.9K iPhone 14 Pro Max users, and 2.9K iPhone 15 Pro users) combine to represent a massive portion of the active audience. This indicates that your most active bidders are tech-savvy users willing to invest in premium devices—a highly lucrative, high-intent demographic for high-value auctions.
Additionally, Android audience data from the Google Play Console confirms a robust, parallel market. Across our client base, Android applications have secured significant installed bases—ranging from hundreds of active installs for niche auction portals to over **29,000 active installs** for large enterprise-level marketplaces. Having a native app on both iOS and Android ensures that you do not leave half of the mobile audience on the table.
## Trend 4: Website vs. Mobile App Loyalty
While a responsive website is essential for initial discovery and capturing organic search traffic, the mobile app is where true brand loyalty is forged. Our cross-platform analysis reveals a compelling trend: although the website often sees a higher volume of casual, first-time visitors, the mobile app captures a highly concentrated segment of **power users**.
Cross-referencing mobile active user data with registered web databases reveals that between **12% to nearly 30% of all registered users** are active monthly app users. In platforms like a major consumer liquidation marketplace (96K active mobile users out of 339.8K registered users, approx. **28.2%**) and a specialized regional auction portal (626 active mobile users out of 2,132 registered users, approx. **29.3%**), almost a third of the entire registered customer base relies directly on the mobile app. These mobile users are the ones setting push notifications and participating in the final, crucial minutes of an auction.
## Trend 5: Bulletproof Scalability and 100% Stability
One of the biggest concerns for auctioneers is whether their platform can handle the surge of traffic during the closing moments of a high-stakes auction. The AuctionWorx Mobile App is built to ensure 100% mission launch success.
During peak auction closing events across our client base, the mobile app infrastructure routinely supports thousands of **concurrent live users** per minute seamlessly. For instance, an enterprise-scale consumer liquidation app's active real-time load consistently scales up to **2,914 active users** in the last 30 minutes, handling massive concurrent updates and bid placements without a hitch.
Furthermore, this high-performance handling is backed by stellar app reliability. Across all of our client analytics dashboards, the App Stability metric consistently showcases a flawless **100% Crash-Free Users** status. This guarantees that your bidders won't experience app crashes or connection losses at the critical last seconds of an auction.
## Trend 6: Driving Real Bidding Competition
Ultimately, user engagement and downloads matter most when they translate to bidding activity. The presence of a mobile app helps keep bidders connected to live auctions, resulting in an exceptionally high percentage of active lots receiving bids.
In our client dashboard reviews, we have observed a remarkable trend in listing activity. For a mid-sized machinery auction, out of 1,464 active lots, an incredible **1,387 active lots had active bids or purchases (approx. 94.7%)**. For larger enterprise-scale liquidators, even with massive inventory volumes (e.g., over 34,900 active lots), more than **18,500 lots received active bids or purchases**.
By putting auctions in the palm of the buyer's hand and sending timely push notifications when outbid, the mobile app ensures that inventory doesn't go unnoticed, especially during high-velocity [live auction events](https://www.systenics.com/auctionworx/live-auctions/). It drives competitive, multi-bid scenarios that maximize final hammer prices.
## The Systenics Advantage
The [AuctionWorx Mobile App](https://www.systenics.com/auctionworx/mobile-apps/) is not just a simplified website; it’s a fully native experience designed to offer lightning-fast load times, push notifications for outbids or ending auctions, and a secure, intuitive bidding interface. These features are purpose-built to keep your audience engaged and bidding.
## Ready to Accelerate Your Growth?
The data speaks for itself. Investing in a mobile app for your AuctionWorx platform is a proven strategy to increase user engagement, expand your reach, and ultimately drive higher revenue.
Let our Superhero Squad help you launch your next successful mission. [Connect for mission launch](https://outlook.office.com/bookwithme/user/231015685f21467da5ef6e3eb8b50240@systenics.com/meetingtype/hbYq2z1Hj0C2e7DuwBqdnw2?anonymous&ep=mcard) today to learn more about our Mobile App solutions and how we can tailor them to fit your specific auction business needs.
## Related pages on Systenics
- [AuctionWorx platform overview](https://www.systenics.com/auctionworx/)
- [AuctionWorx mobile apps](https://www.systenics.com/auctionworx/mobile-apps/)
- [Community activity feed](https://www.systenics.com/auctionworx/community-activity-feed/)
## Need help implementing this for your business?
Our team helps plan, build, and scale marketplace and auction workflows. Explore [industry solutions](https://www.systenics.com/solutions/), [platform products](https://www.systenics.com/products/), and [custom development services](https://www.systenics.com/auctionworx/development-and-customization/) tailored to your goals.
[Book a quick consultation](https://outlook.office.com/bookwithme/user/231015685f21467da5ef6e3eb8b50240@systenics.com/meetingtype/hbYq2z1Hj0C2e7DuwBqdnw2?anonymous&ep=mcard).
---
## Page: Use Lucene.Net in for faster data search
URL: https://www.systenics.com/blogs/use-lucenenet-in-for-faster-data-search/
Description: This tutorial explains how to use Lucene.Net to achieve faster search responses in ASP.NET or MVC or C# applications. You can use Lucene.Net library to create indexes and search to retrieve the data which can be sorted by relevance or by a sort field.
# Use Lucene.Net in for faster data search
**by:** Dhanashri Karale **in:** [Programming](https://www.systenics.com/blogs/category/programming/) **tags:**[*C#*](https://www.systenics.com/blogs/tag/c-sharp/)
## Introduction
This tutorial explains how to use Lucene.Net to achieve faster search responses in ASP.NET or MVC or C# applications.
## Why Lucene.Net?
All business or consumer applications require data search and it can be implemented using SQL LIKE clause or SQL Full-Text Search. But we found that it is much faster to search data when we use Lucene.Net library.
Lucene is a full-text search library which uses inverted index for search due to which it is able to achieve fast search responses. You can use Lucene.Net library to create indexes and search to retrieve the data which can be sorted by relevance or by a sort field.
*“Lucene.Net is a port of the Lucene search engine library, written in C# and targeted at .NET runtime users. The Lucene search library is based on an inverted index.”*
Read more about Lucene.Net from [Apache Lucene.Net](https://lucenenet.apache.org/) or [Lucene.Net GitHub](https://github.com/apache/lucenenet).
Let’s start with the coding :)
## Setup C# Lucene Project
Before you start writing your first example using Lucene.Net library, you have to make sure that you have setup your Lucene environment properly.
Let’s start by creating a new project with name - “LuceneConsoleApplication”. Open VS and New Project -> Visual C# -> Windows -> Console Application.
Add "[Lucene.Net](https://www.nuget.org/packages/Lucene.Net/)" references using NuGet Package Manager in your project.
Add below key in App.config file. This is the path where we will store the Lucene indexes. It will create "LuceneIndexes" in bin directory. We can even pull the data from SQL Server database and create Lucence indexes. In this tutorial and sample given below, we have created a list using C# code.
```
```
In code given below, the StartLuceneIndexCreateProcess() method will create Lucene indexes.
```
class Program
{
static void Main(string[] args)
{
try
{
LuceneIndexer startIndexer = new LuceneIndexer();
Console.WriteLine("Starting Lucene index creation process for search...\r\n");
Console.WriteLine("Lucene index has been created from the following list:");
// This method will create Lucene indexes according to your given list items.
startIndexer.CreateLuceneIndexes();
Console.WriteLine("");
// You can check CFX and CFS file in folder "..\LuceneConsoleApplication\App_Data".
// Open the file in Notepad or any other text editor and you can see list of items.
Console.WriteLine("Lucene Index creation successful!\r\n");
GetSearchLucene getSearchLucene = new GetSearchLucene();
Console.WriteLine("Enter a name to search:");
// Get input string from user
string inputParam = Console.ReadLine();
List result = getSearchLucene.GetSearchLuceneText(inputParam);
Console.WriteLine("");
Console.WriteLine("You searched for:");
if (result.Count > 0)
{
foreach (var item in result)
{
Console.WriteLine(item.Actor);
}
}
else
{
Console.WriteLine("Sorry! No matching records found.");
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
}
```
File #1 - Program.cs – Main() method
### Create Indexes for Search
Now, let’s add list of items to CreateDocument() method.
Directory represents the storage location of the indexes. Write your desired directory path in the App.config file. Here we will create our index of our list items. User given input will searched with "Actor" key field.
```
private void StartLuceneIndexCreateProcess()
{
string luceneIndexStoragePath = @ConfigurationManager.AppSettings["LuceneIndexStoragePath"];
bool folderExists = System.IO.Directory.Exists(luceneIndexStoragePath);
if (!folderExists)
System.IO.Directory.CreateDirectory(luceneIndexStoragePath);
analyzer = new Lucene.Net.Analysis.Standard.StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30);
Lucene.Net.Store.Directory directory = Lucene.Net.Store.FSDirectory.Open(new System.IO.DirectoryInfo(luceneIndexStoragePath));
writer = new Lucene.Net.Index.IndexWriter(directory, analyzer, true, Lucene.Net.Index.IndexWriter.MaxFieldLength.LIMITED);
try
{
// We will populate below list to create Lucene index.
List actorsList = new List();
actorsList.Add("Johnny Depp");
actorsList.Add("Robert Downey Jr.");
actorsList.Add("Johnny Depp");
actorsList.Add("Tom Cruise");
actorsList.Add("Brad Pitt");
actorsList.Add("Tom Hanks");
actorsList.Add("Denzel Washington");
actorsList.Add("Russell Crowe");
actorsList.Add("Kate Winslet");
actorsList.Add("Christian Bale");
actorsList.Add("Hugh Jackman");
actorsList.Add("Will Smith");
actorsList.Add("Sean Connery");
foreach (var item in actorsList)
{
Console.WriteLine(item);
writer.AddDocument(CreateDocument(item.ToString()));
}
}
catch
{
Lucene.Net.Index.IndexWriter.Unlock(directory);
throw;
}
finally
{
writer.Optimize();
analyzer.Close();
writer.Dispose();
analyzer.Dispose();
}
}
private Lucene.Net.Documents.Document CreateDocument(string actorName)
{
try
{
Lucene.Net.Documents.Document doc = new Lucene.Net.Documents.Document();
doc.Add(new Lucene.Net.Documents.Field("actors", actorName, Lucene.Net.Documents.Field.Store.YES, Lucene.Net.Documents.Field.Index.ANALYZED));
return doc;
}
catch
{
throw;
}
}
```
File #2 – LuceneIndexer.cs - Contains code to create Lucene indexes
### Search
Provided input will pass to GetSearchLuceneText() method. GetLuceneIndexPath() method will get the path of stored Lucene index i.e "bin\Debug\LuceneIndexes" folder. Input given by user will search in "LuceneIndexes" folder using Search() method.
```
public class GetSearchLucene
{
public List GetSearchLuceneText(string actorName)
{
LuceneSearcher searchIndex = new LuceneSearcher(GetLuceneIndexPath().FullName);
List results = new List();
if (actorName != string.Empty)
{
results = searchIndex.Search(actorName, "actors").ToList();
}
return results;
}
// Get directory path for Lucene index creation
public DirectoryInfo GetLuceneIndexPath()
{
return new DirectoryInfo(ConfigurationManager.AppSettings["LuceneIndexStoragePath"]);
}
}
```
File #3 - GetSearchLucene.cs - Contains code to invoke search on Lucene indexes
### Search method
IndexSearcher class acts as a core component which searcher indexes created during indexing process. Lucene directory will point to location where indexes are to be stored. Initialize the QueryParser object created with a standard analyzer having version information and index name on which this query is to run.
```
public List Search(string searchText, string searchField)
{
List output = new List();
string searchQuery = string.Empty;
try
{
if (string.IsNullOrEmpty(searchText.Trim()))
{
throw new Exception("You forgot to enter something to search for...");
}
searchQuery = searchText;
}
catch
{
throw;
}
try
{
// Open the IndexReader with readOnly=true.
// This makes a big difference when multiple threads are sharing the same reader,
// as it removes certain sources of thread contention.
searcher = new Lucene.Net.Search.IndexSearcher(_directory, true);
analyzer = new Lucene.Net.Analysis.Standard.StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30);
output = (GetSearchResultByField(searchQuery, searchField, searcher, analyzer));
}
catch
{
throw;
}
finally
{
analyzer.Close();
analyzer.Dispose();
searcher.Dispose();
}
return output;
}
```
File #4.1 – LuceneSearcher.cs - Contain code to search on Lucene indexes
### Mapping With Lucene
User given input will be mapped with search field and user input search will be fetched from document object.
```
private Lucene.Net.Search.Query ParseQuery(string searchQuery, Lucene.Net.QueryParsers.QueryParser parser)
{
Lucene.Net.Search.Query query;
try
{
query = parser.Parse(searchQuery.ToLower().Trim() + "*");
}
catch (Lucene.Net.QueryParsers.ParseException)
{
query = parser.Parse(Lucene.Net.QueryParsers.QueryParser.Escape(searchQuery.Trim()));
throw;
}
return query;
}
private IEnumerable MapLuceneDataToIDList(IEnumerable hits, Lucene.Net.Search.IndexSearcher searcher)
{
return hits.Select(hit => MapLuceneData(searcher.Doc(hit.Doc))).ToList();
}
// Mapping Lucene data
private LuceneData MapLuceneData(Lucene.Net.Documents.Document doc)
{
return new LuceneData
{
Actor = (doc.Get("actors"))
};
}
```
File #4.2 – LuceneSearcher.cs - Contains code to prase and map Lucene search data
You can [download our sample](https://github.com/systenics/LuceneConsoleApplication) LuceneConsoleApplication project from GitHub.
Happy Coding :)
## Related pages on Systenics
- [AI-powered listing description generation](https://www.systenics.com/auctionworx/ai-enhanced-listings-description-generation/)
## Need help implementing this for your business?
Our team helps plan, build, and scale marketplace and auction workflows. Explore [industry solutions](https://www.systenics.com/solutions/), [platform products](https://www.systenics.com/products/), and [custom development services](https://www.systenics.com/auctionworx/development-and-customization/) tailored to your goals.
[Book a quick consultation](https://outlook.office.com/bookwithme/user/231015685f21467da5ef6e3eb8b50240@systenics.com/meetingtype/hbYq2z1Hj0C2e7DuwBqdnw2?anonymous&ep=mcard).
---
## Page: Use Lets Encrypt SSL with AuctionWorx
URL: https://www.systenics.com/blogs/use-lets-encrypt-ssl-with-auctionworx/
Description: While developing ASP.NET or ASP.NET MVC Web or WebAPI applications, we use IIS self-signed certificate to test sites locally or on test servers with HTTPS enabled. Such HTTPS websites throw a warning message when they are accessed first time from any browser. If you are using WebAPI with HTTPS and trying to access those APIs from Ionic or iOS mobile applications, then it will not work. This article focuses on configuration of Let’s Encrypt SSL Certificate with AuctionWorx web application.
# Use Lets Encrypt SSL with AuctionWorx
**by:** Shailesh Patel **in:** [General](https://www.systenics.com/blogs/category/general/) **tags:**[*AuctionWorx*](https://www.systenics.com/blogs/tag/auctionworx/)
## Introduction
While developing ASP.NET or ASP.NET MVC Web or WebAPI applications, we use IIS self-signed certificate to test sites locally or on test servers with HTTPS enabled. Such HTTPS websites throw a warning message when they are accessed first time from any browser. If you are using WebAPI with HTTPS and trying to access those APIs from Ionic or iOS mobile applications, then it will not work. This article focuses on configuration of Let’s Encrypt SSL Certificate with AuctionWorx web application running on the[AuctionWorx platform](https://www.systenics.com/auctionworx/).
If you need help implementing security, infrastructure, or custom workflows on top of the platform, see our[AuctionWorx development and customization services](https://www.systenics.com/auctionworx/development-and-customization/).
## What is Let's Encrypt?
Let's Encrypt is a free, automated, and open Certificate Authority.
*"To enable HTTPS on your website, you need to get a certificate (a type of file) from a Certificate Authority (CA). Let’s Encrypt is a CA. In order to get a certificate for your website’s domain from Let’s Encrypt, you have to demonstrate control over the domain. With Let’s Encrypt, you do this using software that uses the ACME protocol, which typically runs on your web host."*
Read more about Let’s Encrypt from their[FAQ](https://letsencrypt.org/docs/faq/) or[Get Started](https://letsencrypt.org/getting-started/) or[How It Works](https://letsencrypt.org/how-it-works/) links.
## Let's Encrypt
1. Download[letsencrypt-win-simple](https://github.com/Lone-Coder/letsencrypt-win-simple/releases) from GitHub and extract it on your server.
2. Run “letsencrypt.exe” and follow instructions or enter following command:
```
letsencrypt.exe --accepttos --manualhost your_website.com
--webroot C:\inetpub\wwwroot\your_website_folder
```
It will add a new certificate under IIS > Server Certificates.
Figure 1: IIS > Server Certificates
Copy files into root of your website under following folder ...your_website_folder\.well-known\acme-challenge
3. Now add following NuGet packages into RainWorx.FrameWorx.MVC project.
```
```
4. Add following line into Startup.cs file.
```
using Microsoft.Owin.FileSystems;
public class Startup
{
public void Configuration(IAppBuilder app)
{
app.Map("/.well-known", letsEncrypt =>
{
letsEncrypt.Use((context, next) =>
{
IFileInfo file;
var fileSystem = new PhysicalFileSystem(@".\.well-known");
if (!fileSystem.TryGetFileInfo(context.Request.Path.Value, out file))
{
return next();
}
return context.Response.SendFileAsync(file.PhysicalPath);
});
});
GlobalHost.DependencyResolver.UseSqlServer(ConfigurationManager.ConnectionStrings["db_connection"].ConnectionString);
app.MapSignalR();
}
}
```
5. After adding above code publish a new build and access https://your_website.com and it will show a valid certificate.
## Related pages on Systenics
- [AuctionWorx platform overview](https://www.systenics.com/auctionworx/)
- [AuctionWorx mobile apps](https://www.systenics.com/auctionworx/mobile-apps/)
- [AuctionWorx development and customization](https://www.systenics.com/auctionworx/development-and-customization/)
## Need help implementing this for your business?
Our team helps plan, build, and scale marketplace and auction workflows. Explore [industry solutions](https://www.systenics.com/solutions/), [platform products](https://www.systenics.com/products/), and [custom development services](https://www.systenics.com/auctionworx/development-and-customization/) tailored to your goals.
[Book a quick consultation](https://outlook.office.com/bookwithme/user/231015685f21467da5ef6e3eb8b50240@systenics.com/meetingtype/hbYq2z1Hj0C2e7DuwBqdnw2?anonymous&ep=mcard).
---
## Page: Use jQuery Lazy Load with Knockout binding
URL: https://www.systenics.com/blogs/use-jquery-lazy-load-with-knockout-binding/
Description: This tutorial explains how to use jQuery lazy loading technique with Knockout binding.
# Use jQuery Lazy Load with Knockout binding
**by:** Ruchita Kansara **in:** [Programming](https://www.systenics.com/blogs/category/programming/) **tags:**[*C#*](https://www.systenics.com/blogs/tag/c-sharp/), [*ASP.NET MVC*](https://www.systenics.com/blogs/tag/aspnet-mvc/)
Recently I came across a requirement to use jQuery Lazy Load with Knockout binding. In this article, I will explain the steps for binding lazy loaded content to Knockout template.
## Let's Start
1. Create an ASP.NET Web Project > MVC 4 Framework.
2. Create a new ContentController.cs file under Controller folder. Write new Action method.
```
public ActionResult LoadContent()
{
return View();
}
```
3. Create a new View for above Action method. It will create LoadContent.cshtml file under Views > Content folder.
4. Install Knockout.js using NuGet and include it into your page along with jQuery.
```
```
5. Write the following HTML code with Knockout bindings to display your result.
```
Loading...
```
Here I have created a "div" tag which has vertical scrollbar and inside that div, I have an un-ordered list which binds each element of numbersList i.e. Knockout Observable Array to list item.
Now, binds number (Knockout Observable) to list.
6. After creating HTML code, write script to bind the data.
```
var arr = new Array();
function KnockoutViewModel(no)
{
var self = this;
self.number = ko.observable(no);
}
function ModelBinding()
{
var self = this;
self.numbersList = ko.observableArray([]);
}
var bind = new ModelBinding();
ko.applyBindings(bind);
for (var i = 1; i <= 10; i++)
{
var obj = new KnockoutViewModel(i);
arr.push(obj);
}
bind.numbersList(arr);
```
This script will bind numbers 1-10 to the list.
7. Create an Action method to fetch next set of data on scroll down event.
```
public JsonResult LazyLoadContent(int page = 11)
{
int[] numbers = new int[10];
for (int i = 0; i < 10; i++)
{
numbers[i] = page;
page = page + 1;
TempData["LastPage"] = page;
}
return Json(numbers, JsonRequestBehavior.AllowGet);
}
```
This method returns next 10 numbers in JSON format. This method gets invoked whenever the scroll down event occurs.
8. Add this additional code to your script which will help bind data on scroll event.
```
$("#page").scroll(function () {
if ($(this)[0].scrollHeight - $(this).scrollTop() == $(this).outerHeight()) {
call();
$('#symbol').empty();
}
});
var page = 1;
function call()
{
$.ajax({
url: '@Url.Action("LazyLoadContent","Content")',
data: { page: page + 10 },
success: function (data) {
for (var i = 0; i < data.length; i++)
{
var obj = new KnockoutViewModel(data[i]);
arr.push(obj);
}
bind.numbersList(arr);
page = page + 10;
},
error: function () { alert('error'); }
});
}
```
The above code snippet will check scroll bar position and if it is at the bottom of the "div" tag then it makes an AJAX call to the action in the Controller. It will fetch the next set of data as result, bind it and display the results on screen.
9. Output
## Download Sample
Click here to download the sample application.
## Related pages on Systenics
- [AI-powered listing description generation](https://www.systenics.com/auctionworx/ai-enhanced-listings-description-generation/)
## Need help implementing this for your business?
Our team helps plan, build, and scale marketplace and auction workflows. Explore [industry solutions](https://www.systenics.com/solutions/), [platform products](https://www.systenics.com/products/), and [custom development services](https://www.systenics.com/auctionworx/development-and-customization/) tailored to your goals.
[Book a quick consultation](https://outlook.office.com/bookwithme/user/231015685f21467da5ef6e3eb8b50240@systenics.com/meetingtype/hbYq2z1Hj0C2e7DuwBqdnw2?anonymous&ep=mcard).
---
## Page: Understanding Visual Studio 2015 ASP.NET Web Project Changes
URL: https://www.systenics.com/blogs/understanding-visual-studio-2015-aspnet-web-project-changes/
Description: Microsoft has recently released Visual Studio 2015 Preview for evaluation. Along with Visual Studio Microsoft has announced that it will open source complete ASP.NET stack and make it hostable on Linux as well as Mac. Microsoft has changed their web project significantly to make it work across open source platforms. Visual Studio 2015 preview brings a lot of enhancements in the editor as well as one of the significant components that ship with it is ASP.NET v5 and total change in project structure of web applications. In an effort to embrace open source they have made a lot of changes to to the project templates to utilize a whole bag of popular open source technologies like NPM, Grunt and Bower. Enabling the use of popular open source package managers saves Microsoft from duplicating and maintaining the rapid speed of changes and new developments that are happening on the web. For example instead of building their open Less to CSS compiler and keeping it updated, now they enable developers to use popular open source versions of the same.
# Understanding Visual Studio 2015 ASP.NET Web Project Changes
**by:** Saurabh Nandu **in:** [Programming](https://www.systenics.com/blogs/category/programming/) **tags:**[*ASP.NET MVC*](https://www.systenics.com/blogs/tag/aspnet-mvc/), [*Visual Studio*](https://www.systenics.com/blogs/tag/visual-studio/)
## Overview
Microsoft has recently released [Visual Studio 2015 Preview](http://www.visualstudio.com/downloads/visual-studio-2015-downloads-vs) for evaluation. Along with Visual Studio Microsoft has announced that it will open source complete ASP.NET stack and make it hostable on Linux as well as Mac. Microsoft has changed their web project significantly to make it work across open source platforms. Visual Studio 2015 preview brings a lot of enhancements in the editor as well as one of the significant components that ship with it is ASP.NET v5 and total change in project structure of web applications. In an effort to embrace open source they have made a lot of changes to to the project templates to utilize a whole bag of popular open source technologies like NPM, Grunt and Bower. Enabling the use of popular open source package managers saves Microsoft from duplicating and maintaining the rapid speed of changes and new developments that are happening on the web. For example instead of building their open Less to CSS compiler and keeping it updated, now they enable developers to use popular open source versions of the same.
This blog post tries to get a better understanding of the new components of the ASP.NET 5 web application project as well as get an understanding of the changes that have been made from ASP.NET MVC5 Project template in Visual Studio 2013. I have tried to skim fragmented information available across several blogs and websites to try and get a better understanding of the different components.
## ASP.NET 5 vs. ASP.NET MVC 6
One of the major confusion that I had when announcements were made for Visual Studio 2015 preview was the difference between ASP.NET 5 and ASP.NET MVC 6. We already had ASP.NET MVC 5 support in Visual Studio 2013, so naming of the new web stack ASP.NET 5 is bound to create confusion. If you head over to the [ASP.NET VNext website](https://www.asp.net/vnext/overview/aspnet-vnext/aspnet-5-overview) Microsoft explains, “ASP.NET 5 is a lean .NET stack for building modern web apps. We built it from the ground up to provide an optimized development framework for apps that are either deployed to the cloud or run on-premises. It consists of modular components with minimal overhead, so you retain flexibility while constructing your solutions.”. In the same article a bit further down they explain, “In ASP.NET 5, MVC, Web API, and Web Pages will be merged into a single framework called MVC 6. This merging removes duplication from the framework and makes it easier for you to develop apps that use these programming frameworks. You no longer need to write slightly different code depending on whether you are within an MVC, Web API, or Web Pages context.”. So essentially MVC 6 is the framework on top of ASP.NET 5 stack which supports building MVC, Web API and Web Pages based applications. The older Web Forms applications are also supported and the Web Forms framework version is now 4.6. I do not remember earlier there be a name for the stack, but it seems now the are naming the stack of technologies as ASP.NET 5 as well as the frameworks separately it really is going to cause confusion for some time.
## Creating ASP.NET 5 Web Application Project
Fire up Visual Studio 2015 Preview and click **File** menu –>**Add new Project** to bring up the **New Project** Dialog. Select the **ASP.NET Web Application** template under**Visual C# –> Web** as shown in figure 1 below.
Figure 1: New Project dialog
Enter the location to create the project as well as the name of the project and solution and click **OK**. I have kept default names since the purpose for us is to determine the contents of the project items rather than its naming in the blog. The next dialog brings up the selection of the type of ASP.NET project you want to create this is similar to the dialog introduced in Visual Studio 2013. If you select**MVC** or **Web API** then it will create a project in older Visual Studio 2013 compatible project format. Our goal in this blog is to explore the new ASP.NET 5 project template, so select the**ASP.NET 5 Starter Web** template and click **OK **to create the project. You will see that unlike older **MVC** or**Web API** projects where you had a selection of **Add folders and core references for** to select support for Web Forms, MVC or Web API needed in your project, this option is grayed out since ASP.NET 5 unifies all these into a single project.
Figure 2: New ASP.NET Project dialog
## Understanding the different parts of ASP.NET 5 Project
Once the new ASP.NET 5 Web application project is created lets look at the Solution Explorer window to get a better idea of the different components of the new project template.
Figure 3: Solution Explorer
As you can see from figure 3 above there are a lot of new items in the project structure which did not exist before, lot of familiar items like web.cofig, global.asax etc. are totally missing. Let’s try to go step by step and try to understand the different parts of this project template.
### Global.json – Solution Item
Starting from the top of the list we see that under the solution there is a project called as **Solution Items** which contains a single file called **global.json**. If you open the file file it has the code as shown in listing 1 below.
```
{
"sources": [ "src", "test" ]
}
```
Listing 1: global.json file
Something obvious that jumps out is that Microsoft is now trying to shift all configuration information into json file formats so that its easier for other tools to work along with ASP.NET on different platforms. The global.json file is used to mange project to project dependencies. Its useful when there are multiple projects in your solution file then visual studio uses this file to determine dependencies amongst the different projects within the solution. By default, project-to-project references lookup will use parent directory, plus the global.json-defined directories. In code listing 1 above two locations for **sources** property are defined as **src** and **test**. The recommendation is to keep all the source code projects under the src folder and test related projects under the test folder for easier separation which did not exist before. Using the global.json file you can easily reference projects which are not contained within the same solution folder.
As you can see that src folder has been defined as a folder for keeping sources, various projects that you add will be added under the src folder on the physical disk. If you refer back to Figure 3 you will see that our project file WebApplication1 is also contained within the parent src folder.
### wwwroot folder
The next item under the Project folder is the **wwwroot** folder. The **wwwroot** folder is new in ASP.NET 5 to store all of the static files in your project. Any files including HTML files, CSS files, image files, and JavaScript files which are sent to the users browser should be stored inside this folder. Code files should be placed outside of **wwwroot** including C# files and Razor views. Having a **wwwroot** folder keeps a clean separation between code files and static files, it brings clarity to the items that will be sent to the server and the items that should remain on the dev machine. If you look at figure 3 above**wwwroot** folder has **css** and **lib** sub folders. **Css** folder is a place to keep your custom css files, while **lib** folder is used by **Bower** package manger (more on it later). The lib folder contains the packages downloaded by **Bower** and can contain css,js and images. Figure 3 above shows that **lib** folder has a **bootstrap** package folder, if you expand it you will find css, js as well all other assets related to the boostrap package. In MVC4 we used the content folder to keep style sheets as well as scripts folder for referenced scripts, these folders are gone now. So its important to understand that there is no single folder for style sheets or scripts. the could be in any of the folders within**wwwroot**. Its interesting to note that if you wish to reference the css,js or img files in your razor views, using the **~** keyword ensures direct path to the **wwwroot** folder. So support you wanted to reference **site.css** in your view you can access it using the syntax. You can see that the **~** keyword points to the **wwwroot** folder.
### Dependencies
The next item you see in the Solution Explorer is Dependencies. This is a new item added in Visual Studio 2015, to support two new open source package managers [Bower](http://bower.io/) and[NPM](https://www.npmjs.org/). [This article](https://www.asp.net/vnext/overview/aspnet-vnext/grunt-and-bower-in-visual-studio-2015) from ASP.NET give a good idea on how to use and configure **Bower** and **NPM** in detail.
#### NPM
**NPM** called the **Node Package manager** was created to be the package manager for **NodeJS** framework and is quite popular. Visual Studio 2015 has built capabilities to invoke **NPM** and install its packages. A lot of current open source tools are distributed via NPM, so having it right within Visual Studio makes it pretty easy for Web Developers to get the best of both worlds, a rich content editing experience as well as access to the latest top rated open source web libraries. The solution contains**package.json** file which is used to maintain the list of NPM packages and their versions. The default **package.json** files is listed in listing 2 below.
```
{
"version": "0.0.0",
"name": "WebApplication1",
"devDependencies": {
"grunt": "^0.4.5",
"grunt-bower-task": "^0.4.0"
}
}
```
Listing 2: package.json – configration file for NPM
Listing 2 above shows that two NPM packages are configured right now **grunt** and **grunt-bower-task** along with their version numbers. Visual Studio shows intellisense in the editor for the name as well as version number of packages. You can directly edit the **package.json** file to add new packages from NPM and Visual Studio will automatically download and make it available for your project.
#### Bower
**Bower** is built on top of NPM and is used as a package manager for client side libraries. So any external client (browser) side resource like bootstrap, requirejs, angularjs should be installed via bower. This replaces the function of **NuGet** package manager which was used earlier to install all packages in Visual Studio for all client side libraries. **NuGet** package manager still exists, but the recommendation is to use it for only server side libraries. This decision is bound to create a lot of confusion with existing applications being migrated to ASP.NET 5 having all their packages coming from **NuGet**. The **bower.json** file in the solution contains the configuration for bower, listing 3 below shows the default configuration for bower.
```
{
"name": "WebApplication1",
"private": true,
"dependencies": {
"bootstrap": "~3.0.0",
"jquery": "~1.10.2",
"jquery-validation": "~1.11.1",
"jquery-validation-unobtrusive": "~3.2.2"
},
"exportsOverride": {
"bootstrap": {
"js": "dist/js/*.*",
"css": "dist/css/*.*",
"fonts": "dist/fonts/*.*"
},
"jquery": {
"js": "jquery.{js,min.js,min.map}"
},
"jquery-validation": {
"": "jquery.validate.js"
},
"jquery-validation-unobtrusive": {
"": "jquery.validate.unobtrusive.{js,min.js}"
}
}
}
```
Listing 3: bower.json – Bower configuration file
Listing 3 above shows that by default **bower.json** file has 4 dependencies **Bootstrap**, **jQuery**, **jQuery Validation** and** jQuery Unobtrusive Validation** with their respective version numbers. Visual Studio has intellisense for editing **Bower.json** file too and it list the package names and their versions. Once new packages are added Visual Studio will download and make them available for your project.
## References
The next section in the Solution Explorer is the all familiar references section. Here all server side assemblies referenced in the project or added via **NuGet** are displayed. Although if you expand the references and the entries within it you will find that lot of changes have been made under the hood.
### NuGet
Now you can see that references are grouped so if your referenced NuGet package depends on several others then they get nested within (unless they are being directly used). You can also create commonly used reusable code as NuGet package and reference it. The NuGet packages are managed from the dependencies section in the **project.json** file. Visual Studio has also updated the UI for the package manager look at figure 4 below.
Figure 4: NuGet package manager
As you can see from figure 4 the interface for the package manager is changed. The tree view for **Installed**, **Available** and **Upgrade** packages has been removed in favor of a **Filter** for the packages. Plus whole lot more details about a package are shown as well as their dependencies are clearly listed in the details view. One of the biggest issue that I see right now is that there is no clarity if the package is ASP.NET 5 compatible or not. Or to be more precise if the package contains only server side code or server and client side libraries. Today nothing stops a developer to shoot themselves by trying to install a client library like **Bootstrap** from nuget. Although the project folder structure has changed installing a client package succeeds but it fails when you try to build the project. There needs to be a clear way to understand which libraries are safe for ASP.NET v5 and which are not. Unless MS does this clear distinction there is bound to be a lot of developer frustration. Expecting that the developer will know about the client library support just looking at the list of dependencies seems to be a mistake.
## Controllers, Models, Migrations and Views
These folders remain the same and their contents have only been updated to reflect MVC6 patterns.
## Config.json
The infamous XML based web.config file has been dumped in favor of **config.json** which tries to only focus on keeping configuration values for the project.**Config.json** is also a standard way to store properties in NPM. So here too Microsoft has made a major change removing the XML based configuration file in favor of json formatted standard file. Listing 4 below shows the standard syntax for the **config.json** file.
```
{
"Data": {
"DefaultConnection": {
"ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=aspnet5-WebApplication1-671e15dd-8d5b-45b2-b8a4-0ca00a36cd8c;Trusted_Connection=True;MultipleActiveResultSets=true"
}
},
"EntityFramework": {
"ApplicationDbContext": {
"ConnectionStringKey": "Data:DefaultConnection:ConnectionString"
}
}
}
```
Listing 4: config.json file
As you can see the listing above shows configuration for the database connection string used by Entity Framework as well as the second setting of pointing entity framework to the default connection string.
## gruntfile.js – Grunt
Just like Bower, [Grunt](http://gruntjs.com/) too is a package manager that depends on NPM, but its used to run tasks and automate tasks on the client side. It can automate tasks like generating css files from less files as well as several other client side optimizations. [This article](https://www.asp.net/vnext/overview/aspnet-vnext/grunt-and-bower-in-visual-studio-2015) provides information on how to configure and run **Grunt** tasks.**Gruntfile.js** is used to define tasks that will be run. Visual Studio has added the integration to be able to integrate **Grunt** with the visual studio build process so that before or after a build Grunt tasks can be invoked to perform client side tasks before the build can viewed in the browser. Listing 5 below shows the default **gruntfile.js** code.
```
// This file in the main entry point for defining grunt tasks and using grunt plugins.
// Click here to learn more. http://go.microsoft.com/fwlink/?LinkID=513275&clcid=0x409
module.exports = function (grunt) {
grunt.initConfig({
bower: {
install: {
options: {
targetDir: "wwwroot/lib",
layout: "byComponent",
cleanTargetDir: false
}
}
}
});
// This command registers the default task which will install bower packages into wwwroot/lib
grunt.registerTask("default", ["bower:install"]);
// The following line loads the grunt plugins.
// This line needs to be at the end of this this file.
grunt.loadNpmTasks("grunt-bower-task");
};
```
Listing 5: gruntfile.js – grunt tasks
As you can see there is a single task defined i.e. to install **Bower** plug-ins in the wwwroot/lib directory.
## project.json – Project configuration
The last file left to discover is the **project.json** file. This file contains several configuration information, parts of things which could be configures via the **web.config** file has been broken into **config.json** and **project.json** files. Although I believe **web.cofig** file could still be used if you were migrating an existing project. [This article](https://github.com/aspnet/Home/wiki/Project.json-file) gives a better description of the various configuration sections within the **project.json** file. Also as discussed earlier this file holds the NuGet packages as well as version information too. Listing 6 below shows the default **project.json** file.
```
{
/* Click to learn more about project.json http://go.microsoft.com/fwlink/?LinkID=517074 */
"webroot": "wwwroot",
"version": "1.0.0-*",
"dependencies": {
"EntityFramework.SqlServer": "7.0.0-beta1",
"EntityFramework.Commands": "7.0.0-beta1",
"Microsoft.AspNet.Mvc": "6.0.0-beta1",
//"Microsoft.AspNet.Mvc.WebApiCompatShim": "6.0.0-beta1",
"Microsoft.AspNet.Diagnostics": "1.0.0-beta1",
"Microsoft.AspNet.Diagnostics.Entity": "7.0.0-beta1",
"Microsoft.AspNet.Identity.EntityFramework": "3.0.0-beta1",
"Microsoft.AspNet.Security.Cookies": "1.0.0-beta1",
"Microsoft.AspNet.Server.IIS": "1.0.0-beta1",
"Microsoft.AspNet.Server.WebListener": "1.0.0-beta1",
"Microsoft.AspNet.StaticFiles": "1.0.0-beta1",
"Microsoft.Framework.ConfigurationModel.Json": "1.0.0-beta1",
"Microsoft.Framework.CodeGenerators.Mvc": "1.0.0-beta1",
"Microsoft.Framework.Logging": "1.0.0-beta1",
"Microsoft.Framework.Logging.Console": "1.0.0-beta1",
"Microsoft.VisualStudio.Web.BrowserLink.Loader": "14.0.0-beta1"
},
"commands": {
/* Change the port number when you are self hosting this application */
"web": "Microsoft.AspNet.Hosting --server Microsoft.AspNet.Server.WebListener --server.urls http://localhost:5000",
"gen": "Microsoft.Framework.CodeGeneration",
"ef": "EntityFramework.Commands"
},
"frameworks": {
"aspnet50": { },
"aspnetcore50": { }
},
"exclude": [
"wwwroot",
"node_modules",
"bower_components"
],
"packExclude": [
"node_modules",
"bower_components",
"**.kproj",
"**.user",
"**.vspscc"
],
"scripts": {
"postrestore": [ "npm install" ],
"prepare": [ "grunt bower:install" ]
}
}
```
Listing 5: project.json file
Listing 5 above shows the various sections as well as pre configurations of the **project.json** file where it defines a wide array of settings from project version to project dependencies.
## Conclusion
In the blog post I have tried to cover some of the essential changes that have happened in Visual Studio 2015 Preview ASP.NET 5 project. Microsoft has put a strong emphasis on utilizing the power of open source tools and providing an integrated experience. The have gone to the extant of marginalizing their own NuGet packager manager in favor of open source npm for a wide array of uses. In the process they have added a lot of confusion for new developers who need to know where to utilize which package manager as well as existing projects being migrated to ASP.NET v5 too will need a lot of refactoring to conform to the later standards.
## Related pages on Systenics
- [AI-powered listing description generation](https://www.systenics.com/auctionworx/ai-enhanced-listings-description-generation/)
- [AuctionWorx development and customization](https://www.systenics.com/auctionworx/development-and-customization/)
## Need help implementing this for your business?
Our team helps plan, build, and scale marketplace and auction workflows. Explore [industry solutions](https://www.systenics.com/solutions/), [platform products](https://www.systenics.com/products/), and [custom development services](https://www.systenics.com/auctionworx/development-and-customization/) tailored to your goals.
[Book a quick consultation](https://outlook.office.com/bookwithme/user/231015685f21467da5ef6e3eb8b50240@systenics.com/meetingtype/hbYq2z1Hj0C2e7DuwBqdnw2?anonymous&ep=mcard).
---
## Page: Uncheck Radio Button in WPF
URL: https://www.systenics.com/blogs/uncheck-radio-button-in-wpf/
Description: Recently I found myself in need of uncheck my selected Radio Button in WPF (Windows Presentation Framework). Unfortunately Radio Button has an unchecked event but it doesn’t fire. I thought of implementing uncheck onClick event, but even in this case it always givesChecked valuetrue after clicking on Radio Button. I started searching for examples in internet, but didn’t find an appropriate way to achieve this. One way I thought of styling the Checkbox to look like a Radio Button, but doing so is also had few issues. Then I thought of extending the Radio Button and use Dependency Property to achieve the same. This article describes the implementation of the Radio Button that supports uncheck and the way you can use it in your own applications. You can find the full implementation ofRadioButtonExtensionclass in the attached demo.
# Uncheck Radio Button in WPF
**by:** Nilesh Anchan **in:** [Programming](https://www.systenics.com/blogs/category/programming/) **tags:**[*.NET*](https://www.systenics.com/blogs/tag/net/), [*C#*](https://www.systenics.com/blogs/tag/c-sharp/), [*WPF*](https://www.systenics.com/blogs/tag/wpf/)
## Introduction
Recently I found myself in need of uncheck my selected Radio Button in WPF (Windows Presentation Framework). Unfortunately Radio Button has an unchecked event but it doesn’t fire. I thought of implementing uncheck onClick event, but even in this case it always gives Checked value true after clicking on Radio Button. I started searching for examples in internet, but didn’t find an appropriate way to achieve this. One way I thought of styling the Checkbox to look like a Radio Button, but doing so is also had few issues. Then I thought of extending the Radio Button and use Dependency Property to achieve the same. This article describes the implementation of the Radio Button that supports uncheck and the way you can use it in your own applications. You can find the full implementation of RadioButtonExtension class in the attached demo.
## Using the Code
Create a new WPF application in Visual Studio 2012. Then add a new class in your project and give a name as RadioButtonExtension. Inherit the class with RadioButton object so that we can extend its events. Now in the constructor of RadioButtonExtension class initialize the events of radio buttons as shown Listing 1 below:
Listing 1 - RadioButtonExtension.cs – modified constructor and events
```
public class RadioButtonExtension : RadioButton
{
public RadioButtonExtension()
{
this.Checked += RadioButtonExtension_Checked;
this.Click += RadioButtonExtension_Click;
}
void RadioButtonExtension_Click(object sender, System.Windows.RoutedEventArgs e)
{
}
void RadioButtonExtension_Checked(object sender, System.Windows.RoutedEventArgs e)
{
}
}
```
Now create a Dependency Property in **RadioButtonExtension.cs**in order to change the checked property of Radio Button as follows:
Listing 2 – Dependency Property
```
public bool? IsCheckedChanged
{
get { return (bool?)GetValue(IsCheckedChangedProperty); }
set { SetValue(IsCheckedChangedProperty, value); }
}
// Using a DependencyProperty as the backing store for IsChanged.
// This enables animation, styling, binding, etc...
public static readonly DependencyProperty IsCheckedChangedProperty =
DependencyProperty.Register("IsChanged", typeof(bool?),
typeof(RadioButtonExtension),
new FrameworkPropertyMetadata(false,
FrameworkPropertyMetadataOptions.Journal |
FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,
CheckedChanged));
public static void CheckedChanged(DependencyObject d,
DependencyPropertyChangedEventArgs e)
{
((RadioButtonExtension)d).IsChecked = (bool)e.NewValue;
}
```
Lastly create a static int property, **WasChecked** which will help us to know the previous status of Checkbox. I update the value of the**WasChecked** property in the **Click** and**Checked** event. I also update the dependency property**IsCheckedChanged** which will call**CheckedChanged** method on property change and assign the**Checked** value of Radio Button with the new value as shown in listing 3 below.
Listing 3 - Modifying **WasChecked** property and**IsCheckedChanged** dependency property
```
public static int WasChecked { get; set; }
void RadioButtonExtension_Click(object sender, System.Windows.RoutedEventArgs e)
{
if (WasChecked > 0)
{
this.IsCheckedChanged = !this.IsCheckedChanged;
}
WasChecked = 1;
}
void RadioButtonExtension_Checked(object sender, System.Windows.RoutedEventArgs e)
{
this.IsCheckedChanged = true;
WasChecked = 0;
}
```
The way this works is that when RadioButton is checked, the**Checked** event is fired which sets**WasChecked** = 0 and **IsCheckedChanged**=true. Then **Click** event is fired where I set**WasChecked** = 1.
Similarly, when the RadioButton is clicked again it fires the **Click** event in which case it checks**WasChecked** > 0, so it sets the dependency property **IsCheckedChanged** = false. Which fires the event**CheckedChanged** which assigns the new value to the RadioButton.
The full source code of the **RadioButtonExtension** class is shown in listing 4 below:
Listing 4 – Full **RadioButtonExtension** class source code
```
using System.Windows;
using System.Windows.Controls;
namespace RadioButtonSam
{
public class RadioButtonExtension : RadioButton
{
public static int WasChecked { get; set; }
public bool? IsCheckedChanged
{
get { return (bool?)GetValue(IsCheckedChangedProperty); }
set { SetValue(IsCheckedChangedProperty, value); }
}
// Using a DependencyProperty as the backing store for IsChanged.
//This enables animation, styling, binding, etc...
public static readonly DependencyProperty IsCheckedChangedProperty =
DependencyProperty.Register("IsChanged", typeof(bool?),
typeof(RadioButtonExtension),
new FrameworkPropertyMetadata(false,
FrameworkPropertyMetadataOptions.Journal |
FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,
CheckedChanged));
public static void CheckedChanged(DependencyObject d,
DependencyPropertyChangedEventArgs e)
{
((RadioButtonExtension)d).IsChecked = (bool)e.NewValue;
}
public RadioButtonExtension()
{
this.Checked += new RoutedEventHandler(RadioButtonExtension_Checked);
this.Click += RadioButtonExtension_Click;
}
void RadioButtonExtension_Click(object sender, System.Windows.RoutedEventArgs e)
{
if (WasChecked > 0)
{
this.IsCheckedChanged = !this.IsCheckedChanged;
}
WasChecked = 1;
}
void RadioButtonExtension_Checked(object sender, System.Windows.RoutedEventArgs e)
{
this.IsCheckedChanged = true;
WasChecked = 0;
}
}
}
```
To use this new **RadioButtonExtension** in your project, you can include it in your **MainWindow.xaml** as shown in listing 5 below:
Listing 5 – Using **RadioButtonExtension** in**MainWindow.xaml**
```
```
Hope that this would help you in your projects which help me a lot.
[Click here](https://www.systenics.com/media/3922/RadioButtonSam.zip) to download the source file.
## Need help implementing this for your business?
Our team helps plan, build, and scale marketplace and auction workflows. Explore [industry solutions](https://www.systenics.com/solutions/), [platform products](https://www.systenics.com/products/), and [custom development services](https://www.systenics.com/auctionworx/development-and-customization/) tailored to your goals.
[Book a quick consultation](https://outlook.office.com/bookwithme/user/231015685f21467da5ef6e3eb8b50240@systenics.com/meetingtype/hbYq2z1Hj0C2e7DuwBqdnw2?anonymous&ep=mcard).
---
## Page: Systenics Website Reimagined - Relaunch!
URL: https://www.systenics.com/blogs/systenics-website-relaunch/
Description: Systenics Solutions has reimagined itself over the years and a brand-new website has been designed and launched which demonstrates our core values.
# Systenics Website Reimagined - Relaunch!
**by:** Saurabh Nandu **in:** [General](https://www.systenics.com/blogs/category/general/) **tags:**[*website*](https://www.systenics.com/blogs/tag/website/)
## Overview
Our older website was starting to show age and unable to keep pace with styles. We had several internal discussions regarding a re-design but usually ended up shelving the plan since we were unable to identify and justify the reason for re-design if the outcome would just be a better design. At times we thought of just purchasing a template and updating the content and finish the process.
## Epiphany - Superhero's Squad
During one of internal discussion, we realized what set us apart, is our phenomenal squad of Superhero Developers. Hand-picked, personally trained our full stack squad has been delivering completed projects on time and cost for several years now. But we have been shying away from the proclamation that we have best of the talent available. Learn more [about our team](https://www.systenics.com/about-us/) and how we work.
100% project success, super happy clients has been a feat that our squad has been regularly achieving no matter the size or complexity of the project. It was a no brainer for us to capitalize on our achievements and bring it across to even a larger set of clients.
We have already put in the hard work for years, so why not stake a claim to it? Instead of 10X Developers, why not let everyone know about our Developer Superhero Squad who have been helping clients achieve 100% mission success? We present to the world, our Developer Squad of Super Heros with diverse skills set ready to solve any challenge given.
## Design Brief - Superhero's Theme
Our senior superhero designer Naresh was briefed on the idea of reimaging the website using Superhero's at the core. While there was a sense of excitement there was also a sense of fear if we would be able to pull it off being true to the vision as well as make it look professionally appealing. Naresh took the challenge head-on and spent the next few months learning to draw and characterize superhero's - it was no ordinary task! But few months of sticking with the plan, we are proud to of the end result. It's visually appealing, modeled on our own team members and professional looking at the same time. As usual our squad delivers, no matter the challenge!
The site does have rough edges and needs a few more tweaks but it's time for us to reveal to the world our refreshed, reimagined and relaunched service offerings.
## Squad Refresh, Retrain
This launch also gives us renewed energy and focus to rework on our internal strengths and processes for better client outcomes. AI and Cloud based offerings are dominating the landscape and our squad is reimagining the ways we execute our missions in this renewed backdrop. Our squad embraces AI as being one of the key tools to achieve mission success going forward and we are making significant investments in training and building AI enhanced products and services.
Lastly, we would like to thank our clients who have believed and supported us throughout our journey. Clients who have put unwavering faith in our squad over the years. It is the confidence that we have gained from these clients, which allows us to put on a bold new face and encourages us to push boundaries every day to deliver better and technologically superior outcomes.
## Specialist AI Superhero's Squad - Launched
The speed at which generative AI is innovating is tremendous, touching and changing every business process. Businesses both small and large are seeing great benefits with the advent of AI and are demanding smart AI based solutions. Evolving with the latest trends we have launched a specialized AI Superhero's Squad at [https://systenics.ai](https://systenics.ai/). This squad is laser focused on the new trends, services and products in the AI space. Our mission is to ensure that we are able to deliver AI enhanced solutions and products to all our clients both old and new.
## Related pages on Systenics
- [Industry solutions](https://www.systenics.com/solutions/)
- [About Systenics](https://www.systenics.com/about-us/)
## Need help implementing this for your business?
Our team helps plan, build, and scale marketplace and auction workflows. Explore [industry solutions](https://www.systenics.com/solutions/), [platform products](https://www.systenics.com/products/), and [custom development services](https://www.systenics.com/auctionworx/development-and-customization/) tailored to your goals.
[Book a quick consultation](https://outlook.office.com/bookwithme/user/231015685f21467da5ef6e3eb8b50240@systenics.com/meetingtype/hbYq2z1Hj0C2e7DuwBqdnw2?anonymous&ep=mcard).
---
## Page: Sync SQL Server 2012 Data with SQL CE 3.5 SP2 over the Internet using WCF Services using MS Sync Framework v2.1
URL: https://www.systenics.com/blogs/sync-sql-server-2012-data-with-sql-ce-35-sp2-over-the-internet-using-wcf-services-using-ms-sync-framework-v21/
Description: Recently, we were working on a client project where the client required multiple Windows Based Client Applications to be able to work offline and synchronize with the master MS SQL Database (hosted on the internet), when internet connection is available. We faced several challenges in building this application and I thought it would be a good idea to blog the solution we created for the client. In this post we have tried to build upon the samples provided by Microsoft but explain the whole process so that its easier for others to understand and implement this platform. This blog post does not try to explain in detail how sync framework works, but tries to explain the deployment and creation of WCF based web service to sync between server and clients over the internet.
# Sync SQL Server 2012 Data with SQL CE 3.5 SP2 over the Internet using WCF Services using MS Sync Framework v2.1
**by:** Saurabh Nandu **in:** [Programming](https://www.systenics.com/blogs/category/programming/) **tags:**[*.NET*](https://www.systenics.com/blogs/tag/net/), [*SQL CE 3.5 SP2*](https://www.systenics.com/blogs/tag/sql-ce-35-sp2/), [*SQL Server*](https://www.systenics.com/blogs/tag/sql-server/), [*Sync Framework 2.1*](https://www.systenics.com/blogs/tag/sync-framework-21/), [*WCF*](https://www.systenics.com/blogs/tag/wcf/), [*WPF*](https://www.systenics.com/blogs/tag/wpf/)
## Overview
Recently, we were working on a client project where the client required multiple line of business Windows Based Client Applications to be able to work offline and synchronize with the master MS SQL Database (hosted on the internet), when internet connection is available. We faced several challenges in building this application and I thought it would be a good idea to blog the solution we created for the client. In this post we have tried to build upon the samples provided by Microsoft but explain the whole process so that its easier for others to understand and implement this platform. This blog post does not try to explain in detail how sync framework works, but tries to explain the creation of WCF based web service to sync between server and clients over the internet.
The particular client that we were working for had employees who used to travel extensively and needed data at least refreshed daily. Internet connection could not be guaranteed at all times so creating a web/mobile based application was ruled out. There are significantly large number of businesses in developing countries like India who still don’t have access to reliable Internet connections, we have no choice but to build Windows desktop based applications for them. The best solution for this business problem was to create Windows based applications which would sync data with a central server hosted on the internet.
## Technology Selection
Over the years there has been a much greater push of new technologies built for the web and mobile devices, but there seems to be much slower pace of development on the Windows application development side from Microsoft. The choice of technology for building Windows based application is WPF (Windows Presentation Framework), but the pace of development on WPF is certainly way behind the pace of development on the web technologies side.
The state of technologies that allow synchronization between client and server is bad and totally confusing! The sync framework has not advanced in ages, while there is no alternative path presented. We are stuck to using Sync Framework v2.1, released in last quarter of 2010 for our solution since we wish to have a framework that provides automatic synchronization between SQL CE and SQL Server databases. The latest, Sync Framework 4 builds upon Sync Framework 2.1 and provides OData based synchronization so that you can synchronize between device platforms without installing any framework on the client platform, but it does not provide any features for automatic sync between client and server db. If you want to use Sync Framework 4 then you need to manually handle the client side sync code. The only highlight for this framework is that Microsoft is promoting it as the means to synchronize with Azure cloud databases, so there are some updated samples provided.
The other major issue with using Sync Framework 2.1 is that it depends upon SQL CE 3.5 SP2 and does NOT work with the latest SQL CE 4.0. For reasons best known to Microsoft they have chosen to release SQL CE 4.0 without support for synchronization, so we are stuck to using SQL CE 3.5 SP2. Tooling support in Visual Studio 2012 is built to support SQL CE 4.0 and does not work with SQL CE 3.5.
On the server side, we will expose the sync framework using WCF (Windows Communication Framework) web services. The core reason behind this blog post is that the sample presented by Microsoft is not well documented nor is it clear how to deploy the sample application. In this blog post we are building upon the sample provided by Microsoft but making things clear to understand. The default WCF sample provided by Microsoft is built under the assumption that the WCF service will be self-deployed, while we have modified the sample to deploy the service in IIS.
To summarize technologies used, on client side we will use WPF, SQL CE 3.5 Sp2 and MS Sync Framework v2.1. On the server side we will use WCF web services, MS SQL 2012 (you can use MS SQL 2008/Express does not matter) and MS Sync Framework v2.1.
We will be using Visual Studio 2012 and MS SQL 2012 for building this application.
## Installing SDK’s and Frameworks
Before we begin development we need to have the following SDK’s and Frameworks installed if they are missing:
[Microsoft Sync Framework 2.1 Software Development Kit (SDK)](http://www.microsoft.com/en-us/download/details.aspx?id=23217) - SyncSDK-v2.1-x64-ENU.msi or SyncSDK-v2.1-x86-ENU.msi.
Its very important to remember to install the right flavor of the SDK based on your development machine. Make sure you have the 64-bit version installed for a 64-bit machine else the sync framework will not work correctly.
[Microsoft SQL Server Compact 3.5 Service Pack 2 for Windows Desktop](http://www.microsoft.com/en-us/download/details.aspx?id=5783) - SSCERuntime-ENU.exe.
Please read the information provided on the download page. The above file contains two msi installers. On a 32 bit machine only install the SSCERuntime_x86-ENU.msi file. But on a 64 bit machine you need to install BOTH SSCERuntime_x86-ENU.msi as well as SSCERuntime_x64-ENU.msi files as per the instructions provided. Even if you install this version over SQL CE 4.0, both versions run side-by-side and do not cause any issues.
[Microsoft Sync Framework v4.0 Toolkit](http://code.msdn.microsoft.com/Sync-Framework-Toolkit-4dc10f0e) (optional)
This is an optional download, we use a particular tool provided in this toolkit for provisioning the database the support synchronization. Please read the download notes to install the pre-requisites required to build these samples. We have provided a pre-built version of the tool in the downloads.
[SQL Server Compact Toolbox](http://sqlcetoolbox.codeplex.com/releases) (optional)
As mentioned above, Visual Studio 2012 does not connect to SQL CE 3.5 SP2. This Visual Studio 2012 add-in is very useful to help you create and manage SQL CE 3.5 databases from within Visual Studio.
## Getting Started – Database Design
The WCF service sample that we will be providing will be independent of any particular application. To explain the working of the code base we are taking a simple application where there are 3 tables Products, Employees and EmployeeSales. The Database diagram for the same is shown below:
Figure 1: Database diagram
In the attached download file, you can extract the db folder to find a script **SampleSync.sql** as well as backup of the database **SampleSync.bak** (Note: the database backup will only restore to SQL Server 2012, if you have a lower version please apply the script to create the database). You can use the script file to create the above database schema.
We are using a very simplified database schema with just 3 table, the schema is pretty self-explanatory. **Products** table will have a list of products that are defined on the server and only fetched on the client end. No updates to products will be made on the client end. **Employees** table too defines the employees on the server, no changes are made to them on the client. Ideally it would contain Employee login information too so that you can automatically determine which employee is making the sale. Finally, we have the **EmployeSales** table which will record the sales of Employee’s, this table will be updated on both client and server and will have to be synchronized both ways.
One of the most important factor in designing a database which needs synchronization is to make sure that the primary key is set to **uniqueidentifier** data type. Its crucial since records can be generated on both client and server side and there will be issues in making sure they are unique if you do not use **uniqueidentifier** as the data type.
## Provisioning the Database
Before we can set up synchronization we need to provision the MS SQL server side database to support Sync Framework. There are several different ways of doing it and its beyond the scope of this blog post. We choose to use the **SyncSvcUtilUI** tool provided in the Sync Toolkit v4.0 since it provides a visual interface for setting up synchronization. If can setup synchronization using which ever method you prefer, it does not affect the wcf service code. We have provided a pre-built version of the tool in the **SyncSvcUtilUI** folder.
There are two scopes we wish to define for our application as given below:
- **ProductsEmployees** – This scope will contain the **Products** and **Employees** table and will be used to push data from the server to the client. No changes to these tables will be synced to the server, as per the specifications discussed above.
- **EmployeeSales** – This scope will contain filtered scope for **EmployeeSales** table. This scope will allow changes to be synced both ways, to and from the server.
Start the **SyncSvcUtilUI** tool and click on **Generate or Edit Sync Configuration** link. Provide the file path to save the sync configuration file with name**SyncConfig** and click **Next** as shown in figure 2.
Figure 2: Create a new Sync Configuration file.
On the next screen first click the **Add** button to add a new targeted database. Provide the **Config Name** as **SyncSample**, **Db Server** as your SQL Server name, **Db Name** as **SyncSample** and then select **Windows Authentication** or **SQL Authentication** based on your SQL Server configuration. Most important, after you enter the settings click on the **Save** button, if you do not click on the save button then the wizard will not save the values if you just click the **Next** button. Once the database setting is saved click on the **Next** button. Figure 3 shows the database settings.
Figure 3: Add database
On the Select Scope screen first click on the Add button to add a new scope. We need to define the two scopes as defined above, so provide the Scope Name as **ProductsEmployees** for the first scope and select**Enable Apply Bulk Procedures** checkbox and click **Save** button as seen in Figure 4. The reason why we select Enable Bulk Apply procedures is that it speeds up the synchronization process significantly when we use Bulk Procedures, you could alternatively leave it unchecked if that’s your requirement, it does not affect our services implementation.
Figure 4: Add ProductsEmployees scope
On the same screen click Add button again to add another scope. Provide the Scope Name as **EmployeeSales** and select **Enable Apply Bulk Procedures** checkbox and click **Save** button as seen in Figure 5. Then click the **Next** button to proceed further.
Figure 5: Add EployeeSales scope
On the** Select Sync Tables** screen, first select **ProductsEmployees**from the **Select Scope** dropdown. Then click the **Add/Edit** button to open the popup. Select the **SyncSample** database from **Select Database** dropdown. From the list of tables select**Products** and **Employees** table and click **Ok** to close the pop-up and add the tables to the scope.
Figure 6: Add tables to ProductsEmployees scope
Change the Select Scope dropdown to **EmployeeSales** and click on the **Add/Edit** button again to open table select pop-up. Select **SyncSample** database from the **Select Database** dropdown to populate the tables list. Select the **EmployeeSales** table from the Tables list and click **Ok** to close the pop-up and add the table to scope. Click **Next** to continue after adding tables to both the scope. The last screen shows the XML generated which defines the configuration made by us. Click on the **Finish** button to save the scope configuration and close this wizard.
Figure 7 shows the table added to the scope.
Figure 7: Define Tables for Scope
On the main application screen now select **Provision or Deprovision** to start a new Wizard. On the Settings screen, select the SyncSample.config file that was created previously. This step will actually run scripts on the database to provision our tables to support synchronization. Once the file is loaded, select **ProductEmployees** from the **Select Sync Scope** dropdown and click **Next** button. This will automatically start modifying the database and the status will be shown on the screen. Once the process finishes click on Back button again so that we can provision the other scope too. In case you get an “Invalid Parameter” error while provisioning, please move the sync config file created in steps above to the root drive and then follow the process again. There is a bug in this tool, where if there are any spaces in the path to the sync config file the provisioning fails (*internally this UI application is passing parameters to the command line syncsvcutil application and they are not encapsulating string parameters in quotations, hence if the path contains spaces the command line applications throws an error.*). Figure 8 shows the sync scope selection.
Figure 8: Select sync scope for provision
Once the previous provisioning is completed, select **EmployeesSales** from **Select Sync Scope** dropdown and click **Next** button to start provisioning for this scope. Once the provisioning is complete, click **Finish** to close the wizard and then close the **SyncSvcUtilUI** application. Our database provisioning process is complete, you can examine the database in SQL management studio to find extra tables and triggers added to track any changes that are made to the synced tables. This completes the database provisioning step. Figure 9 shows the completed provisioning step.
Figure 9: Finish Sync Scope provisioning
## Creating Visual Studio 2012 Projects
### 1) Service Interface
Fire up Visual Studio 2012 and start a new Project of type Class Library. Enter the project name as **ServiceInterface** and the solution name as **SyncSample** and click **OK** to create the project.
Figure 10: Create new Console Project
The **ServiceInterface** project will contain a single Interface which will be implemented by both the WCF Web service as well as the client proxy will use the service interface to invoke the web service manually. The interface can also be defined in the web service project and does not need a special project defined (as shown in the Microsoft Samples), but then you would have to reference the web service assembly in your client project exposing your business logic to the client machine which is not a good security decision.
In the solution explorer select the default **Class1.cs** and delete it. Then right-click the project name in the solution explorer and select **Add** –> Add **New Item** from the context menu. Select **Interface** from Add new Item dialog and provide the file name **ISyncService.cs** and click **OK** to create the new interface.
Before we get started with coding the interface we need to add references to couple of assemblies. In solution explorer, right click **References** and select **Add Reference** from the context menu. Select **Framework** under **Assemblies**, to list all the framework assemblies. Then check assemblies **System.ServiceModel** and **System.Runtime.Serialization** to select them.
Next, we need to references to the Sync Framework assemblies. Its important to note that Sync Framework needs platform specific assemblies so if you are working on a 64-bit machine you need to references 64 bit assemblies or if you are on a 32 bit machine then you need to use 32 bit assemblies. Its important to ensure that you check the deployment web server and build platform specific assemblies, else the Sync Framework will not work.
Select Browse on the **Add Reference** dialog, navigate to the path where the Sync Framework is installed to reference **Microsoft.Synchronization.dll** and **Microsoft.Synchronization.Data.dll**. On a 64 bit machine these assemblies can be found in the **C:\Program Files (x86)\Microsoft SDKs\Microsoft Sync Framework\2.1\Runtime\x64** and**C:\Program Files (x86)\Microsoft SDKs\Microsoft Sync Framework\2.1\Runtime\ADO.NET\V3.1\x64** folders respectively. If you go one level up you would find the x86 folder containing the 32-bit version of the assemblies. If you are developing on a 32 bit machine then look within the **C:\Program Files\Microsoft SDKs\Microsoft Sync Framework\2.1\Runtime\x86** and **C:\Program Files\Microsoft SDKs\Microsoft Sync Framework\2.1\Runtime\ADO.NET\V3.1\x86** folders to find these assemblies. Click **OK** to reference the two assemblies in your project.
Now copy paste code listing 1 below into the ISyncSerivce.cs interface, save the file and compile the project.
```
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.Runtime.Serialization;
using System.Data;
using Microsoft.Synchronization.Data;
using Microsoft.Synchronization;
namespace ServiceInterface
{
[ServiceContract(SessionMode = SessionMode.Required)] // Important attribute
[ServiceKnownType(typeof(SyncIdFormatGroup))]
[ServiceKnownType(typeof(DbSyncContext))]
[ServiceKnownType(typeof(SyncSchema))]
[ServiceKnownType(typeof(WebSyncFaultException))]
[ServiceKnownType(typeof(SyncBatchParameters))]
[ServiceKnownType(typeof(GetChangesParameters))]
public interface ISyncService
{
// Defines the first method to call when using SessionMode
[OperationContract(IsInitiating = true)]
void Initialize(string scopeName);
[OperationContract]
DbSyncScopeDescription GetScopeDescription();
[OperationContract]
void BeginSession(SyncProviderPosition position);
[OperationContract]
SyncBatchParameters GetKnowledge();
[OperationContract]
GetChangesParameters GetChanges(uint batchSize,
SyncKnowledge destinationKnowledge);
[OperationContract]
SyncSessionStatistics ApplyChanges(ConflictResolutionPolicy
resolutionPolicy, ChangeBatch sourceChanges, object changeData);
[OperationContract]
bool HasUploadedBatchFile(string batchFileid, string remotePeerId);
[OperationContract]
void UploadBatchFile(string batchFileid, byte[] batchFile,
string remotePeerId);
[OperationContract]
byte[] DownloadBatchFile(string batchFileId);
[OperationContract]
void EndSession();
//Indicates the last method to call when use SessionMode
[OperationContract(IsTerminating = true)]
void Cleanup();
}
[DataContract]
public class SyncBatchParameters
{
[DataMember]
public SyncKnowledge DestinationKnowledge;
[DataMember]
public uint BatchSize;
}
[DataContract]
[KnownType(typeof(DataSet))]
public class GetChangesParameters
{
[DataMember]
public object DataRetriever;
[DataMember]
public ChangeBatch ChangeBatch;
}
[DataContract]
public class WebSyncFaultException
{
public string message;
public Exception innerException;
public WebSyncFaultException(string message, Exception innerException)
{
this.message = message;
this.innerException = innerException;
}
[DataMember]
public string Message
{
get
{
return this.message;
}
set
{
this.message = value;
}
}
[DataMember]
public Exception InnerException
{
get
{
return this.innerException;
}
set
{
this.innerException = value;
}
}
}
}
```
Listing 1: ISyncService.cs
The code for Listing 1 is from the sample provided by Microsoft, it’s a standard interface definition with methods defined which match the methods called during Synchronization. One key point to note here is the **[ServiceContract(SessionMode = SessionMode.Required)]** attribute on line 13. This attribute forces the web service to enable sessions on server, but its different from ASP.NET sessions. Instances of the WCF web service class which will implement the **ISyncService** interface will remain in memory and will service the same client call. This way objects that are created on the server side in the **Initialize** method, will remain active on the server to respond to further service calls until the **CleanUp** method is called by the client explicitly. Another benefit of enabling Sessions is that WCF guarantees the method calls will respond in the order they were called, making the service behave like a native class rather than a stateless service. The obvious drawback of this is that service instances end up taking more memory on the server while they are executing as compared to stateless services. But this seems to be the only way to get Sync Framework to work on the internet transparently.
Besides the **ISyncService** interface there are 3 data classes defined which are basically used to serialize data and exceptions over the wire.
### 2) Web Service Project
In solution explorer right click the solution name and **Add –> New Project** from the context menu. Select the **WCF Service Application** template, provide the project name as **SyncService** and click**OK** to add the new project to our solution. In solution explorer select and delete the default IService1.cs as well as Service1.svc files. Again in the solution explorer right click **References** and select **Add Reference** from the context menu. In the **Add Reference** dialog select **Solution** – > **Projects** and select the **ServiceInterface** checkbox to add reference to the project.
Select Browse on the **Add Reference** dialog, navigate to the path where the Sync Framework is installed to reference**Microsoft.Synchronization.dll,****Microsoft.Synchronization.Data.dll **and **Microsoft.Synchronization.Data.SqlServer.dll**. On a 64 bit machine these assemblies can be found in the **C:\Program Files (x86)\Microsoft SDKs\Microsoft Sync Framework\2.1\Runtime\x64** and**C:\Program Files (x86)\Microsoft SDKs\Microsoft Sync Framework\2.1\Runtime\ADO.NET\V3.1\x64** folders respectively. If you go one level up you would find the x86 folder containing the 32-bit version of the assemblies. If you are developing on a 32 bit machine then look within the **C:\Program Files\Microsoft SDKs\Microsoft Sync Framework\2.1\Runtime\x86** and **C:\Program Files\Microsoft SDKs\Microsoft Sync Framework\2.1\Runtime\ADO.NET\V3.1\x86** folders to find these assemblies. Click **OK** to reference the assemblies in your project.
Once the references have been added we need to reference the database in the web.config file. In solution explorer, double click on the web.config file to open it and add the connection string section to it as shown in Listing 2. We are using Windows authentication to connect to the local SQL Server instance, you can modify the connection string to correctly point to your database server.
```
```
Listing 2: Connection String setting in web.config file.
Once database connection has been set, let’s add code to this project. Right click the project name in solution explorer and select **Add** –> **Class**. Provide the class name as **ServerSynchronizationHelper.cs** and click **OK **to create the class. This class is a helper class used to connect with the SQL Server database. Copy paste the code from listing 3 below to populate the code for the class. The code for this class is also extracted from the Microsoft Sample, but its refined to remove all CE client provider’s reference. The code below is a simple class which creates and configures an instance of **SqlSyncProvider** object using the provided connection string and scope name.
```
using System;
using System.Collections.Generic;
using System.Text;
using System.Data.SqlClient;
using System.Data;
using System.IO;
using Microsoft.Synchronization;
using Microsoft.Synchronization.Data;
using Microsoft.Synchronization.Data.SqlServer;
using System.Configuration;
namespace SyncService
{
public class ServerSynchronizationHelper
{
string conString =
ConfigurationManager.ConnectionStrings["DBConnection"].ConnectionString;
///
/// Configure the SqlSyncprovider. Note that this method assumes you have a direct
/// conection to the server as this is more of a design time use case vs. runtime
/// use case. We think of provisioning the server as something that occurs before
/// an application is deployed whereas provisioning the client is somethng that
/// happens during runtime (on intitial sync) after the application is deployed.
///
///
///
public SqlSyncProvider ConfigureSqlSyncProvider(string scopeName)
{
SqlSyncProvider provider = new SqlSyncProvider();
provider.ScopeName = scopeName;
provider.Connection = new SqlConnection(conString);
//create anew scope description and add the appropriate tables to this scope
DbSyncScopeDescription scopeDesc = new DbSyncScopeDescription(scopeName);
//class to be used to provision the scope defined above
SqlSyncScopeProvisioning serverConfig =
new SqlSyncScopeProvisioning((SqlConnection)provider.Connection);
//determine if this scope already exists on the server and if not go ahead
//and provision
if (!serverConfig.ScopeExists(scopeName))
{
//note that it is important to call this after the tables have been added
//to the scope
serverConfig.PopulateFromScopeDescription(scopeDesc);
//indicate that the base table already exists and does not need to be created
serverConfig.SetCreateTableDefault(DbSyncCreationOption.Skip);
//provision the server
serverConfig.Apply();
}
return provider;
}
}
}
```
Listing 3: ServerSynchronizationHelper.cs source code
Finally, we need to add the WCF Web service to our project. Right click the project name in solution explorer and select **Add** –>**New Item**. In the Add New Item dialog select **WCF Service** and provide the service name as **SqlWebSyncService.svc** and click **OK** to create the WCF web service.Cope paste the code from listing 4 below into the code for the service. This code is again from the Microsoft Sample and it implements the ISyncService contract we defined above. We also need to delete the auto created **ISqlWebSyncService.cs** interface from solution explorer, since we are not using it.
```
using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Synchronization;
using Microsoft.Synchronization.Data;
using Microsoft.Synchronization.Data.SqlServer;
using System.IO;
using System.ServiceModel;
using System.Data.SqlClient;
using ServiceInterface;
using System.ServiceModel.Activation;
namespace SyncService
{
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
[AspNetCompatibilityRequirements(
RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
public class SqlWebSyncService : ISyncService
{
protected bool isProxyToCompactDatabase;
protected SqlSyncProvider sqlProvider;
protected DirectoryInfo sessionBatchingDirectory = null;
protected Dictionary batchIdToFileMapper;
int batchCount = 0;
public void Initialize(string scopeName)
{
ServerSynchronizationHelper helper = new ServerSynchronizationHelper();
this.sqlProvider = helper.ConfigureSqlSyncProvider(scopeName);
this.batchIdToFileMapper = new Dictionary();
}
public Microsoft.Synchronization.Data.DbSyncScopeDescription GetScopeDescription()
{
Log("GetSchema: {0}", this.sqlProvider.Connection.ConnectionString);
DbSyncScopeDescription scopeDesc =
SqlSyncDescriptionBuilder.GetDescriptionForScope(
this.sqlProvider.ScopeName, (SqlConnection)this.sqlProvider.Connection);
return scopeDesc;
}
public void BeginSession(Microsoft.Synchronization.SyncProviderPosition position)
{
Log("*****************************************************************");
Log("******************** New Sync Session ***************************");
Log("*****************************************************************");
Log("BeginSession: ScopeName: {0}, Position: {1}",
this.sqlProvider.ScopeName, position);
//Clean the mapper for each session.
this.batchIdToFileMapper = new Dictionary();
this.sqlProvider.BeginSession(position, null/*SyncSessionContext*/);
this.batchCount = 0;
}
public SyncBatchParameters GetKnowledge()
{
Log("GetSyncBatchParameters: {0}", this.sqlProvider.Connection.ConnectionString);
SyncBatchParameters destParameters = new SyncBatchParameters();
this.sqlProvider.GetSyncBatchParameters(out destParameters.BatchSize,
out destParameters.DestinationKnowledge);
return destParameters;
}
public GetChangesParameters GetChanges(uint batchSize,
Microsoft.Synchronization.SyncKnowledge destinationKnowledge)
{
Log("GetChangeBatch: {0}", this.sqlProvider.Connection.ConnectionString);
GetChangesParameters changesWrapper = new GetChangesParameters();
changesWrapper.ChangeBatch = this.sqlProvider.GetChangeBatch(batchSize,
destinationKnowledge, out changesWrapper.DataRetriever);
DbSyncContext context = changesWrapper.DataRetriever as DbSyncContext;
//Check to see if data is batched
if (context != null && context.IsDataBatched)
{
Log("GetChangeBatch: Data Batched. Current Batch #:{0}", ++this.batchCount);
//Dont send the file location info. Just send the file name
string fileName = new FileInfo(context.BatchFileName).Name;
this.batchIdToFileMapper[fileName] = context.BatchFileName;
context.BatchFileName = fileName;
}
return changesWrapper;
}
public Microsoft.Synchronization.SyncSessionStatistics ApplyChanges(
Microsoft.Synchronization.ConflictResolutionPolicy resolutionPolicy,
Microsoft.Synchronization.ChangeBatch sourceChanges, object changeData)
{
Log("ProcessChangeBatch: {0}", this.sqlProvider.Connection.ConnectionString);
DbSyncContext dataRetriever = changeData as DbSyncContext;
if (dataRetriever != null && dataRetriever.IsDataBatched)
{
string remotePeerId = dataRetriever.MadeWithKnowledge.ReplicaId.ToString();
//Data is batched. The client should have uploaded this file to us prior to
//calling ApplyChanges.
//So look for it.
//The Id would be the DbSyncContext.BatchFileName which is just the batch
//file name without the complete path
string localBatchFileName = null;
if (!this.batchIdToFileMapper.TryGetValue(dataRetriever.BatchFileName,
out localBatchFileName))
{
//Service has not received this file. Throw exception
throw new FaultException(
new WebSyncFaultException("No batch file uploaded for id " +
dataRetriever.BatchFileName,
null));
}
dataRetriever.BatchFileName = localBatchFileName;
}
SyncSessionStatistics sessionStatistics = new SyncSessionStatistics();
this.sqlProvider.ProcessChangeBatch(resolutionPolicy, sourceChanges,
changeData,
new SyncCallbacks(), sessionStatistics);
return sessionStatistics;
}
public bool HasUploadedBatchFile(String batchFileId, string remotePeerId)
{
this.CheckAndCreateBatchingDirectory(remotePeerId);
//The batchFileId is the fileName without the path information in it.
FileInfo fileInfo = new FileInfo(Path.Combine(
this.sessionBatchingDirectory.FullName,
batchFileId));
if (fileInfo.Exists && !this.batchIdToFileMapper.ContainsKey(batchFileId))
{
//If file exists but is not in the memory id to location mapper
//then add it to the mapping
this.batchIdToFileMapper.Add(batchFileId, fileInfo.FullName);
}
//Check to see if the proxy has already uploaded this file to the service
return fileInfo.Exists;
}
public void UploadBatchFile(string batchFileId, byte[] batchContents,
string remotePeerId)
{
Log("UploadBatchFile: {0}", this.sqlProvider.Connection.ConnectionString);
try
{
if (HasUploadedBatchFile(batchFileId, remotePeerId))
{
//Service has already received this file. So dont save it again.
return;
}
//Service hasnt seen the file yet so save it.
String localFileLocation = Path.Combine(
sessionBatchingDirectory.FullName, batchFileId);
FileStream fs = new FileStream(localFileLocation,
FileMode.Create, FileAccess.Write);
using (fs)
{
fs.Write(batchContents, 0, batchContents.Length);
}
//Save this Id to file location mapping in the mapper object
this.batchIdToFileMapper[batchFileId] = localFileLocation;
}
catch (Exception e)
{
throw new FaultException(
new WebSyncFaultException("Unable to save batch file.", e));
}
}
public byte[] DownloadBatchFile(string batchFileId)
{
try
{
Log("DownloadBatchFile: {0}",
this.sqlProvider.Connection.ConnectionString);
Stream localFileStream = null;
string localBatchFileName = null;
if (!this.batchIdToFileMapper.TryGetValue(batchFileId,
out localBatchFileName))
{
throw new FaultException(
new WebSyncFaultException("Unable to retrieve batch file for id."
+ batchFileId, null));
}
using (localFileStream = new FileStream(localBatchFileName,
FileMode.Open, FileAccess.Read))
{
byte[] contents = new byte[localFileStream.Length];
localFileStream.Read(contents, 0, contents.Length);
return contents;
}
}
catch (Exception e)
{
throw new FaultException(
new WebSyncFaultException("Unable to read batch file for id " +
batchFileId, e));
}
}
public void EndSession()
{
Log("EndSession: {0}", this.sqlProvider.Connection.ConnectionString);
Log("*****************************************************************");
Log("******************** End Sync Session ***************************");
Log("*****************************************************************");
this.sqlProvider.EndSession(null);
Log("");
}
public void Cleanup()
{
this.sqlProvider = null;
//Delete all file in the temp session directory
if (sessionBatchingDirectory != null)
{
sessionBatchingDirectory.Refresh();
if (sessionBatchingDirectory.Exists)
{
try
{
sessionBatchingDirectory.Delete(true);
}
catch
{
//Ignore
}
}
}
}
protected void Log(string p, params object[] paramArgs)
{
Console.WriteLine(p, paramArgs);
}
private void CheckAndCreateBatchingDirectory(string remotePeerId)
{
//Check to see if we have temp directory for this session.
if (sessionBatchingDirectory == null)
{
//Generate a unique Id for the directory
//We use the peer id of the store enumerating the changes so that the
//local temp directory is same for a given source
//across sync sessions. This enables us to restart a failed sync by not
//downloading already received files.
string sessionDir = Path.Combine(this.sqlProvider.BatchingDirectory,
"WebSync_" + remotePeerId);
sessionBatchingDirectory = new DirectoryInfo(sessionDir);
//Create the directory if it doesnt exist.
if (!sessionBatchingDirectory.Exists)
{
sessionBatchingDirectory.Create();
}
}
}
}
}
```
Listing 4: SqlWebSyncService.Svc.cs
We are not going to explain the above code in detail since its provided in the Microsoft samples. You can build the project to test that all the code complies correctly without any errors. We need to deploy the service into a virtual directory before we start its configuration. You can either use IIS Express or choose to deploy the service into a virtual directory. We choose to have the service deployed in its own virtual directory, right click the project name in solution explorer and select **Properties** from the context menu. In the properties screen choose Web and then remove **Use IIS Express** checkbox and click on **Create Virtual Directory** button to create new Virtual Directory and then click on **Save** to save the settings.. See figure 11 for the properties screen settings.
Figure 11: Create Virtual Directory
Now click on Build item
We now need to add the web service configuration to the web.config file, open the web.config file from solution explorer and add the following section as shown in listing 5 to configure the web service.
```
```
Listing 5: system.serviceModel settings to be added in web.config file
The above config section configures the end points for the service. You will have to make some updates to point to the right URL of the service once you deploy on the server. One important point to note here is that for enabling Session support in the web service we have to enable **reliableSession** WCF module. This completes the changes to the wcf service. Its now ready to synchronize against any client providers, as you can see from the above codebase, the WCF service is pretty generic and can be used in any kind of synchronization project.
One important step is to make sure that the codebase is compiled in either x86 or x64 based on the platform you plan to deploy this service. We have described this step below, but in case you are just copying the web services codebase ensure to make it compile specific to your deployment platform.
### 3) WPF Client
We now add the last part of this project, right click the solution name in solution explorer and select **Add** –> **Add New Project** from the context menu. Select** WPF Application** from the**Add New Project** dialog. Provide the project name as **SyncClient** and click**OK** to create the new project. Again in the solution explorer right click **References** and select **Add Reference** from the context menu. In the **Add Reference** dialog select**Solution** – > **Projects** and select the**ServiceInterface** checkbox to add reference to the project. Then select **Framework** under **Assemblies**, to list all the framework assemblies. Then check assemblies **System.ServiceModel**, **System.ServiceModel.Channels** and **System.Runtime.Serialization** to select them.
Now select Browse on the **Add Reference** dialog, navigate to the path where the Sync Framework is installed to reference**Microsoft.Synchronization.dll,****Microsoft.Synchronization.Data.dll **and **Microsoft.Synchronization.Data.SqlCE.dll**. On a 64 bit machine these assemblies can be found in the **C:\Program Files (x86)\Microsoft SDKs\Microsoft Sync Framework\2.1\Runtime\x64** and**C:\Program Files (x86)\Microsoft SDKs\Microsoft Sync Framework\2.1\Runtime\ADO.NET\V3.1\x64** folders respectively. If you go one level up you would find the x86 folder containing the 32-bit version of the assemblies. If you are developing on a 32 bit machine then look within the **C:\Program Files\Microsoft SDKs\Microsoft Sync Framework\2.1\Runtime\x86** and **C:\Program Files\Microsoft SDKs\Microsoft Sync Framework\2.1\Runtime\ADO.NET\V3.1\x86** folders to find these assemblies. We also need to reference SQL CE assembly**System.Data.SqlServerCe.dll**, click on **Browse** again and navigate to the **C:\Program Files\Microsoft SQL Server Compact Edition\v3.5\Desktop** folder to select the assembly. This assembly is also platform specific so ensure that you select the right version based on the client platform. Click**OK** to reference the assemblies in your project.
Let’s start adding code to our WPF project, right-click the SyncClient project in solution explorer and select Add – > Class from the context menu. Give the class name as RelationalProviderProxy.cs and click ADD to add the class to the project. Copy paste the code as shown below in listing 6 for the RelationalProviderProxy class.
```
using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Synchronization;
using System.ServiceModel;
using System.ServiceModel.Channels;
using Microsoft.Synchronization.Data;
using System.IO;
using ServiceInterface;
namespace SyncClient
{
public class RelationalProviderProxy : KnowledgeSyncProvider, IDisposable
{
protected SyncIdFormatGroup idFormatGroup;
protected string scopeName;
protected DirectoryInfo localBatchingDirectory;
protected bool disposed = false;
ISyncService proxy;
protected string serviceURL;
private string batchingDirectory =
Environment.ExpandEnvironmentVariables("%TEMP%");
public string BatchingDirectory
{
get { return batchingDirectory; }
set
{
if (string.IsNullOrEmpty(value))
{
throw new
ArgumentException("value cannot be null or empty");
}
try
{
Uri uri = new Uri(value);
if (!uri.IsFile || uri.IsUnc)
{
throw new
ArgumentException("value must be a local directory");
}
batchingDirectory = value;
}
catch (Exception e)
{
throw new ArgumentException("Invalid batching directory.", e);
}
}
}
public RelationalProviderProxy(string scopeName, string serviceURL)
{
this.scopeName = scopeName;
this.serviceURL = serviceURL;
this.CreateProxy();
this.proxy.Initialize(scopeName);
}
public override void BeginSession(SyncProviderPosition position,
SyncSessionContext syncSessionContext)
{
this.proxy.BeginSession(position);
}
public override void EndSession(SyncSessionContext syncSessionContext)
{
proxy.EndSession();
if (this.localBatchingDirectory != null)
{
this.localBatchingDirectory.Refresh();
if (this.localBatchingDirectory.Exists)
{
//Cleanup batching releated files from this session
this.localBatchingDirectory.Delete(true);
}
}
}
public override ChangeBatch GetChangeBatch(uint batchSize,
SyncKnowledge destinationKnowledge, out object changeDataRetriever)
{
GetChangesParameters changesWrapper = proxy.GetChanges(batchSize,
destinationKnowledge);
//Retrieve the ChangeDataRetriever and the ChangeBatch
changeDataRetriever = changesWrapper.DataRetriever;
DbSyncContext context = changeDataRetriever as DbSyncContext;
//Check to see if the data is batched.
if (context != null && context.IsDataBatched)
{
if (this.localBatchingDirectory == null)
{
//Retrieve the remote peer id from the
//MadeWithKnowledge.ReplicaId. MadeWithKnowledge is the local
//knowledge of the peer that is enumerating the changes.
string remotePeerId = context.MadeWithKnowledge.ReplicaId.ToString();
//Generate a unique Id for the directory.
//We use the peer id of the store enumerating the changes so
//that the local temp directory is same for a given source
//across sync sessions. This enables us to restart a failed sync
//by not downloading already received files.
string sessionDir =
Path.Combine(this.batchingDirectory, "WebSync_" + remotePeerId);
this.localBatchingDirectory = new DirectoryInfo(sessionDir);
//Create the directory if it doesnt exist.
if (!this.localBatchingDirectory.Exists)
{
this.localBatchingDirectory.Create();
}
}
string localFileName = Path.Combine(this.localBatchingDirectory.FullName,
context.BatchFileName);
FileInfo localFileInfo = new FileInfo(localFileName);
//Download the file only if doesnt exist
if (!localFileInfo.Exists)
{
byte[] remoteFileContents =
this.proxy.DownloadBatchFile(context.BatchFileName);
using (FileStream localFileStream = new FileStream(localFileName,
FileMode.Create, FileAccess.Write))
{
localFileStream.Write(remoteFileContents, 0, remoteFileContents.Length);
}
}
//Set DbSyncContext.Batchfile name to the new local file name
context.BatchFileName = localFileName;
}
return changesWrapper.ChangeBatch;
}
public override FullEnumerationChangeBatch
GetFullEnumerationChangeBatch(uint batchSize, SyncId lowerEnumerationBound,
SyncKnowledge knowledgeForDataRetrieval, out object changeDataRetriever)
{
throw new NotImplementedException();
}
public override void GetSyncBatchParameters(out uint batchSize,
out SyncKnowledge knowledge)
{
SyncBatchParameters wrapper = proxy.GetKnowledge();
batchSize = wrapper.BatchSize;
knowledge = wrapper.DestinationKnowledge;
}
public override SyncIdFormatGroup IdFormats
{
get
{
if (idFormatGroup == null)
{
idFormatGroup = new SyncIdFormatGroup();
//
//1 byte change unit id (Harmonica default before flexible ids)
//
idFormatGroup.ChangeUnitIdFormat.IsVariableLength = false;
idFormatGroup.ChangeUnitIdFormat.Length = 1;
//
// Guid replica id
//
idFormatGroup.ReplicaIdFormat.IsVariableLength = false;
idFormatGroup.ReplicaIdFormat.Length = 16;
//
// Sync global id for item ids
//
idFormatGroup.ItemIdFormat.IsVariableLength = true;
idFormatGroup.ItemIdFormat.Length = 10 * 1024;
}
return idFormatGroup;
}
}
public override void ProcessChangeBatch(ConflictResolutionPolicy resolutionPolicy,
ChangeBatch sourceChanges, object changeDataRetriever, SyncCallbacks syncCallbacks,
SyncSessionStatistics sessionStatistics)
{
DbSyncContext context = changeDataRetriever as DbSyncContext;
if (context != null && context.IsDataBatched)
{
string fileName = new FileInfo(context.BatchFileName).Name;
//Retrieve the remote peer id from the MadeWithKnowledge.ReplicaId.
//MadeWithKnowledge is the local knowledge of the peer
//that is enumerating the changes.
string peerId = context.MadeWithKnowledge.ReplicaId.ToString();
//Check to see if service already has this file
if (!this.proxy.HasUploadedBatchFile(fileName, peerId))
{
//Upload this file to remote service
FileStream stream = new FileStream(context.BatchFileName, FileMode.Open,
FileAccess.Read);
byte[] contents = new byte[stream.Length];
using (stream)
{
stream.Read(contents, 0, contents.Length);
}
this.proxy.UploadBatchFile(fileName, contents, peerId);
}
context.BatchFileName = fileName;
}
SyncSessionStatistics stats = this.proxy.ApplyChanges(resolutionPolicy,
sourceChanges, changeDataRetriever);
sessionStatistics.ChangesApplied += stats.ChangesApplied;
sessionStatistics.ChangesFailed += stats.ChangesFailed;
}
public override void ProcessFullEnumerationChangeBatch(
ConflictResolutionPolicy resolutionPolicy, FullEnumerationChangeBatch sourceChanges,
object changeDataRetriever, SyncCallbacks syncCallbacks,
SyncSessionStatistics sessionStatistics)
{
throw new NotImplementedException();
}
protected void CreateProxy()
{
WSHttpBinding binding = new WSHttpBinding();
//BasicHttpBinding binding = new BasicHttpBinding();
binding.ReaderQuotas.MaxArrayLength = 10485760;
binding.MaxReceivedMessageSize = 10485760;
binding.Security.Mode = SecurityMode.None;
binding.ReliableSession.Enabled = true;
ChannelFactory factory =
new ChannelFactory(binding, new EndpointAddress(serviceURL));
this.proxy = factory.CreateChannel();
}
public DbSyncScopeDescription GetScopeDescription()
{
return this.proxy.GetScopeDescription();
}
~RelationalProviderProxy()
{
Dispose(false);
}
public virtual void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (!this.disposed)
{
if (disposing)
{
if (proxy != null)
{
CloseProxy();
}
}
disposed = true;
}
}
///
/// Clean up and close proxy.
///
public virtual void CloseProxy()
{
if (proxy != null)
{
proxy.Cleanup();
ICommunicationObject channel = proxy as ICommunicationObject;
if (channel != null)
{
try
{
channel.Close();
}
catch (TimeoutException)
{
channel.Abort();
}
catch (CommunicationException)
{
channel.Abort();
}
}
proxy = null;
}
}
}
}
```
Listing 6: RelationalProviderProxy.cs
The code for the **RelationalProviderProxy** class is also from the Microsoft sample, it provides the client side proxy for invoking the WCF web service. Since the WCF web service uses sessions, we can’t rely on Visual Studio to auto create a proxy class for us. Instead we define our own client proxy class which will ultimately call the wcf service and perform synchronization.
Next we need to create a SQL CE 3.5 database for the client application. We use the SQL Server Compact Toolbox, Visual Studio plug-in to create the SqlCE database. In visual studio got to **View** menu –>**Other Windows** –> **SQL Server Compact Toolbox** to bring up the toolbox window. Right click on **SQL Server Compact Data Connections** and select **Add SQL Server Compact 3.5 Connection** as shown in figure 12 below.
Figure 12: Add SQL Server Compact 3.5 Connection
On the **Add SQL Server Compact 3.5** dialog click on **Create** and provide the path to the project to store the SQL CE database in the project folder and the database file name as **ClientDB**. We have provided the path **C:\SystenicsBlog\SyncSample\SyncSample\SyncClient\ClientDB.sdf** to create the database. You can optionally choose to provide a password for your CE database. Click **OK** to create the database, you will also see the database listed in the **SQL Server Compact Toolbox** window. You should follow these steps every time you wish to reset the client database, creating a new one so that it can synchronize with the server and fetch fresh schema.
We need to add the path to the client database and the Sync Web Service in the settings file so that we do not hardcode them. In solution explorer expand the **Properties** section under the **SyncClient** project and double click on **Settings.settings** item to open it. Add a new setting named **DBConnection**, **Type** as **Connection String**, **Scope** as **Application** and **Value** as **Data Source=C:\SystenicsBlog\SyncSample\SyncSample\SyncClient\ClientDB.sdf**. Add another setting named **ServiceUrl**, **Type** as **string**, **Scope** as **Application** and **Value** as **http://localhost/SyncService/SqlWebSyncService.svc**. Save the settings, these need to be updated at time of client deployment to point to the folder where the SQL CE database exists and the URL where the WCF service has been hosted.
Figure 13: Settings.settings file
Once the settings are configured, right click the solution explorer and choose **Add** – > **Class** from the context menu. Provide the class name as **SynchronizationHelper.cs** and click **Add** to add a new class to the project. Copy paste the code from listing 7 below to populate the code for the **SynchronizationHelper** class.
```
using System;
using System.Collections.Generic;
using System.Text;
using System.Data.SqlClient;
using System.Data;
using System.Data.SqlServerCe;
using System.IO;
using Microsoft.Synchronization;
using Microsoft.Synchronization.Data.SqlServerCe;
using Microsoft.Synchronization.Data;
using System.Threading;
namespace SyncClient
{
class SyncResults
{
private SyncOperationStatistics stats;
public SyncOperationStatistics Stats
{
get { return stats; }
set { stats = value; }
}
private string message;
public string Message
{
get { return message; }
set { message = value; }
}
public SyncResults(string message,
SyncOperationStatistics stats)
{
this.message = message;
this.stats = stats;
}
}
class SynchronizationHelper
{
public void SynchronizeAsync(
System.ComponentModel.BackgroundWorker worker,
System.ComponentModel.DoWorkEventArgs e)
{
SyncResults results;
results = SynchronizeProductsEmployees();
worker.ReportProgress(0, results);
results = SynchronizeEmployeeSales();
worker.ReportProgress(0, results);
}
public SyncResults SynchronizeProductsEmployees()
{
SyncResults results = null;
// Create the SQL CE Sync Provider for the given scope name
SqlCeSyncProvider localProvider =
ConfigureCESyncProvider("ProductsEmployees");
// Create the remote provider for the given scope name
RelationalProviderProxy destinationProxy =
new RelationalProviderProxy("ProductsEmployees",
Properties.Settings.Default.ServiceUrl);
// Synchronize and collect results
results = new SyncResults("ProductsEmployees",
SynchronizeProviders(localProvider, destinationProxy,
SyncDirectionOrder.Download));
destinationProxy.Dispose();
localProvider.Dispose();
return results;
}
public SyncResults SynchronizeEmployeeSales()
{
SyncResults results = null;
// Create the SQL CE Sync Provider for the given scope name
SqlCeSyncProvider localProvider =
ConfigureCESyncProvider("EmployeeSales");
// Create the remote provider for the given scope name
RelationalProviderProxy destinationProxy =
new RelationalProviderProxy("EmployeeSales",
Properties.Settings.Default.ServiceUrl);
// Synchronize and collect results
results = new SyncResults("EmployeeSales",
SynchronizeProviders(localProvider,
destinationProxy, SyncDirectionOrder.UploadAndDownload));
destinationProxy.Dispose();
localProvider.Dispose();
return results;
}
///
/// Utility function that configures a CE provider
///
///
///
private SqlCeSyncProvider ConfigureCESyncProvider(string scopeName)
{
SqlCeConnection sqlCeConnection = new SqlCeConnection(
Properties.Settings.Default.DbConnection);
SqlCeSyncProvider provider = new SqlCeSyncProvider();
//Set the scope name
provider.ScopeName = scopeName;
//Set the connection.
provider.Connection = sqlCeConnection;
//Thats it. We are done configuring the CE provider.
return provider;
}
///
/// Utility function that will create a SyncOrchestrator and
/// synchronize the two passed in providers
///
/// Local store provider
/// Remote store provider
///
private SyncOperationStatistics SynchronizeProviders(
KnowledgeSyncProvider localProvider, KnowledgeSyncProvider remoteProvider,
SyncDirectionOrder direction)
{
SyncOrchestrator orchestrator = new SyncOrchestrator();
orchestrator.LocalProvider = localProvider;
orchestrator.RemoteProvider = remoteProvider;
orchestrator.Direction = direction;
//Check to see if any provider is a SqlCe provider and if it needs schema
CheckIfProviderNeedsSchema(localProvider as SqlCeSyncProvider);
SyncOperationStatistics stats = orchestrator.Synchronize();
return stats;
}
///
/// Check to see if the passed in CE provider needs Schema from server
///
///
private void CheckIfProviderNeedsSchema(SqlCeSyncProvider localProvider)
{
if (localProvider != null)
{
SqlCeConnection ceConn = (SqlCeConnection)localProvider.Connection;
SqlCeSyncScopeProvisioning ceConfig =
new SqlCeSyncScopeProvisioning(ceConn);
string scopeName = localProvider.ScopeName;
//if the scope does not exist in this store
if (!ceConfig.ScopeExists(scopeName))
{
//create a reference to the server proxy
RelationalProviderProxy serverProxy =
new RelationalProviderProxy(scopeName,
Properties.Settings.Default.ServiceUrl);
//retrieve the scope description from the server
DbSyncScopeDescription scopeDesc = serverProxy.GetScopeDescription();
serverProxy.Dispose();
//use scope description from server to intitialize the client
ceConfig.PopulateFromScopeDescription(scopeDesc);
ceConfig.Apply();
}
}
}
}
}
```
Listing 7: SynchronizationHelper class
The code for listing 7 is also from the Microsoft sample, but we have modified it to just have synchronization code for syncing our CE database with the remote database calling the web service. There are two methods defined **SynchronizeProductsEmployees** and **SynchronizeEmployeeSales** which are used to synchronize our two different scopes that we defined at the start of the blog. The first method only downloads the changes from the server while the second one uploads as well as downloads data between both databases. These methods are invoked from the **BackgroundWorker** thread defined in the **MainWindow** class listed below so that synchronization is performed without blocking the UI thread making the WPF application responsive while synchronization is in progress. The Main WPF app is a simple application with two buttons and a richtextbox control, since the goal here is not to demo WPF capabilities but to showcase synchronization. The **Synchronize** button will synchronize the client SQL CE database with the SQL Server database, bringing down botch schema and data from the server as well as update the main server with any changes made in the **EmployeeSales** table. The **Insert Record** button inserts a new record in **EmployeeSales** table in the local SQL CE database (Please ensure that you have first clicked on **Synchronize** before inserting data else error will be thrown for inserting data into non existent table). After inserting records into the local SQL CE database you can click the **Synchronize** button again to see the newly added record being synchronized with the server, you can then manually check the MS SQL database to find the newly added record. If you make data changes to the MS SQL database and synchronize, you should find the data updated in the SQL CE database locally. This makes the synchronize process pretty pain free once you have it all setup correctly. The listing below show the code for MainWindows.xaml.cs file.
```
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.ComponentModel;
using Microsoft.Synchronization;
using System.Data.SqlServerCe;
namespace SyncClient
{
///
/// Interaction logic for MainWindow.xaml
///
public partial class MainWindow : Window
{
// Create a BackgroundWorker object to synchronize without blocking
// the UI thread
private System.ComponentModel.BackgroundWorker backgroundWorker1;
public MainWindow()
{
InitializeComponent();
this.backgroundWorker1 =
new System.ComponentModel.BackgroundWorker();
this.backgroundWorker1.WorkerReportsProgress = true;
// Register the various BackgroundWorker events
this.backgroundWorker1.DoWork
+= new System.ComponentModel.DoWorkEventHandler(
this.backgroundWorker1_DoWork);
this.backgroundWorker1.ProgressChanged
+= new System.ComponentModel.ProgressChangedEventHandler(
this.backgroundWorker1_ProgressChanged);
this.backgroundWorker1.RunWorkerCompleted
+= new System.ComponentModel.RunWorkerCompletedEventHandler(
this.backgroundWorker1_RunWorkerCompleted);
}
private void btnSync_Click(object sender, RoutedEventArgs e)
{
// Check if sync is already in progress
if (!backgroundWorker1.IsBusy)
{
msg.AppendText(
"Starting Data Synchronization Process...\r\n Please wait till the process compeletes.\r\n");
Application.Current.MainWindow.Cursor = Cursors.Wait;
SynchronizationHelper syncHelper = new SynchronizationHelper();
// Start synchronization
backgroundWorker1.RunWorkerAsync(syncHelper);
}
}
private void btnInsert_Click(object sender, RoutedEventArgs e)
{
// Insert a test value in local CE database
using (SqlCeConnection con =
new SqlCeConnection(Properties.Settings.Default.DbConnection))
{
SqlCeCommand cmd =
new SqlCeCommand("INSERT INTO [EmployeeSales] ([Id],[ProductId],[EmployeeId],[Unit],[Date])"
+" Values (@Id,@ProductId,@EmployeeId,@Unit,@Date)");
cmd.Parameters.Add("@Id", Guid.NewGuid());
//Hardcoded ProductId
cmd.Parameters.Add("@ProductId", "F4FC70E6-5DC7-4982-95F0-32E806E21D84");
//Hardcoded EmployeeId
cmd.Parameters.Add("@EmployeeId", "0A5F6AD1-F345-48D4-B6D6-0850A7C930C9");
// Hardcoded Units
cmd.Parameters.Add("@Unit", 10);
cmd.Parameters.Add("@Date", DateTime.Now);
cmd.Connection = con;
try
{
con.Open();
cmd.ExecuteNonQuery();
con.Close();
}
catch (Exception ed)
{
MessageBox.Show("Error Occurred while inserting.\r\n" + ed.ToString());
}
}
}
// Method to start syncthonization in background
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
System.ComponentModel.BackgroundWorker worker;
worker = (System.ComponentModel.BackgroundWorker)sender;
SynchronizationHelper syncHelper = (SynchronizationHelper)e.Argument;
syncHelper.SynchronizeAsync(worker, e);
}
//Method to report synchronization progress
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
SyncResults results = (SyncResults)e.UserState;
if (results != null)
{
DisplayStats(results);
}
}
//Method runs when synchtonization compeletes
private void backgroundWorker1_RunWorkerCompleted(
object sender, RunWorkerCompletedEventArgs e)
{
Application.Current.MainWindow.Cursor = Cursors.Arrow;
if (e.Error != null)
{
msg.AppendText(
"An Error has occurred. Please try synchronization later.\r\nThe error:" + e.Error.Message);
MessageBox.Show("Error: " + e.Error.Message);
}
else
{
msg.AppendText("Synchronization Finished Successfully\r\n");
MessageBox.Show("Finished Synchronization");
}
}
// Method to format the SyncResults for display
private void DisplayStats(SyncResults results)
{
TimeSpan diff =
results.Stats.SyncEndTime.Subtract(results.Stats.SyncStartTime);
msg.AppendText(
string.Format(
"{4}: - Total Time To Synchronize = {0}:{1}:{2}:{3}\r\nTotal Records Uploaded: {5} Total Records Downloaded: {6}\r\n",
diff.Hours, diff.Minutes, diff.Seconds,
diff.Milliseconds, results.Message,
results.Stats.UploadChangesTotal,
results.Stats.DownloadChangesTotal));
}
}
}
```
Listing 8 – MainWindows.xaml.cs
Update the c# code as well as XAML code for the default **MainWindow** class copy pasting code from listing 8 and 9. In the above listing you can see that we have used the **BackgroundWorker** object to invoke the WCF services in the background, as there are updates from the WCF server we update the richtextbox with the synchronization results. Listing 9 below shows the XAML for **MainWindow**.
```
```
Listing 9 – MainWindow.XAML
This completes the project source code. You can save all the file build and test your application. In case there are issues in synchronization then the first step would be to ensure that your build is platform specific i.e. x64 or x86 based on the platform of your test or deployment machine. You can create a new build configuration for x64 in visual studio by going to **Build** – > **Configuration Manager** menu. In the **Configuration Manager**, expand the **Active Solution Platforms** and select **** provide the name as **x64** or **x86** as required and click **OK** and then recompile your build to ensure it gets compiled platform specific.
## Conclusion
In this blog post we looked at building a WCF based web service to support synchronization between MS SQL and SQL CE databases using MS Sync Framework v2.1 over the internet. The codebase is generic enough to ensure that you can reuse it in your projects. We also looked at the various issues related to building such and application. I hope this blog post helps simplify your synchronization issues.
### Source Code Download
[Click here](https://www.systenics.com/media/6260/20130401-SyncSample.zip) to download the source code for this project.
## Related pages on Systenics
- [AI-powered listing description generation](https://www.systenics.com/auctionworx/ai-enhanced-listings-description-generation/)
- [Industry solutions](https://www.systenics.com/solutions/)
## Need help implementing this for your business?
Our team helps plan, build, and scale marketplace and auction workflows. Explore [industry solutions](https://www.systenics.com/solutions/), [platform products](https://www.systenics.com/products/), and [custom development services](https://www.systenics.com/auctionworx/development-and-customization/) tailored to your goals.
[Book a quick consultation](https://outlook.office.com/bookwithme/user/231015685f21467da5ef6e3eb8b50240@systenics.com/meetingtype/hbYq2z1Hj0C2e7DuwBqdnw2?anonymous&ep=mcard).
---
## Page: Steps to Make an ASP.NET Core 8 Web App Production Ready
URL: https://www.systenics.com/blogs/steps-to-make-an-aspnet-core-8-web-app-production-ready/
Description: In this blog post, we
# Steps to Make an ASP.NET Core 8 Web App Production Ready
**by:** Saurabh Nandu **in:** [Programming](https://www.systenics.com/blogs/category/programming/) **tags:**[*ASP.NET Core*](https://www.systenics.com/blogs/tag/aspnet-core/)
## Introduction
In the ever-evolving world of web development, ensuring your ASP.NET Core 8 application is production-ready is crucial for delivering a seamless user experience and maintaining a robust, secure, and scalable application. In this blog post, we'll explore the essential steps to take your ASP.NET Core 8 web app from development to a production-ready state.
If you are applying these standards to an auction marketplace, our[AuctionWorx development and customization services](https://www.systenics.com/auctionworx/development-and-customization/) can help implement production-grade architecture and deployment practices.
## Key Considerations for Production Readiness
Before delving into specific steps, it's crucial to understand the core principles that underpin a production-ready application:
- **Performance:** Optimize application response times, resource utilization, and scalability.
- **Security:** Protect against vulnerabilities, unauthorized access, and data breaches.
- **Reliability:** Ensure high availability, fault tolerance, and error handling.
- **Scalability:** Design the application to handle increasing workloads efficiently.
- **Monitoring:** Implement comprehensive monitoring and logging to track performance, errors, and security incidents.
### Step-by-Step Guide to Production Readiness
#### 1. Performance Optimization
Performance is a critical aspect of a production-ready web application. To optimize your ASP.NET Core 8 app's performance, consider the following steps:
- **Minification and Bundling:** Use tools like Webpack or Gulp to combine and minify JavaScript and CSS files.
- **Response Compression:**
Enable Gzip or Brotli compression in your web server to reduce response sizes.
- ASP.NET Core provides built-in support for response compression.
- **Caching:**
Implement output caching, browser caching, and distributed caching (e.g., Redis) for static content and frequently accessed data.
- **Asynchronous Programming:**
Utilize asynchronous patterns (async/await) to improve responsiveness and prevent thread blocking.
- **Profiling and Optimization:**
Identify performance bottlenecks using profilers like dotNET Core Profiler.
- Optimize database queries, memory usage, and CPU-intensive operations.
#### 2. Security Best Practices
Security is of paramount importance when it comes to web applications. To ensure your ASP.NET Core 8 app is production-ready, you should implement the following secure coding practices:
- **Authentication and Authorization:** Implement robust authentication mechanisms (e.g., OAuth, OpenID Connect) and authorization policies.
- Protect sensitive data with encryption.
- **Input Validation and Sanitization:**
Validate and sanitize user input to prevent injection attacks (e.g., SQL injection, XSS).
- **Dependency Management:**
Keep dependencies up-to-date with security patches.
- Use dependency management tools like NuGet to manage package versions.
- **Secure Communication:**
Enforce HTTPS with strong TLS/SSL certificates.
- Protect against common vulnerabilities like cross-site scripting (XSS), cross-site request forgery (CSRF), and clickjacking.
#### 3. Error Handling and Logging
Effective logging and monitoring are essential for a production-ready web application. They help you identify and troubleshoot issues, track application behavior, and ensure the overall health of your system.
- **Centralized Logging:** Use a logging framework (e.g., Serilog, NLog) to capture detailed logs.
- Send logs to a centralized logging platform for analysis and troubleshooting.
- **Custom Error Pages:**
Provide informative and user-friendly error pages.
- Avoid revealing sensitive information in error messages.
- **Error Monitoring and Alerts:**
Set up monitoring to detect and alert on errors and exceptions.
- Implement error tracking tools to gather detailed error information.
#### 4. Deployment and Infrastructure
To ensure your ASP.NET Core 8 web app is production-ready, you should follow best practices for deployment and hosting:
- **Continuous Integration and Continuous Deployment (CI/CD):** Automate build, testing, and deployment processes using tools like Azure DevOps, Jenkins, or GitHub Actions.
- **Infrastructure as Code (IaC):**
Use tools like Terraform or Azure Resource Manager to manage infrastructure consistently.
- **Environment Configuration:**
Use configuration management tools (e.g., App Configuration, Environment Variables) to manage environment-specific settings.
- **Load Balancing and High Availability:**
Implement load balancing to distribute traffic across multiple instances.
- Use techniques like failover and redundancy to ensure high availability.
#### 5. Monitoring and Optimization
Monitoring production apps is critical to detect issues before they get reported by the end users. Tracking server metrics and exceptions allow us to better understand and fix issues occurring in production.
- **Performance Metrics:** Monitor response times, CPU usage, memory consumption, and network traffic.
- Use application performance monitoring (APM) tools to gain insights.
- **Error Monitoring:**
Track error rates, exception types, and error frequency.
- **Security Monitoring:**
Detect and respond to security threats and vulnerabilities.
- **Continuous Improvement:**
Analyze performance and security data to identify optimization opportunities.
### Conclusion
Making an ASP.NET Core 8 web app production-ready involves a comprehensive approach that encompasses performance, security, reliability, scalability, and monitoring. By following the steps outlined in this blog post and adhering to best practices, you can significantly enhance your application's readiness for a production environment.
At Systenics, our superhero team has been trained to ensure we take these steps for every production application to ensure the best secure and scalable solution you can get.
## Related pages on Systenics
- [AuctionWorx development and customization](https://www.systenics.com/auctionworx/development-and-customization/)
- [AuctionWorx products](https://www.systenics.com/products/)
## Need help implementing this for your business?
Our team helps plan, build, and scale marketplace and auction workflows. Explore [industry solutions](https://www.systenics.com/solutions/), [platform products](https://www.systenics.com/products/), and [custom development services](https://www.systenics.com/auctionworx/development-and-customization/) tailored to your goals.
[Book a quick consultation](https://outlook.office.com/bookwithme/user/231015685f21467da5ef6e3eb8b50240@systenics.com/meetingtype/hbYq2z1Hj0C2e7DuwBqdnw2?anonymous&ep=mcard).
---
## Page: Sign Click Once Applications with GoDaddy Code Signing Certificate and Visual Studio 2012 for deployment over Internet
URL: https://www.systenics.com/blogs/sign-click-once-applications-with-godaddy-code-signing-certificate-and-visual-studio-2012-for-deployment-over-internet/
Description: A client we recently worked for had a ClickOnce WPF application developed by some other team who could not figure out how to use the Code Signing certificate from GoDaddy with ClickOnce. Unless the ClickOnce deployment is correctly signed Windows 8 Smart Screen Filter will not let the user install the application in Windows 8. In older versions of Windows, unsigned deployments show a Unverified Publisher message and discourage the users from installing your application. This application was meant to be distributed over the internet and it meant doom for the client who had invested so much in getting the application built, but was being stopped from rollout due to this issue. We were able to resolve the issue for the client with a bumpy ride. This blog post tries to describe the process that worked for us, hopefully it will serve as a guidance to all those who are hitting against a brick wall trying to resolve this issue with very little guidance from GoDaddy documentation.
# Sign Click Once Applications with GoDaddy Code Signing Certificate and Visual Studio 2012 for deployment over Internet
**by:** Saurabh Nandu **in:** [Programming](https://www.systenics.com/blogs/category/programming/) **tags:**[*WPF*](https://www.systenics.com/blogs/tag/wpf/), [*ClickOnce*](https://www.systenics.com/blogs/tag/clickonce/)
A client we recently worked for had a ClickOnce WPF application developed by some other team who could not figure out how to use the Code Signing certificate from GoDaddy with ClickOnce. Unless the ClickOnce deployment is correctly signed Windows 8 Smart Screen Filter will not let the user install the application in Windows 8. In older versions of Windows, unsigned deployments show a Unverified Publisher message and discourage the users from installing your application. This application was meant to be distributed over the internet and it meant doom for the client who had invested so much in getting the application built, but was being stopped from rollout due to this issue. We were able to resolve the issue for the client with a bumpy ride. This blog post tries to describe the process that worked for us, hopefully it will serve as a guidance to all those who are hitting against a brick wall trying to resolve this issue with very little guidance from GoDaddy documentation.
## Importing GoDaddy Code Signing certificate on your windows machine
In order to being the certificate signing process, its important to first purchase the code signing certificate for a trusted certificate authority like GoDaddy, Verisign etc. The most important step to remember is that the machine from which you purchase the code sign certificate should be the same machine on which you have Visual Studio and development tools installed. You cannot generate a certificate from one machine and perform the code sign activity on another machine. Even though this blog post is uses GoDaddy Code Signing certificate, I am sure there would be a similar process that works for other trusted certificate authorities like Verisign, GoeTrust etc.
In case of GoDaddy, I believe they allow you to purchase credit for a certificate (which your client can perform and pay), but the actual certificate generation should be done on a machine where development tools are installed. I am not going to go through the GoDaddy purchase process, I guess lot of clients prefer to use GoDaddy certificates because they are cheap as compared to other providers. To request a code signing certificate you can refer to the support guide provided by GoDaddy – [Requesting a Code Signing Certificate](http://support.godaddy.com/help/article/4777/requesting-a-code-signing-certificate). But don't start yet! Read the next section to avoid the issues we faced.
## GoDaddy Code Signing Certificates and Internet Explorer (IE) a roadblock!
In our case, before we got to work, the client had already requested for the Code Signing certificate to be generated using IE 9 browser. That was our first hurdle since now we had to install Visual Studio Trial edition on the client's machine to build his application and sign his deployment files. We are aware that we could have use the command line tools to achieve the same, but there were other issues that compelled us to try to get the process working using Visual Studio. The next step after the certificate is requested, verified and generated is to download and install it to start with the signing process. GoDaddy provides the [Installing a Code Signing Certificate in Windows](http://support.godaddy.com/help/article/2698/installing-a-code-signing-certificate-in-windows) guide to install the certificate, but the problem begins as soon as you start the first step "To combine the private key and code signing certificate files". You can download the generated Code Signing Certificate from GoDaddy's website in .spc file format, but where is the private key *.pvk file? The guide assumes that you have it handy, but does not mention how to acquire it – so the hunt to find the *.pvk file begins! There is another GoDaddy guide, [Exporting an Installed Code Signing Certificate from Internet Explorer](http://support.godaddy.com/help/article/4782/exporting-an-installed-code-signing-certificate-from-internet-explorer) which talks about being able to export the *.pvk but the certificate is not installed in the first place to allow for export. After running around in circles, searching the forums with several people facing the same issue in trying to locate the *.pvk file we figured out that this is a dead end! Our advise would be not to use Internet Explorer to request the code signing certificate, instead use FireFox (this method was suggested by many on the GoDaddy forums, its not our original solution). Please note, don't try to get too savvy and use Chrome or Opera – [those two browsers are not supported](http://support.godaddy.com/help/article/7282/generating-a-certificate-signing-request-for-code-signing-certificates), so let's stick to using FireFox latest version to request and generate the certificate.
## Installing and Exporting Code Signing Certificate in FireFox
If you have already requested the certificate in IE, no problem. Install FireFox on the same machine which was used for the original request. Go to the GoDaddy certificates administration panel, select the Code Signing certificate you want to use and click on the Re-Key icon. This will re key the certificate for FireFox and generate an updated certificate (it does not matter if you use GoDaddy or StarField as the certificate authority which rekeying the certificate). Download the certificate in FireFox from the admin panel, it will request you to first install Trusted Certificate Authority certificate (it was already installed on our machine) – installed it if not installed. Next, it asks you to install Intermediate Authority Certificate (this too was already installed on our machine), install it if its not already installed. Lastly it asks you to install the code sign certificate in FireFox, install it as well as download the *.spc certificate file into your project folder for later usage.
Once you have the certificate installed we need to export it from FireFox and run some commands to extract the *.pvk private key file, follow the process documented in GoDaddy guide [Exporting an installed Code Signing Certificate from FireFox](http://support.godaddy.com/help/article/4783/exporting-an-installed-code-signing-certificate-from-firefox) to export the PKCS12 certificate file and save it in your projects folder.
## Generating *.pvk and *.spc file from FireFox exported PKCS12 certificate file
Once we have the PKCS12 certificate file exported from FireFox we need to run couple of commands to extract the *.pvk private key file. Follow the GoDaddy guide [Converting an Exported PFX Code Signing File to PVK and SPC Files Using Windows](http://support.godaddy.com/help/article/6034/converting-an-exported-pfx-code-signing-file-to-pvk-and-spc-files-using-windows?locale=en) even through it mentions using *.PFX file the process is the same for FireFox exported PKCS12, just modify the 1st and 3rd command to use your pkcs12 file instead for the *.pfx file mentioned. You will have to download OpenSSL files[http://slproweb.com/download/Win32OpenSSL_Light-1_0_1e.exe](http://slproweb.com/download/Win32OpenSSL_Light-1_0_1e.exe) and the supporting Visual Studio 2008 runtime [http://www.microsoft.com/downloads/details.aspx?familyid=9B2DA534-3E03-4391-8A4D-074B9F2BC1BF](http://www.microsoft.com/downloads/details.aspx?familyid=9B2DA534-3E03-4391-8A4D-074B9F2BC1BF) as mentioned in the guide. You will also have to download the [http://products.secureserver.net/forms/pvk.zip](http://products.secureserver.net/forms/pvk.zip) tool from the link provided in the guide. OpenSSL usually installs to C:\OpenSSL\bin, I suggest you copy and extract the pvk.zip file to the same folder as well as copy the firefox extracted *.PKCS12 certificate file to the same folder so that its easier for you to run the commands. Start a Visual Studio command prompt and navigate to the C:\OpenSSL\bin folder where the files have been copied and execute the 4 commands given in the GoDaddy guide.
```
openssl pkcs12 -in inf.pfx -nocerts -nodes -out outf.pem
pvk -in inf.pem -topvk -out outf.pvk
openssl pkcs12 -in inf.pfx -nokeys -out outf.pem
openssl crl2pkcs7 -nocrl -certfile inf.pem -outform DER -out outf.spc
```
Listing 1 - OpenSSL Commands – second command did not work for us
In our case even though the commands executed successfully and generated the appropriate files it kept giving "Error: 000004c0, The format of the specified password is invalid." error in the next step when we tried to install the code sign certificate pvkimpt tool. We found that the second command given by GoDaddy shown in listing 1 is not correct and you need to provide an additional **strong** parameter to the pvk tool as mentioned in this [blog post](http://www.xxeo.com/archives/2004/05/06/whipped-cream-microsoft-authenticode-pvkmprtexeerror-000004c0-and-other-delights.html). Listing 2 shows the updated right commands which worked for us.
```
openssl pkcs12 -in inf.pfx -nocerts -nodes -out outf.pem
pvk -in inf.pem -strong -out outf.pvk -topvk
openssl pkcs12 -in inf.pfx -nokeys -out outf.pem
openssl crl2pkcs7 -nocrl -certfile inf.pem -outform DER -out outf.spc
```
Listing 2 – Correct OpenSSL Commands to generate *.pvk file
Please follow the guide for explanation about the commands and which files to select. At the end of this process you would have 2 *.pem files, *.pvk and *.spc files generated in the c:\openssl\bin folder.
## Installing the Code Signing Certificate in Windows
We follow the GoDaddy guide [Installing a Code Signing Certificate in Windows](http://support.godaddy.com/help/article/2698/installing-a-code-signing-certificate-in-windows) once we have the certificate files *.pvk and *.spc generated in the previous step. PVK Digital Certificate Files Importer from [Microsoft](http://www.microsoft.com/downloads/details.aspx?FamilyID=F9992C94-B129-46BC-B240-414BDFF679A7&displaylang=EN) and extract it to the c:\openssl\bin folder since we already have our certificate files extracted there. Run the commands given in the guide at the Visual Studio command prompt to generate the *.pfx certificate file and then import it using the steps provided in the guide. Once the certificate is installed we are ready to start with the code signing process.
## Setup Code Signing in Visual Studio 2012
There is no guide provided at GoDaddy to use Visual Studio to perform Code Signing with click once. Even the Microsoft Click Once documents talk about using the command line tools and will take you around in circles. There are couple of things that need to be digitally signed in your click once deployment. Firstly, the setup.exe bootstrap file generated by Visual Studio needs to be signed, then the application and deployment manifests need to be signed and finally the application executable needs to be digitally signed. Another point to note is that when the application and deployment manifests are signed they keep a hash of every file present in the published package, is any file changes (even due to an anti virus check) its hash changes and during deployment you will get errors from Click Once. If any files change post signing you need to either publish a new build using Visual Studio (best option) or you will have manually update the manifest files using the manual mage or mageui wizard tools. In the quest to find a good source on the Code Signing process we stuck upon the blog post [Windows 8 and ClickOnce : the definitive answer](http://robindotnet.wordpress.com/2013/02/24/windows-8-and-clickonce-the-definitive-answer-2/) and [Windows 8 and ClickOnce : the definitive answer revisited](http://robindotnet.wordpress.com/2013/04/14/windows-8-and-clickonce-the-definitive-answer-revisited/) from Robin, he has very clearly described the challenges and process to get it fixed. Please refer to his blog posts to get the details of the process.
The answer for our solution lies in both the linked blog posts. We need to follow Method 3 mentioned in first blog post, so that you unload the project file and open it for editing. But you need to add the target tag for AfterComplie as shown below in Listing 3 in your project file.
```
```
Listing 3 – AfterCompile build action for Visual Studio 2012 project
Its important to note here that you need to locate the signtool.exe on your computer. It may be stored in a different location on a 32 bit and 63 bit machine. So verify the path to the tool provided in the above command. Also make sure that your *.pfx certificate which was generated in the above step is included in the root of your Visual Studio project file. In the above Listing 3 change the name of the certificate file as well as the provide the password for the certificate file. Adding this AfterCompile target we can ensure that this target is only run during publish of the application and need not be configured for all developers of the application.
We had also setup the certificate in Visual Studio **Signing** property page. Open the project **Properties** page and switch to the **Signing** tab. Select **Sign ClickOnce Manifests** and select the appropriate certificate from the certificate store. Also provide the [timestamp url from godaddy](http://support.godaddy.com/help/article/5412/what-is-your-time-stamping-server-url) as [http://tsa.starfieldtech.com](http://tsa.starfieldtech.com/).
Once you perform the above steps the you have setup code signing in Visual Studio 2012. Publish the ClickOnce application from Visual Studio, ideally you should see two crypto api dialog's showing indicating that your certificate was called for signing purposes, they are kind of indicators that your certificate has been called for signing the build.
## Verifying Code Signing with ClickOnce
The best way to verify your published build is to actually deploy it to your web server and try calling it from the browser. The signtool.exe can also be used to verify the certificate. Another way is that you can open your published build in windows explorer and right-click on the setup.exe file and select **Properties** from the context menu. You should see a Digital Signatures tab in the file properties dialog. If you check the Digital Signature tab, you should see the Code Signing certificate from GoDaddy. If there is no Digital Signatures tab that means code signing has not happened. Check the path entered in the Visual Studio project file. If the tab appears, but the certificate is different. Check if you are referencing the right certificate file in Visual Studio.
You can also navigate to the actual Applications/Version folder in your deployment and make a copy of the .exe.deploy file and rename it to .exe (I like to make a copy since I do not wish to touch the original file and change its Hash which causes deployment errors). Right-click on the .exe file and select Properties from the context menu. Here too you should be able to see your Digital Signature listed under the Digital Signature tab (you can delete the copy file after testing). The manifests although contain the digital signature within their definition and you cannot do a quick check.
If you have followed the above hints and processes correctly you should be able to deploy your click once applications on the internet without much difficulty. We'd like to thank the authors of the blogs referred in this article for guiding us in the right direction.
## Related pages on Systenics
- [AI-powered listing description generation](https://www.systenics.com/auctionworx/ai-enhanced-listings-description-generation/)
- [About Systenics](https://www.systenics.com/about-us/)
## Need help implementing this for your business?
Our team helps plan, build, and scale marketplace and auction workflows. Explore [industry solutions](https://www.systenics.com/solutions/), [platform products](https://www.systenics.com/products/), and [custom development services](https://www.systenics.com/auctionworx/development-and-customization/) tailored to your goals.
[Book a quick consultation](https://outlook.office.com/bookwithme/user/231015685f21467da5ef6e3eb8b50240@systenics.com/meetingtype/hbYq2z1Hj0C2e7DuwBqdnw2?anonymous&ep=mcard).
---
## Page: Setup Phonegap 3.4 on Windows 8 64-bit to create Android applications
URL: https://www.systenics.com/blogs/setup-phonegap-34-on-windows-8-64-bit-to-create-android-applications/
Description: This tutorial explains how to setup Phonegap 3.4 on a Windows 8 64-bit machine and use it for Android application development.
# Setup Phonegap 3.4 on Windows 8 64-bit to create Android applications
**by:** Shailesh Patel **in:** [Programming](https://www.systenics.com/blogs/category/programming/) **tags:**[*Android*](https://www.systenics.com/blogs/tag/android/), [*IOS*](https://www.systenics.com/blogs/tag/ios/), [*Phonegap*](https://www.systenics.com/blogs/tag/phonegap/)
This tutorial explains how to setup Phonegap 3.4 on a Windows 8 64-bit machine and use it for Android application development.
## Pre-requisites
Windows 8 64-bit
Node.js
Java SDK 7
Android SDK
## Phonegap Installation on Windows
1. To start with PhoneGap installation, first download Node.js installer for Windows (node-v0.10.26-x64.msi) from the link given on Install PhoneGap page.
2. Run Node.js Windows installer using "Run as administrator" option.
3. After the installation is complete open Command Prompt (Admin) and run command: npm install -g phonegap
If the install process is successful, you will see following messages:
4. Create a "hello-world" app using this command: phonegap create hello-world
5. Install JDK 7 for Windows 64-bit (jdk-7u51-windows-x64.exe).
6. Extract the file adt-bundle-windows-x86_64-20131030.zip and move the extracted folder to "C:\Program Files" folder.
7. Try to run the command "phonegap run android" and it will fail will following message:
Error: ERROR : executing command 'ant', make sure you have ant installed and added to your path.
8. Download [Apache Ant](http://ant.apache.org/bindownload.cgi) (apache-ant-1.9.3-bin.zip) and extract it to "C:\Program Files" folder.
9. Next setup the paths in System Variables for Java and Apache Ant. Open Control Panel -> System -> click on Advanced system settings link -> click on Environment Variables button.
Under System Variables section, click on New button. Add a new system variable entry as given below:
**JAVA_HOME** - C:\Program Files\Java\jdk1.7.0_51
Note: DO NOT add any semi-colon (;) at the end of above path for JDK.
Now click on Edit for "PATH" variable under System variables section. Copy the platform-tools, sdk/tools and Apache Ant path as given below:
**PATH** - ...\ManagementStudio\;C:\Program Files (x86)\Microsoft SQL Server\110\DTS\Binn\;%JAVA_HOME%\bin;C:\Program Files\nodejs\;C:\Program Files\adt-bundle-windows-x86_64-20131030\sdk\platform-tools;C:\Program Files\adt-bundle-windows-x86_64-20131030\sdk\tools;C:\Program Files\apache-ant-1.9.3\bin;
Click on OK to save the new System variables. Close Command Prompt windows and re-open it.
10. Now again run the command "phonegap run android". If an Android device is connected or if an AVD emulator exists, it will build and deploy the phonegap application.
## Related pages on Systenics
- [AuctionWorx mobile apps](https://www.systenics.com/auctionworx/mobile-apps/)
- [AI-powered listing description generation](https://www.systenics.com/auctionworx/ai-enhanced-listings-description-generation/)
- [AuctionWorx development and customization](https://www.systenics.com/auctionworx/development-and-customization/)
## Need help implementing this for your business?
Our team helps plan, build, and scale marketplace and auction workflows. Explore [industry solutions](https://www.systenics.com/solutions/), [platform products](https://www.systenics.com/products/), and [custom development services](https://www.systenics.com/auctionworx/development-and-customization/) tailored to your goals.
[Book a quick consultation](https://outlook.office.com/bookwithme/user/231015685f21467da5ef6e3eb8b50240@systenics.com/meetingtype/hbYq2z1Hj0C2e7DuwBqdnw2?anonymous&ep=mcard).
---
## Page: Setup Phonegap 3.3.0 on OS X Mavericks 10.9 to compile and run apps for iOS and Android
URL: https://www.systenics.com/blogs/setup-phonegap-330-on-os-x-mavericks-109-to-compile-and-run-apps-for-ios-and-android/
Description: This tutorial explains how to set up Phonegap 3.3.0 on OS X Mavericks 10.9 to compile and run apps for iOS and Android. One of the main reasons for using PhoneGap on OS X platform was to make sure that we can create test builds for iOS and Android devices.
# Setup Phonegap 3.3.0 on OS X Mavericks 10.9 to compile and run apps for iOS and Android
**by:** Shailesh Patel **in:** [Programming](https://www.systenics.com/blogs/category/programming/) **tags:**[*Android*](https://www.systenics.com/blogs/tag/android/), [*IOS*](https://www.systenics.com/blogs/tag/ios/), [*Phonegap*](https://www.systenics.com/blogs/tag/phonegap/)
## Introduction
One of the main reasons for using PhoneGap on OS X platform was to make sure that we can create test builds for iOS and Android devices.
## Pre-requisites
OS X Mavericks 1.9.x
Node.js
iPhone or iPad device or iOS emulator which is a part of Xcode
Android SDK
Java SDK 7
## Xcode and ADT Setup Process
1. Download and install Xcode which can later be accessed from Applications folder. We will use it to create builds for iOS.
2. Download Android SDK i.e. adt-bundle-mac-x86_64-20131030.zip and Java SDK i.e. jdk-7u51-macosx-x64.dmg. First, install JDK 7.
Once installation is complete extract the ADT bundle and move the extracted folder to Applications folder.
3. Create following folder structure to store your projects.
- Documents\workspace\Android – this one will be used to store Android projects created using ADT.
- Documents\workspace\iOS – this one will be used to store iOS projects created using Xcode.
- Documents\workspace\phonegap – this one will be used to store phonegap-based mobile applications. The Android and iOS projects will be found under [projectfoldername]\platforms folder.
4. Open Xcode from Applications folder and click on Agree for Xcode and iOS SDK license agreement. It will take some time to install additional components.
5. Create a new sample iOS application and run the project. Click on Enable if it prompts for Enable Developer Mode on this Mac. Wait for few minutes because it will invoke the iOS emulator, install and run the sample iOS application.
6. Now we need to configure ADT. Run Eclipse from Applications\[adt-bundle-folder]\sdk\eclipse folder.
7. It will prompt for installing Java SE 6 runtime which is required for Eclipse. Click on Install to continue. This process will take 10-15 minutes to complete. Once the runtime gets installed, it will start Eclipse (ADT).
8. Select the workspace folder for Android in Workspace Launcher window.
9. Click on No to disable sending usage statistics to Google.
## PhoneGap Installation on OS X Mavericks
1. To start with PhoneGap installation, first download [Node.js](http://nodejs.org/download/) for OS X (node-v0.10.26.pkg) from the link given on [Install PhoneGap](http://phonegap.com/install/) page.
2. After Node.js installation is complete, it will display the last screen with following information.
3. Run the "npm" command given on Install PhoneGap page to start the installation process. It will prompt for your root password.
$ sudo npm install -g phonegap
If it fails in first attempt then re-run the same command again.
If the installation is successful, you will see the following information on your screen.
5. Go to phonegap folder and run command $phonegap create hello-world
This command will create a new folder "hello-world" and add files which will be useful for PhoneGap-based application development.
Also, you can use this format to create a project $phonegap create [projectfoldername] [package name in reverse domain style] [projectname]
e.g. $phonegap create hello-world com.systenics.helloworld HelloWorld
You can even change this information post-create process from config.xml file stored in [projectfoldername]\www folder.
6. Now go to project folder using this command $ cd hello-world
## Build and Run for iOS
7. We will first start with build/run process for iOS. To run phonegap application on iOS run command $phonegap run ios. But, first attempt to run the build failed with following error message:
Open another Terminal and run following command to install ios-sim - $ sudo npm install -g ios-sim
After ios-sim is installed, run command $ phonegap run ios
This time it will compile and run the phonegap application on iOS emulator.
## Build and Run for Android
8. Now let's start compile and run phonegap application on Android device/emulator. Run the command $phonegap run android
It will throw an error if "ant" is not installed. To install "ant" follow the steps given below.
Run command
$ ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go/install)"
Enter the root password and click on Install when it prompts to install the xcode-select tools. The download and installation process may take 30 minutes or more.
After xcode-select is installed run $ brew doctor to see if there are any issues.
Finally run this command to install ant - $ brew install ant
Re-run the command $phonegap run android
This time you will get a new error which is given below.
Error: The command "android" failed. Make sure you have the latest Android SDK installed, and the "android" command (inside the tools/ folder) is added to your path.
To fix this issue, run command
$ touch ~/.bash_profile; open ~/.bash_profile
TextEditor opens. Add the following lines in the editor
path changed in bash profile to
export PATH=${PATH}:/Applications/adt-bundle-mac-x86_64-20131030/sdk/platform-tools:/Applications/adt-bundle-mac-x86_64-20131030/sdk/tools
$ source ~/.bash_profile
$phonegap run android
It will compile and run the phonegap application. Keep your Android device connected because it will try to install on device. To install it on Android emulator, you need to create a new Android Virtual Device using Android Virtual Device Manager from ADT Window menu.
If you get this error, then open ADT, go to Window menu and click on Android SDK Manager to install or update Android 4.4.2 (API 19).
Error: Please install Android target 19 (the Android newest SDK). Make sure you have the latest Android tools installed as well. Run "android" from your command-line to install/update any missing SDKs or tools.
If you want to install and run phonegap application on Android 2.3 or higher version, you can install the emulator using the Android SDK Manager.
## Related pages on Systenics
- [AuctionWorx mobile apps](https://www.systenics.com/auctionworx/mobile-apps/)
- [AI-powered listing description generation](https://www.systenics.com/auctionworx/ai-enhanced-listings-description-generation/)
## Need help implementing this for your business?
Our team helps plan, build, and scale marketplace and auction workflows. Explore [industry solutions](https://www.systenics.com/solutions/), [platform products](https://www.systenics.com/products/), and [custom development services](https://www.systenics.com/auctionworx/development-and-customization/) tailored to your goals.
[Book a quick consultation](https://outlook.office.com/bookwithme/user/231015685f21467da5ef6e3eb8b50240@systenics.com/meetingtype/hbYq2z1Hj0C2e7DuwBqdnw2?anonymous&ep=mcard).
---
## Page: Setup Facebook Login and Camera for Android App using PhoneGap 3.4
URL: https://www.systenics.com/blogs/setup-facebook-login-and-camera-for-android-app-using-phonegap-34/
Description: This tutorial explains the manual steps to integrate Facebook Login and add Camera plugin for Android application which is created using PhoneGap 3.4.
# Setup Facebook Login and Camera for Android App using PhoneGap 3.4
**by:** Shailesh Patel **in:** [Programming](https://www.systenics.com/blogs/category/programming/) **tags:**[*Android*](https://www.systenics.com/blogs/tag/android/), [*Phonegap*](https://www.systenics.com/blogs/tag/phonegap/)
This tutorial explains the manual steps to integrate Facebook Login and add Camera plugin for Android application which is created using PhoneGap 3.4. For Facebook plugin configuration and samples, refer [phonegap-facebook-plugin](https://github.com/phonegap/phonegap-facebook-plugin) available on GitHub.
## Pre-requisites
PhoneGap 3.x (refer this [link to setup PhoneGap on Windows](https://www.systenics.com/blogs/setup-phonegap-34-on-windows-8-64-bit-to-create-android-applications/) or this [link to setup on OS X Mavericks](https://www.systenics.com/blogs/setup-phonegap-330-on-os-x-mavericks-109-to-compile-and-run-apps-for-ios-and-android/))
Android SDK
Android device or emulator
## Manual Steps for Facebook and Camera Plugin
1. Let's start by creating a new project with name - SampleFBCamera.
Run command >phonegap create SampleFBCamera
Also, you can use the following command format
>phonegap create [projectfoldername] [package name in reverse domain style] [projectname]
You can even change this information post-create process from config.xml file stored in [projectfoldername]\www folder.
Note: For some unknown reasons, the above command format didn't work on my Windows machine hence I had to change the config.xml file manually.
2. Run command to add Camera plugin. Refer [PhoneGap Plugin APIs](http://docs.phonegap.com/en/3.4.0/cordova_plugins_pluginapis.md.html#Plugin%20APIs) page to know available plugins.
>phonegap local plugin add org.apache.cordova.camera
3. Run command >phonegap build android or >phonegap run android – to check if the application build and deploy process is working properly or not.
It did throw an error at the end.
[ReferenceError: a is not defined]
[error] Cannot set property 'is_top_level' of undefined
But, when the same command was executed again and it worked without any problem. Even >phonegap run android was able to build and deploy the application successfully on AVD emulator.
Note: I am using PhoneGap version 3.4.0-0.19.7.
4. Create a new workspace "samples" which will be used for sample applications. Open Eclipse -> File menu -> Switch Workspace -> Other… -> Workspace Launcher window opens. Create a new folder "samples", select it and click on OK button. Eclipse will close and re-open with new workspace.
5. On Package Explorer window, right click to open context menu and click on Import to import an existing Android project.
6. In this case, we are importing the SampleFBCamera application created by PhoneGap. A new window Import opens. Expand Android and select "Existing Android Code into Workspace". Click on Next button.
7. The next window allows us to import the project. Click on Browse button and select the "android" folder from phonegap/[projectfoldername]/platforms folder.
Click on Finish button. No check boxes where checked on Import Projects window.
8. Build and run the projects to see if it works or not. SampleFBCamera-CordovaLib is added as a library in SampleFBCamera. Right click on SampleFBCamera project -> expand Run As -> click on 1 Android Application. It will deploy the application on emulator or device.
9. Download [Facebook SDK](https://developers.facebook.com/resources/facebook-android-sdk-current.zip) from Facebook Developers website and extract it to "…\workspace\sdks" folder.
10. Now again use the Import project and select from existing Android Code into Workspace. This time select only Facebook SDK project.
11. You will see following messages under Console tab when FacebookSDK gets imported.
[2014-03-21 11:59:57 - FacebookSDK] Unable to resolve target 'android-8'
[2014-03-21 11:59:58 - FacebookSDK] Unable to resolve target 'android-8'
This error message indicates that FacebookSDK uses Android 2.2 (API 8). You can install it using the Android SDK Manager.
Close and open Eclipse again. Right click on FacebookSDK project and click on Properties. In Properties for FacebookSDK window, click on Android. It will show Android 4.4 as checked. Select Android 2.2 and click on OK button. Now FacebookSDK is using Android 2.2 (API 8).
12. Try to build the projects. First build CordovaLib, followed by SampleFBCamera, then FacebookSDK and finally SampleFBCamera project.
13. Now right click on SampleFBCamera > Properties > click on Android and add FacebookSDK as a Library to this project.
14. Now again try to build the project in the sequence as given in step #12.
15. Change android:minSdkVersion to 8 in Android Manifest.xml file for SampleFBCamera project.
Also add code for Facebook login activity into Android Manifest file.
16. From Package Explorer tab, expand res\xml folder and open config.xml. Add feature for Facebook.
Add access origins as given in documentation.
17. Download the [phonegap-facebook-plugin](https://github.com/phonegap/phonegap-facebook-plugin) from GitHub in ZIP format (look for Download ZIP button on right side).
Extract the zip file to workspace\sdks folder.
18. Using File Explorer, navigate to platforms\android folder and create the following nested folder structure "org\apache\cordova\facebook". Copy "ConnectPlugin.java" from phonegap-facebook-plugin-master\src\android to platforms\android\src\org\apache\cordova\facebook folder.
19. Copy two Javascript files: cdv-plugin-fb-connect.js and facebook-js-sdk.js from - …\sdks\phonegap-facebook-plugin-master\www folder to …\platforms\android\assets\www folder.
Also, copy index.html file from - ...\sdks\phonegap-facebook-plugin-master\example\Simple folder to - …\platforms\android\assets\www folder.
20. Login to your Facebook Developer account and create a new app - SampleCamera. Facebook rules do not allow use of word "FB" in Display Name field for the app. Copy the Facebook App ID to the index.html file. Look for "deviceready" event at the end of the index.html file.
21. For samples on Camera or how to use the API, refer the documentation on PhoneGap.
22. Build SampleFBCamera project and later click on Run As -> 1 Android Application to deploy it on emulator or device. The Android app will open an alert prompt with message "Device is ready! Make sure you set your app_id below this alert.". Tap on the OK button. Tap on Login button which will invoke the Facebook Login popup.
## Some Helpful Links
These are few more helpful links for the problems which I encountered while configuring camera plugin.
1. To know which plugins are installed run command > phonegap local plugin list
This one is really helpful to verify if camera plugin was included or not.
2. Add the camera permission and feature to manifest file so that the application starts displaying the permissions properly while installing the Android application. Just adding the plugin will not display permission for camera access. Refer this [link](http://stackoverflow.com/questions/21799166/phonegap-3-3-0-with-camera-plugin-permission-error) from StackOverflow. Check the screenshot in this [link](http://community.phonegap.com/nitobi/topics/camera_example_from_cordova_docs_not_working_on_android) from PhoneGap community.
Also, make sure the only one JavaScript file is accessed i.e. cordova.js (no need for phonegap.js). Refer this [link](http://stackoverflow.com/questions/19255731/phonegap-3-0-0-unable-to-instantiate-camera-plugin-object) from StackOverflow.
## Related pages on Systenics
- [AuctionWorx mobile apps](https://www.systenics.com/auctionworx/mobile-apps/)
- [AI-powered listing description generation](https://www.systenics.com/auctionworx/ai-enhanced-listings-description-generation/)
- [AuctionWorx development and customization](https://www.systenics.com/auctionworx/development-and-customization/)
## Need help implementing this for your business?
Our team helps plan, build, and scale marketplace and auction workflows. Explore [industry solutions](https://www.systenics.com/solutions/), [platform products](https://www.systenics.com/products/), and [custom development services](https://www.systenics.com/auctionworx/development-and-customization/) tailored to your goals.
[Book a quick consultation](https://outlook.office.com/bookwithme/user/231015685f21467da5ef6e3eb8b50240@systenics.com/meetingtype/hbYq2z1Hj0C2e7DuwBqdnw2?anonymous&ep=mcard).
---
## Page: Setting up Umbraco 7 in Visual Studio 2013 for MVC 4 development
URL: https://www.systenics.com/blogs/setting-up-umbraco-7-in-visual-studio-2013-for-mvc-4-development/
Description: Umbraco 7 has been released, with a refreshed administrative interface making it one of the top CMS in the market. Our earlier blog post on Setting up Umbraco 6 in Visual Studio 2012 for MVC development was found useful by many readers so its time to write and updated blog post with Umbraco 7. The Umbraco team have fully embraced ASP.NET 4.5 as well as MVC for Umbraco 7, making it far more easier for us to build MVC based web sites. In this blog post we will focus on using Visual Studio 2013 and creating a fresh Umbraco 7 website which can be built upon going further.
# Setting up Umbraco 7 in Visual Studio 2013 for MVC 4 development
**by:** Saurabh Nandu **in:** [Programming](https://www.systenics.com/blogs/category/programming/) **tags:**[*ASP.NET MVC*](https://www.systenics.com/blogs/tag/aspnet-mvc/), [*Umbraco*](https://www.systenics.com/blogs/tag/umbraco/)
[Umbraco 7 has been released](http://umbraco.com/follow-us/blog-archive/2013/11/21/umbraco-7.aspx/), with a refreshed administrative interface making it one of the top CMS in the market. Our earlier blog post on [Setting up Umbraco 6 in Visual Studio 2012 for MVC development](https://www.systenics.com/blogs/setting-up-umbraco-6-in-visual-studio-2012-for-mvc-development/) was found useful by many readers so its time to write and updated blog post with Umbraco 7. The Umbraco team have fully embraced ASP.NET 4.5 as well as MVC for Umbraco 7, making it far more easier for us to build MVC based web sites. In this blog post we will focus on using Visual Studio 2013 and creating a fresh Umbraco 7 website which can be built upon going further.
## Setting up Visual Studio 2013 project
Fire up Visual Studio 2013 and start up a new **ASP.NET Web Application** project give it a name and save it to your preferred location and click**OK** as shown in Figure 1 below. This is the new project type introduced in Visual Studio 2013, which is a starting point for all web applications.
Figure 1: Create new ASP.NET Web Application Project
Select the **Empty** template from the **New ASP.NET Project** dialog and click OK to create the project as shown in figure 2 below. This will give us a clean slate to start with our Umbraco 7 project, Umbraco 7 project is now auto configured to work with MVC so we can start with a clean slate and let the Umbraco nuget package configure everything for us.
Figure 2: Select Empty template
## Installing the Nuget Package
Start the Package Manager Console if its not running already and fire the command **PM > Install-Package UmbracoCms** as shown in figure 3 below. The Umbraco team has published the Umbraco CMS in nuget so it becomes the easiest way to get the latest codebase and get started with Umbraco. The above command will take a while to execute while every dependent package is found and installed for your project so wait patiently while the process completes.
Figure 3: Run command on Package Manager to download and install Umbraco 7 in our project.
Once all the files required are downloaded and installed, the Package Manager will ask you a question to request permission to override the web.config file as shown below in figure 4. Umbraco 7 setup has a lot of configurations defined in its web.config file so its necessary that we allow it to use its own web.config file so type **Y** at the command prompt and press enter to allow the process to continue. This process will continue until all the required files are downloaded and configured. Once the installation process completes you will be shown a readme file with information on getting started.
Figure 4: Allow nuget to override the web.config file
With these easy steps we are ready to get started with Umbraco instance installation. The manual steps that were required in Umbraco 6 to set the the project in MVC mode is no longer required and everything is automatically configured for you in Umbraco 7. You can build the project and start with the Umbraco 7 configuration process.
**Note:** In our testing we found that if we install a start kit during configuration, installation fails with a **definition not found for class HttpResponseMessage** exception. On further investigation we found that the start kit creates a **UmbContactController.cs** class file under **App_Code** folder to handle the Contact Form. This class references the **HttpResponseMessage** class, which fails because even through the **System.Net.Http** assembly containing this class is referenced in Visual Studio, code within**App_Code** is compiled during execution by the asp.net runtime which looks into the web.config file to file the reference to System.Net.Http assembly. If it does not find it there it fails and throws an exception, failing the start kit installation. So if you wish to install a start kit during configuration then open the projects web.config file in Visual Studio and add the following**assemblies** section under the **compilation** section at line number 90 as shown in listing 1 below.
```
.....
```
Listing 1: Add assemblies section to web.config file
You can build the project and hit **F5** to run it. Your browser should load up the Umbraco Installation screen as shown in figure 5 below. Follow the on screen instructions get your application configured.
Figure 5: Umbraco 7 Installation
## Installation and Configuration of Umbraco 7
The steps shown below are completely optional but still its good to know for those who are getting started with Umbraco development. In your browser click on the **Let's get started!** button as shown in figure 5 above. On the next license screen click on **Accept and Continue** to move forward. Now you are shown the **Database configuration** screen. You can select the database of your choice, I like to use SQL CE 4 during testing and development since it lightweight and easier to move around since all you need to do is copy the folder and all settings get transferred over. Figure 6 shows the SQL CE 4 selected as the database. Click **Install** to install the appropriate selected database and move to the next step.
Figure 6: Select SQL CE 4 database
After database installation is done you will see a confirmation message as shown in figure 7 below, click Continue to move ahead.
Figure 7: Continue after database installation
On the Create User screen provide the details to create the admin user. This user will have access to the Admin control panel of Umbraco and all details of the user can be changed at a later stage from within Umbraco. Click **Create User** to create the user and move ahead.
Figure 8: Create User
Once the user is created you are given the option to select a start kit. Umbraco 7 has updated the start kits to provide two basic ones, advanced features like blog, news are not present in the kits today. If you want to create your own site from scratch then its best to not use any of these start kits. Select **No Thanks I do not wish to install a start kit** image as shown in figure 9 below to setup Umbraco without using an existing starter kit. A confirmation prompt will open up asking you to confirm your select, click **OK** to proceed.
Figure 9: Select Starter Kits
The above steps will finish installation and configuration of Umbraco 7 and you will be presented with a confirmation screen as seen in figure 10 below. This completes the configuration of a blank Umbraco 7 installation. But remember since we did not chose to use a Start Kit our site will be blank and it needs content defined before you can publish or deploy the site. Its out of the scope for this blog post to define how to configure your site, please consult the [Umbraco Documentation](http://our.umbraco.org/documentation) for further advice.
Figure 10: Umbraco 7 Installation Complete
In this short blog I have tried to cover the essential steps required to configure Umbraco 7 with Visual Studio 2013. I plan to build on this configuration in my future blog posts.
## Download Sample
[Click here](https://www.systenics.com/media/SetupUmbraco7.zip) to download the sample for this blog.
## Related pages on Systenics
- [AuctionWorx development and customization](https://www.systenics.com/auctionworx/development-and-customization/)
- [About Systenics](https://www.systenics.com/about-us/)
## Need help implementing this for your business?
Our team helps plan, build, and scale marketplace and auction workflows. Explore [industry solutions](https://www.systenics.com/solutions/), [platform products](https://www.systenics.com/products/), and [custom development services](https://www.systenics.com/auctionworx/development-and-customization/) tailored to your goals.
[Book a quick consultation](https://outlook.office.com/bookwithme/user/231015685f21467da5ef6e3eb8b50240@systenics.com/meetingtype/hbYq2z1Hj0C2e7DuwBqdnw2?anonymous&ep=mcard).
---
## Page: Setting up Umbraco 6 in Visual Studio 2012 for MVC development
URL: https://www.systenics.com/blogs/setting-up-umbraco-6-in-visual-studio-2012-for-mvc-development/
Description: The starter packs provided on the Umbraco 6 default installation are good, but in case you need to build a complete new UI design as per your clients requirements then its far easier to start with a blank slate rather than try to mend an existing design to suit your requirements. If you want to move further and start developing forms etc. then its best to setup Umbraco 6 as a Visual Studio project so that you can debug your code. Umbraco provides two kinds of rendering engines for your pages, it can work in traditional Web Forms (its default engine) as well as it can user Razor with MVC. I personally find the HTML generated by MVC to be much clean, and better suited for building responsive html5 based applications. In this short blog post I am detailing the steps required to setup Umbraco 6 in Visual Studio 2012 as well as configure it to use MVC rendering engine. This blog post seeks to serve as a starting point for various other Umbraco development post that I plan to write.
# Setting up Umbraco 6 in Visual Studio 2012 for MVC development
**by:** Saurabh Nandu **in:** [Programming](https://www.systenics.com/blogs/category/programming/) **tags:**[*ASP.NET MVC*](https://www.systenics.com/blogs/tag/aspnet-mvc/), [*Razor*](https://www.systenics.com/blogs/tag/razor/), [*Umbraco*](https://www.systenics.com/blogs/tag/umbraco/)
The starter packs provided on the Umbraco 6 default installation are good, but in case you need to build a complete new UI design as per your clients requirements then its far easier to start with a blank slate rather than try to mend an existing design to suit your requirements. If you want to move further and start developing forms etc. then its best to setup Umbraco 6 as a Visual Studio project so that you can debug your code. Umbraco provides two kinds of rendering engines for your pages, it can work in traditional Web Forms (its default engine) as well as it can user Razor with MVC. I personally find the HTML generated by MVC to be much clean, and better suited for building responsive html5 based applications. In this short blog post I am detailing the steps required to setup Umbraco 6 in Visual Studio 2012 as well as configure it to use MVC rendering engine. This blog post seeks to serve as a starting point for various other Umbraco development post that I plan to write.
## Setting up Visual Studio 2012 project
Fire up VS 2012 and start a new **ASP.NET MVC 4 Web Application** project give it a name and save it to your preferred location and click**OK** as shown in Figure 1 below.
Figure 1: Create new ASP.NET 4 MVC Web Application
Select the **Basic** MVC template so that we get the required MVC JavaScript's and configuration, the View engine will be the default Razor engine and click OK to create the project as shown in figure 2 below.
Figure 2: Select Basic MVC template
Now that the MVC project is set up we need to add the Umbraco Core nuget package to the project. Right click the project name in the Solution Explorer window and select **Manage NuGet Packages** from the context menu. Select the Online packages and search for Umbraco as shown in figure 3 below.
Figure 3: Search Umbraco NuGet package
As you can see from the above figure 3, two packages are displayed which are relevant to our project. **Umbraco Cms core Binaries** package just adds the Umbraco assemblies to the project but it does not add the other folders and files required to manage Umbraco, this is the package you need to Install by clicking Install in the above screen. The other package shown**Umbraco CMS** should be used if you plan to use Umbraco in Web Forms project, but if you import it in an MVC project it overwrites basic MVC configuration making the project unusable! I believe in future there would be MVC specific package as the popularity of MVC deployments grow. In our case click on **Install** for the **Umbraco Cms Core Binaries** package to install it from the internet along with its pre-requisite packages automatically. Once you have the package installed the optional but recommended step is to click on **Updates** and update all the packages listed so that you have the latest versions of all the packages to work against. This is very useful since if there are any bug fixes in the packages since the initial template was built those are downloaded into your project. Once all the packages are updated click on **Close** to close this dialog.
Now there is a manual step to get rest of the Umbraco files imported into your MVC project. Go to the [Umbraco download website](http://umbraco.codeplex.com/releases) and download the latest recommended download file. An important point to check is if the version of the NuGet package you installed in VS matches the version of download which is available. At times when new releases are made, it takes a while for the new packages to be available on NuGet while they are available on CodePlex. So ensure that you have matching versions of NuGet package binaries and the project files. Once the file is downloaded, extract it to a temp folder. Open the extracted folder in Windows Explorer and select all folders except App_Code (since that folder is not required in MVC – its an empty folder) and copy it into your Visual Studio Project folder. Figure 4 shows the extracted Umbraco 6.0.3 folders
Figure 4: Extracted Umbraco folders
As you copy the Umbraco extracted folders into your VS project folder you will get a warning as shown in figure 5 to replace or skip duplicate named files. Click **Replace the files in destination** so that all Umbraco files are correctly copied into the project.
Figure 5: Replace files in VS project with Umbraco files
Switch to Visual Studio and in Solution Explorer window click on the Show All Files icon so that all files present in the project folder but not added to the project are displayed as shown in figure 6. Right-click on each of the greyed folders (except bin and obj folders) and select Include in Project to include the folder and files contained within it to our Visual Studio project.
Figure 6: Show All Files in Solution Explorer
Once you have included all the hidden folders and files in your project, the Visual Studio integration is completed. Now we proceed to the configuration steps.
One important point to note is that when you will be testing and building your application Visual Studio will be using IIS Express to run Umbraco. In my testing I have found that if you try to install Umbraco in IIS under the default website then it stops working! In case you need to configure Umbraco in IIS, then you will have to use IIS to create a new Web Site specially for Umbraco. Unlike as mentioned on the Umbraco Wiki pages I have not being able to get Umbraco 6.0 work under Default Website in IIS7.
## Configuring Umbraco 6 to user MVC/Razor rendering engine
Umbraco has made it very easy to modify its settings and has split different configurations into separate config files placed in the **config** folder. In solution explorer, expand the **config** folder and open **umbracoSettings.config** file. This file has some important settings required for Umbraco engine to work correctly so its good to study this file to learn the kind of settings allowed. Go to line number 149 and change the **defaultRenderingEngine** setting to **Mvc** (please make sure you have the case correctly) as shown in listing 1 below.
```
trueMvc
```
Listing 1: Updated Rendering Engine in umbracoSettings.config
Save the config file and your Umbraco is set to use MVC, but if you stop just here the pages you create will still carry the *.aspx extension. You need to make one more config change to enable typical directory type URL's, its called as Friendly URL's in Umbraco lingo and you can find more information on configuring it [here](http://our.umbraco.org/wiki/install-and-setup/setting-up-umbraco-for-friendly-urls). I am assuming you have IIS7 onwards and the setting below are considering you are using IIS7 onwards. Open the **web.config** file from Solution Explorer and change line 45 to the following
```
```
Listing 2: Updated umbracoUseDirectoryUrls property in web.config
Move to line 194 and update the setting to as shown below.
```
```
Listing 3: Updated UrlRewriteModule setting in web.config file
Save the **web.config** file and now you are ready to get started with MVC development. You can build the project and hit **F5** to run it. Your browser should load up the Umbraco Installation screen as shown in figure 7 below. Follow the on screen instructions get your application configured.
Figure 7: Umbraco Installation screen
## Installation of Umbraco 6
The steps shown below are completely optional but still its good to know for those who are getting started with Umbraco development. In your browser click on the **Let's get started!** button as shown in figure 7 above. On the next license screen click on **Accept and Continue** to move forward. Now you are shown the **Database configuration** screen. You can select the database of your choice, I like to use SQL CE 4 during testing and development since it lightweight and easier to move around since all you need to do is copy the folder and all settings get transferred over. Figure 8 shows the SQL CE 4 selected as the database. Click **Install** to install the appropriate selected database and move to the next step.
Figure 8: Umbraco Installation – Database configuration
After database installation is done you will see a confirmation message as shown in figure 9 below, click Continue to move ahead.
Figure 9: Database Installation completed
On the Create User screen provide the details to create the admin user. This user will have access to the Admin control panel of Umbraco and all details of the user can be changed at a later stage from within Umbraco. I create the user using temporary credentials, please make sure that you use your strong credentials. Click **Create User** to create the user and move ahead.
Figure 10: Create user
Once the user is created you are given the option to select a start kit. Most of these pre-defined start kits are based on Web Forms, so we can't user them. Also if you want to create your own site from scratch then its best to not use any of these start kits. Select **No Thanks I do not wish to install a start kit** image as shown in figure 11 below to setup Umbraco without using an existing starter kit. A confirmation prompt will open up asking you to confirm your select, click **OK** to proceed.
Figure 11: Do not Install a start kit
The above steps will finish configuration of Umbraco and you will be presented with a confirmation screen as seen in figure 12 below. This completes the configuration of a blank Umbraco 6 installation with MVC being used as the Rendering engine. But remember since we did not chose to use a Start Kit our site will be blank and it needs content defined before you can publish or deploy the site. Its out of the scope for this blog post to define how to configure your site, please consult the [Umbraco Documentation](http://our.umbraco.org/documentation) for further advice. You could also optionally import [Standard Website MVC](http://our.umbraco.org/projects/starter-kits/standard-website-mvc) package to get a basic MVC Website setup.
Figure 12: Umbraco Installation Completed
In this short blog I have tried to cover the essential steps required to configure Umbraco 6 to user MVC/Razor as the rendering engine. I plan to build on this configuration in my future blog posts.
## Download Sample
[Click here](https://www.systenics.com/media/setupumbraco6mvc.zip) to download the sample for this blog.
## Related pages on Systenics
- [AI-powered listing description generation](https://www.systenics.com/auctionworx/ai-enhanced-listings-description-generation/)
- [AuctionWorx development and customization](https://www.systenics.com/auctionworx/development-and-customization/)
## Need help implementing this for your business?
Our team helps plan, build, and scale marketplace and auction workflows. Explore [industry solutions](https://www.systenics.com/solutions/), [platform products](https://www.systenics.com/products/), and [custom development services](https://www.systenics.com/auctionworx/development-and-customization/) tailored to your goals.
[Book a quick consultation](https://outlook.office.com/bookwithme/user/231015685f21467da5ef6e3eb8b50240@systenics.com/meetingtype/hbYq2z1Hj0C2e7DuwBqdnw2?anonymous&ep=mcard).
---
## Page: Setting up CI for ASP.NET MVC to deploy on Azure Cloud WebApp using Visual Studio Team System
URL: https://www.systenics.com/blogs/setting-up-ci-for-aspnet-mvc-to-deploy-on-azure-cloud-webapp-using-visual-studio-team-system/
Description: Importance of DevOps is growing by the day as development teams adopt agile practices and start on the path of shorter development cycles. Having a good Continuous Integration system in place is one of the key parts of DevOps setup. In this blog I will explore the process of getting a simple ASP.NET MVC application configured using Online Visual Studio Team System
# Setting up CI for ASP.NET MVC to deploy on Azure Cloud WebApp using Visual Studio Team System
**by:** Saurabh Nandu **in:** [DevOps](https://www.systenics.com/blogs/category/devops/) **tags:**[*Visual Studio*](https://www.systenics.com/blogs/tag/visual-studio/), [*Continuous Integration*](https://www.systenics.com/blogs/tag/continuous-integration/)
## Overview
Importance of DevOps is growing by the day as development teams adopt agile practices and start on the path of shorter development cycles. Having a good Continuous Integration system in place is one of the key parts of DevOps setup. In this blog I will explore the process of getting a simple ASP.NET MVC application configured using Online Visual Studio Team System's Build and Release process to deploy to an Azure WebApp.
Microsoft has a great offering in Online Visual Studio Team System which is robust as well as feature rich and best of all its free for up to 5 users, even for private projects! Microsoft Azure has been a competitive cloud offering and its WebApps service is a perfect choice for ASP.NET MVC applications as it takes away the hassles of maintenance of VM and provide some great scaling options. In this blog I will use the default VS generated ASP.NET MVC 5 application and configure it in VSTS for CI deployment to Azure Web App.
## Setting Up ASP.NET MVC Project
Our focus is not the MVC application but the configuration of the CI process, hence I choose use the default VS generated ASP.NET MVC application to get started. So fire up Visual Studio and create a new project using the **ASP.NET Web Application (.NET Framework)** template. Select **Create new Git repository** option on the**New Project** dialog as shown in **Figure 1** below to initialize the Git repo. Later, we will connect this Git repo with the remote VSTS based Git repo.
**Figure 1:** New Project dialog – Visual Studio
On the **New ASP.NET Web Application** dialog select the **MVC** template. Select the **Add unit tests** option so that a test project is added to our solution. Later, we would want to run the tests on CI to ensure our build was successful. Also click on **Change Authentication** button and select the authentication type as **Individual Users** as shown in **Figure 2** below. Click **OK** to create the new project.
**Figure 2:** New ASP.NET Web Application
Build and run the project to ensure its working correctly locally. Run the tests from the **Test** menu to ensure they succeed, at this point the tests are auto generated and simple calls to the home controller but enough for purpose of our blog.
## Configuring Entity Framework Migrations
Although the default ASP.NET MVC project is pretty straight forward and easy to setup, it presents a challenge from CI perspective. The default ASP.NET MVC project uses Entity Framework Code First approach to upgrade the database. While the process of database migration is straight forward while publishing directly from Visual Studio, it presents several challenges when we try to achieve it during CI. The general recommendation is not to use Entity Code First approach if you want to go down the CI route and instead use the MS Database project or several other database migration options available.
In case you still wish to stick with using EF Code First approach, then there are two main options available. The first, most logical one for large projects, is to package EF tool migrate.exe along with your project and then invoke it during the CI release process. One most important point to remember is that the agent running the Release process needs to be able to connect to the Azure Database server, so you need add appropriate firewall rules before you run the migrate tool.
The second approach, more suited for smaller projects but definitely not suited for a live production system is to modify the project codebase to run migrations when it first connects to the database server. In this case the database will get migrated after it build is deployed to the server and if anything goes wrong during migration you will not be able to roll back the build! I will use this approach in the current blog because EF migrations would make a separate blog entry, but at least it will provide some support for migrations in the current blog scope.
Open the Package Manger window in Visual Studio and run the enable-migration command to enable migrations for the project and let the initial migration scripts be generated. Then open the Startup.cs file and update it to include the additional using statements as well as to set EF to migrate the database to the latest version.
```
using Microsoft.Owin;
using Owin;
using System.Data.Entity;
using TestMVCApp.Models;
using TestMVCApp.Migrations;
[assembly: OwinStartupAttribute(typeof(TestMVCApp.Startup))]
namespace TestMVCApp
{
public partial class Startup
{
public void Configuration(IAppBuilder app)
{
ConfigureAuth(app);
Database.SetInitializer(new MigrateDatabaseToLatestVersion());
}
}
}
```
Next, open the auto-generated **Configuration.cs** file from the **migrations** folder and add the following lines to the**Configuration** method to ensure that migration scripts run automatically when the application is invoked.
```
AutomaticMigrationsEnabled = true;
AutomaticMigrationDataLossAllowed = true;
```
You can build and ensure that the project is building and working fine locally.
## Sync Project with VSTS Git Source Control
Now that our project is ready, it's time to upload it to online Git repository. You need to use your Microsoft Credentials to signup and create a project on [VisualStudio Online](https://www.visualstudio.com/vso/) (if you don't have one already). It's free to create unlimited private projects to be shared up to 5 users. Once you have created your project, navigate to the **Code** section of your project to get the URL to the Git repository of you project. Copy the Git Repository URL shown on the page, we will need it to add our project to source control.
Since we have already crated a VS project in the steps above we need to add it to the remote Git repository. In Visual Studio, open the Team Explorer and click on the Sync button as shown in Figure 3 below.
**Figure 3:** Sync with Remote Repository
VS will recognize that we do not have any remote Git repo associated with our codebase and give us an option to connect with an online Git repo as shown in **Figure 4.**
**Figure 4:** Publish Git Repo
Click on the highlighted **Publish Git Repo** button and follow the wizard to login into the Microsoft Account, use the same account which has permissions on the Visual Studio Online project that we crated earlier. Once you are logged into your Microsoft account you will be presented with a screen similar to Figure 5, which allows you to choose your VSTS Domain and the Project that you wish to use for this application.
**Figure 5:** Select VSTS Project details
Make sure you have the right project details setup, click on the **Advance** button in the screen above to input the name of the Team Project in which you want to host the source for this application. Finally click on **Publish repository** button to push the local git changes to the VSTS hosted remote repo. Now that our online Git repo is ready we can move ahead with the CI configuration.
## Azure Web App and SQL Server
Creating and configuring an Azure Web App and SQL Server are out of the scope of this article. I assume you have one created and have the required parameters and credentials noted down. I am using the Web + SQL azure template to create a Basic version of the Web App and Free SQL Server for lower costs in the demo. Make sure that you have correctly changed the connection string in your project to point to the Azure SQL DB, so that your application can connect with the Azure SQL DB.
## Configuring Azure Account as a Connected Service in Online VSTS
Navigate to the online VSTS website and login to your project in which you wish to automate the build. You will see a **gears** settings icon once your project is selected, hover over it and select **Services** from settings menu as shown in figure 6.
**Figure 6:** Select Services setting for VSTS Online
On the Services page click on the **+ New Service Endpoint** button and select **Azure Resource Manager** from the list of options. Provide a Connect Name that's easy to remember and select the Azure Subscription that you are trying to connect. It's always easy if both your VSTS and Azure accounts share the same Microsoft account. Also remember the you need to have admin permission on both the VSTS Online Project as well as in Azure to be able to perform this step. If you do not have appropriate permissions in Azure as well as the Default Azure Active Directory for your account you will run into all kinds of permission errors! Once you have the Azure service connected in VSTS we can proceed to configure our Build process.
**Figure 7:** Add Azure Resource Manager Service Endpoint
## Configuring VSTS CI Build Automation
In VSTS online, click on the **Build & Release** menu and select **+ New** to add a new Build Definition. Select **ASP.NET (PREVIEW)** from the template library and click **Apply** to load a default set of tasks used to ASP.NET projects as shown in **Figure 8**.
**Figure 8:** Add new Build Definition
VSTS Online build definition provides various in-built templates for popular application types. You can also start with an **Empty Template** and add your own Build Tasks. In this blog, I am using the **ASP.NET** build template which is perfect for our current requirements. **Figure 9** shows a list of build tasks that have been configured by default. They get the source from Git, built it using VS, test it and finally copy the source code for deployment.
**Figure 9:** ASP.NET Build tasks
You can click around in each of the Build tasks to look at their parameter values and change it appropriately as required. New tasks can also be added and ones like Public symbols path, if not required can be removed as well. Switch to the **Triggers** section on this screen to configure Continuous Integration, turn on the **Enable this trigger** option and you will see that it auto populates the name of the repository being used as well as its branch to monitor. By default, any changes pushed in the **master** branch will trigger the build. That is the correct setting for us right now but if you have multiple different branches for development and production you can configure the it from this screen as shown in **Figure 10**. I will leave the default template values and click on the **Save** button (under **Save & Queue**) menu above to save the template.
**Figure 10:** Configure CI Trigger
## Configuring VSTS CI Release Automation
Now that we have configured our Builds to auto trigger on every branch push, we also need to configure the Release of the build to our azure web app. Switch to the **Releases** tab in online VSTS and click on **+ New definition** to create a new Release definition. Select the **Azure App Service Deployment** template and click **Next**, as shown in **Figure 11**.
**Figure 11:** Create release definition
The next screen allows you the view the project name and the source control name, let these values be at default. Select the **Continuous deployment** checkbox to ensure that as soon as a build is completed, its auto released to Azure. Click Create to create the release definition.
**Figure 12:** Create release definition – 2
Once the release definition is created you will see tasks listed for **Environment 1**. Select the **Deploy Azure App Service** task and input the**Azure Subscription** and **App Service Name**. We had earlier linked our VSTS to Azure for this reason so that the Subscriptions and App Services get auto populated and linked. The VSTS automatically takes care of managing the credentials and uploading to the Azure App Service.
**Figure 13:** Deploy to Azure App Service
Switch to the Triggers section and set the Branch name as **master** as shown in Figure 14 so that our release is triggered every time a build is available for the **master** branch. Click on the **Save** icon to save our changes. This completes our basic configuration of VSTS Build and Release configuration. Now we are all ready to test out our CI platform!
**Figure 14:** Setup Release Trigger
## Testing Our Configuration
You can make some changes to any of your files and push a change to your source control. This should trigger an auto build as we have configured it. On the VSTS portal as soon as a new push it made to Git, it will auto-trigger a build. You can see in Figure 15 that a Build is in progress. Clicking on the build number will take you to the Build Details and you can see a complete log of the build progressing on the Build Agent. At times, I have seen that the Build fails when it's not able to download NuGet packages or NPM packages. So, it's essential to monitor the build and Queue it again in case you see such errors.
**Figure 15:** Build in Progress
**Figure 16:** Build Status and Details
**Figure 17:** Unit Tests Successfully run on Build Agent
Once the Build is completed, it's artefacts are version and uploaded and it triggers the Release process. You can monitor the progress if the release from the **Releases** tab and clicking on the release number in progress as shown in **Figure 18**. You can see below that my release has succeeded and the build has been deployed to the server.
**Figure 18:** Release Status
Once the release is successful launch the application in your browser using the Azure Web App site URL, navigate to the Register page and register a new user. This will trigger Entity Framework to start creating the tables on the new Azure SQL Server database. Every time you modify the schema of the database, ensure that you run migrations on your project locally and then once the build is published run the page like Register or Login which will internally cause Entity Framework to start the database migration process on Azure SQL Database.
## Related pages on Systenics
- [AuctionWorx development and customization](https://www.systenics.com/auctionworx/development-and-customization/)
- [Excel plugin for listing creation](https://www.systenics.com/auctionworx/listings-creation-excel-plugin/)
- [About Systenics](https://www.systenics.com/about-us/)
## Need help implementing this for your business?
Our team helps plan, build, and scale marketplace and auction workflows. Explore [industry solutions](https://www.systenics.com/solutions/), [platform products](https://www.systenics.com/products/), and [custom development services](https://www.systenics.com/auctionworx/development-and-customization/) tailored to your goals.
[Book a quick consultation](https://outlook.office.com/bookwithme/user/231015685f21467da5ef6e3eb8b50240@systenics.com/meetingtype/hbYq2z1Hj0C2e7DuwBqdnw2?anonymous&ep=mcard).
---
## Page: Setting up a VMware Esxi 6.0 Virtual Server on OVH Hosting
URL: https://www.systenics.com/blogs/setting-up-a-vmware-esxi-60-virtual-server-on-ovh-hosting/
Description: In this blog post we try to highlight some of the challenges and advantages that we faced while working with OVH. It took us several hours trying to figure out different parts of the service and get it functional. There have been several forum posts by others who have given important information to help us configure our servers correctly. In this blog post we are trying to string together our journey to make it easier for others. We specialize in bespoke software development and are not trained IT admins, but we definitely like to dabble into IT as far as we can. We are sure someone with a strong IT experience in virtualization might know these issues up front. But this is our layman’s view of this process.
# Setting up a VMware Esxi 6.0 Virtual Server on OVH Hosting
**by:** Saurabh Nandu **in:** [General](https://www.systenics.com/blogs/category/general/) **tags:**[*VMWare ESXI*](https://www.systenics.com/blogs/tag/vmware-esxi/)
## Overview
We have been using dedicated server hosting for past couple of years. We were happy using servers from [www.server4you.com](http://www.server4you.com/). Although they have a bit slow support, they have good dedicated server offerings at bargain prices. Recently with our foray into the open source space we needed couple of Linux servers too. After struggling and hitting a roadblock with Server4you in trying to run virtualization on their servers, we started to look for other options. One of the strong contender we found was [OVH.com](http://ovh.com/). They have two other sister companies too, which provide bargain servers.
In this blog post we try to highlight some of the challenges and advantages that we faced while working with OVH. It took us several hours trying to figure out different parts of the service and get it functional. There have been several forum posts by others who have given important information to help us configure our servers correctly. In this blog post we are trying to string together our journey to make it easier for others. We specialize in bespoke software development and are not trained IT admins, but we definitely like to dabble into IT as far as we can. We are sure someone with a strong IT experience in virtualization might know these issues up front. But this is our layman’s view of this process.
**Note:** This is not a paid review of OVH, this is just describing our experience.
## Getting Started
There were two very key features offered by OVH which attracted us to their servers. Firstly, bargain priced dedicated servers and secondly ability to run virtualization platform on their servers. We have not seen any other bargain provider giving such offerings, especially the latter feature to allow us to directly host a virtualization platform on their server. It was a good solution for our needs to host both dedicated Windows and Linux virtual machines and that to at a bargain – simply irresistible!
We picked the Enterprise SP-64 server with the following key specs:
- Intel Xeon E5-1620v2
- 64GB DDR ECC RAM
- 2x2 TB SATA3 (Software RAID)
- 500 Mbps bandwidth guarantee
- IP KVM
- 500 GB backup space
- Ability to have public IP's at no monthly cost (one time fixed cost of $3 applies)
The server was far more powerful than our current servers as well as had enough hardware capabilities to host several Linux VM’s. Once we fixed the server and purchased it, there came the first hurdle. They required identity proof of our company and the individual purchasing, only after identity verification the payment gets collected. It was late night, we did not have my documents on hand. So the next morning, we emailed them the documents. Within couple of hours, we got an confirmation to purchase. Punch-in the credit card info and we hit hurdle number 2 (it’s a regular occurring hurdle), all credit card payments are manually authorized by their staff! Since we are based in Mumbai, India in GMT +5:30 timezone, it usually takes a while before their staff gets to approving our payment manually. We am not sure what policies have lead them to make this a practice, but in todays rapid world waiting for manual verification seems too much. It sucks all the excitement out of the process as well as you waste days waiting on every step.
Finally, in couple of hours the payment got approved and a server got assigned to us. OVH has a pretty mature control panel that lets to view and control several aspects of your services. Its one of the most detailed panel we have seen and are pretty happy with the control it gives us.
Figure 1: OVH Hosting control panel.
## Hyper-V 2012 R2 Virtualization – a failed effort
As soon as we had access to the servers one of the first thing to do was pick a virtualization platform. We have been using Hyper-V internally and were pretty confortable with it so we went with it first. In the OVH control panel (as shown above) you can click on the **System (OS)** spanner icon and choose an OS of your choice. They have several options of base OS and virtualization platforms to choose. This is again a pretty unique feature we have seen in their hosting and a pretty good one too. Installation of Hyper-V server went smoothly and RDC credentials were sent via email. We could remote into the server and get to the command prompt.
Internally we were used to using the RSAT tools for Windows 8.1 to manage Hyper-V servers. We expected the same to work for this server, but couple of hours of goggling solutions we figured out that RSAT tools only work in Intranet environment. As soon as the server detects that it is in a public internet environment RSAT tools do not work. We found a workaround to remotely managing the server using [this guide written by Mark Thompson](http://www.markthompson.me.uk/post/setting-up-a-virtual-hosting-environment-for-30-a-month-with-so-you-start-and-hyper-v). Only difference we found that after we installed **chocolatey**, we could not install Google Chrome, so we installed Firefox and went ahead with it. Another useful tool to download and install was [explorer plus plus](https://explorerplusplus.com/). It’s a free file manager and a good replacement for missing Windows Explorer on the barebones Hyper-V server. Once FireFox was installed we could download the Linux/Windows ISO of our choice and store it locally. Then use the free [5Nine Hyper-V manager](http://www.5nine.com/5nine-manager-for-hyper-v-free.aspx) to create new virtual machines using that ISO. It was pretty straight forward once the ISO was downloaded, to get a VM up and running. But that VM had no internet connectivity. Unlike a local network with DHCP where new machines can get IP Addresses assigned automatically, VM’s on the internet need public static IP addresses if you wish to use them for hosting purposes. This is where we had been stuck with server4you hosting in the past and were curious to see if OVH had the right solution for this.
In order to assign public IP to your virtual machine you need to first order it from OVH. OVH allows about 256 IP Addresses to be assigned to a single machine at a one time setup cost. Although there is a cravat now that ARIN has exhausted IPv4’s, you might have to first raise a support ticket with OVH requesting them to allow you to purchase additional IP addresses for your server. If they approve, then you need to go into the OVH control panel –> IP –> Order Additional IP’s. This will open a wizard asking you the number of IP’s you wish to purchase and the cost for it. Remember you can only purchase as many IP’s as they OVH support has enabled for your server. If you need more you need to contact their support.
The same manual verification process follows after payment for IP’s, so you need to wait till you payment is verified and the IP’s get assigned to you. Once the new IP’s are assigned to you, in order to use them in virtual machines you need to generate a Virtual MAC for them. In layman terms, hosting companies configure their routers to ensure that the public IP’s that they distribute is only assigned to their servers to avoid abuse. They lock the IP address to a particular network MAC to ensure only that machine can use the IP address. This was the same problem we were facing with server4you hosting, the only difference in OVH is that their control panel allows you to assign a Virtual Mac to the IP address so that you can directly assign the IP address to the virtual machine. This again is a very good feature in OVH, without this there is no point of hosting VM’s because you will never be able to assign them public IP’s.
Figure 2: Add Virtual MAC
Go the the **IP** section in the control panel, expand the new IP’s you have received and click on the settings icon and select **Add a virtual MAC** from the context menu. A dialog similar to figure 2 is shown, select **Create a new Virtual MAC**. **Type** can be **OVH** for all other platforms, only select **vmware** if you are using vmware esxi because it requires virtual mac’s in a particular format. Then give the **name of the virtual machine** you will apply this IP to and click **Confirm**. This will take a while and generate a MAC for your IP address.
Once you have generate the virtual MAC, use this [guide from OVH](http://docs.ovh.ca/en/guides-network-bridging.html#windows-server-2012-hyper-v) to setup static MAC for your Virtual Machine. Unfortunately for us, after several tries and reboot we were never able to get the public IP working in the VM. Nor we could get internet access for our VM’s. OVH only provides support for their hardware and not for software configuration. We scanned the net for different articles. The steps to take were redone couple of times. We also went through re-install of Hyper-V and reconfiguration but no matter what we were not able to get it working.
Online forums posts some users facing similar issues felt that there were routing issues with OVH and it took ages for them to acknowledge or fix. Several users had even cancelled their accounts because support was not able to fix the issue. It was frustrating and we were dejected thinking probably the offer was too good. The problem was that it was a software configuration issue and OVH support only helps with hardware issues and there was no clear forum answer too. Dejected, we clearly failed in this configuration effort.
## VMWare ESXI 6.0 – A success
Going through the forum posts we read about several users who had been successful in using OVH with VMWare ESXI. Although it was a new platform for us, we wanted to give it a try since it pretty comparable to Hyper-V in terms of performance and capabilities. As well as its free like the Hyper-V server. Hence we went ahead and installed VMware ESXI 6.0 from the OVH control panel using the default partition options. Once the install was done OVH emailed us the link to the web interface for VMware ESXI server which is basically the IP address of your server accessed over HTTPS. This began our newbie journey in working with ESXI. We are sure someone with VMWare ESXI experience will find our journey humorous but our hope to to help those like us who do not have deep knowledge of ESXI to get started with it.
Figure 3: VMWare Esxi 6.0 Web interface
VMWare provides a free windows tool vSphere client to manage the server. Although the tool has several limitations and can’t access the latest features provided by ESXI 6.0. There is a paid vCenter tool from VMWare which allows which allows full management for ESXI, but we choose to stick to the free tool for now. Click on the **Download vSphere Client for Windows** link from the webpage loaded from the link provided in OVH by email. Once the vSphere client is installed start it and use the credentials for root use provided in the OVH email to login to your ESXI server. The vSphere Windows client lets to configure all basic parts of ESXI as well as allows you to create and mange virtual machines.
Here again the challenge came of how to upload a Linux/Windows ISO to ESXI to boot and create a VM. There are several solutions, some forum posts suggested to ssh into esxi server and then using command line tools to download the iso’s. But its pretty hard to find direct links to ISO installers and we did not want to muck around in ssh until we knew what we were doing.
Figure 4: vSphere Client Summary tab
The other way to to upload an image using vSphere client. First download the appropriate ISO to your local machine. Then use the vSphere to upload the image. In vSphere client, go to the **Summary** tab and right-click on **datasource1** (highlighted in Figure 4 above) under **Storage** section and select **Browse Datastore** from the context menu. Note: you might not see **backupstore** under storage section like figure 4, we will talk about it a bit later.
Figure 5: Datastore Browser
In the **Datastore Browser**, click the **Add Folder** icon to create a new folder called **Installer** (you can name it whatever you like). Note: On a new server there will not be any folders created like shown in Figure 5.
Then double click on the newly created Installer folder to open it. Then click on the Upload file/Folder icon (circled in red in Figure 5) and select a local ISO to upload and click OK. Then wait for the ISO to upload. It could take a long time depending on your upload connection speed. Usually DSL connections have a higher download but a very low upload speed, so it could take ages. Luckily we had our existing dedicated server running, so we installed vSphere client on it and uploaded the ISO’s from there. It was a much faster and pain free process. You could use an Azure or Amazon Vm for some time to just upload the ISO and then shut them down once you are done if your upload bandwidth is crappy.
Once you have the ISO uploaded you can use the **Create a new Virtual Machine** wizard from the vSphere client to go ahead and create new virtual machines as required. We would also suggest that before you power up you new VM, you also generate a new virtual mac for the IP in OVH (as described above) but this time choose the VMware option which generating the virtual mac to make it vmware compatible. Then go under network settings for the vm and assign a the generated static virtual mac as shown in [this guide](http://ask.xmodulo.com/static-mac-address-vmware-esxi-virtual-machine.html). Either during installation or post installation you can follow [this guide from OVH](http://docs.ovh.ca/en/guides-network-bridging.html) to assign the static IP to the virtual machine. Once you correctly assign the virtual MAC as well as the static IP the vm should be able to access the internet as well as you should be able to ping into the vm’s static IP address. This approach worked well for us and we continue to use this deployment. There were a couple of more things that we needed to setup to complete our installation.
## ESXI 6.0 – Add a free license
The VMWare ESXI 6.0 installed by default has a 60 day trial period and it needs a free license from VMWare to be installed. You can follow [this guide](http://www.vladan.fr/apply-vmware-free-license-vmware-esxi/) to generate and install a free ESXI license (please skip the part of the guide which relates to download and install of ESXI since we already have it installed)
## Restrict Access to ESXI
As we were working with our new server, we found one day that we were no longer able to login into server. No one had changed the passwords, but the vSphere client would simply refuse to login. Worried we used the OVH control panel to reboot the server (a good feature from OVH which allows quick automated reboots) and were able to login post the reboot. On looking at the event logs in vSphere client we found that someone had started to attack our vmware server by running a password list, and due to failed password attempts the root account was being locked out. Googling we found that root account on ESXI 6.0 can’t be disabled and this is a [common problem](http://www.v-front.de/2015/04/watch-out-esxi-60-introduces-root.html). So we suggest you use [this guide](http://www.v-front.de/2014/04/protect-your-esxi-hosts-against.html) to configure ESXI to only accept connections from your IP addresses. There might be several other ways to secure your ESXI, but we found this one to be good enough to meet our needs.
## Setting up Backup datastore
One of the neat features which OVH provides is 500gb of backup disk space. Not only that, it allows FTP, NFS and CIFS access to the backup storage so that you can easily configure it as a network drive in ESXI as well as from within your VM clients. [Follow this detailed guide](http://docs.ovh.ca/en/services-backup-storage.html) from OVH to configure your backup space as well as to allow your new Public IP’s to have access to the backup storage. You will receive an email with the FTP username, password and servername of the backup once its created, please refer to the email to configure further. Once backup is configured in the vSphere client go to **Configuration** tab and click on**Storage** under **Hardware**. Then click **Add Storage** to bring up the Add Storage wizard as shown in Figure 6. Select **Network File System** option and click next.
Figure 6: Add Storage wizard step 1
Figure 7: Add Storage Wizard step2
On refer to the email with ftp details of you backup space to get the access details. In step 2 of the Add Storage wizard fill the following information:
- **Server**: The FTP server name given in your email
- **Folder**: /export/ftpbackup/login – Where login is given in your email
- **Datastore Name**: This can be anything you want
Clicking on **Next** will allow you to add the backup storage as an NFS datasource for ESXI. Once this is setup you can move files to the backupstore using the** Browse Datastore** popup from the summary page.
## Conclusion
This blog post has tried to highlight our journey in setting up VMWare ESXI 6.0 on OVH hosting server. We hope that this post helps those who are new to OVH hosting and makes it easier for them to setup their server. VM backups is one major area we have not yet explored and are currently relying on each client VM backing up its data to the backup storage. But eventually we will have to figure backup for VM’s and that should serve as a new blog post.
## Related pages on Systenics
- [AI-powered listing description generation](https://www.systenics.com/auctionworx/ai-enhanced-listings-description-generation/)
- [AuctionWorx development and customization](https://www.systenics.com/auctionworx/development-and-customization/)
- [Excel plugin for listing creation](https://www.systenics.com/auctionworx/listings-creation-excel-plugin/)
## Need help implementing this for your business?
Our team helps plan, build, and scale marketplace and auction workflows. Explore [industry solutions](https://www.systenics.com/solutions/), [platform products](https://www.systenics.com/products/), and [custom development services](https://www.systenics.com/auctionworx/development-and-customization/) tailored to your goals.
[Book a quick consultation](https://outlook.office.com/bookwithme/user/231015685f21467da5ef6e3eb8b50240@systenics.com/meetingtype/hbYq2z1Hj0C2e7DuwBqdnw2?anonymous&ep=mcard).
---
## Page: Salesforce CRUD operations using C# in AuctionWorx (ASP.NET MVC application)
URL: https://www.systenics.com/blogs/salesforce-crud-operations-using-c-in-auctionworx-aspnet-mvc-application/
Description: In this blog post, we have explained how we can perform CRUD operations with Salesforce custom objects. We have integrated Salesforce with RainWorx AuctionWorx software (ASP.NET MVC application). Refer our previous blog "Integrate Salesforce with C# or ASP.NET MVC Application", where we have shown how you can set up a project for Salesforce integration. Salesforce integration will allow better interaction between customer support team and bidders/buyers post bid/purchase process.
# Salesforce CRUD operations using C# in AuctionWorx (ASP.NET MVC application)
**by:** Dhanashri Karale **in:** [Programming](https://www.systenics.com/blogs/category/programming/) **tags:**[*AuctionWorx*](https://www.systenics.com/blogs/tag/auctionworx/), [*SalesForce*](https://www.systenics.com/blogs/tag/salesforce/), [*ASP.NET MVC*](https://www.systenics.com/blogs/tag/aspnet-mvc/), [*C#*](https://www.systenics.com/blogs/tag/c-sharp/)
## Introduction
In our previous blog "[Integrate Salesforce with C# or ASP.NET MVC Application](https://www.systenics.com/blogs/integrate-salesforce-with-c-or-aspnet-mvc-application/)", we have shown how you can set up a project for Salesforce integration.
Now, in this blog we are going to perform CRUD operations with Salesforce. To perform CRUD operations, we need to create new Custom Object in Salesforce. In this blog, we are going to create Phonebook custom object.
If you are evaluating CRM sync, bidder workflows, or API-based extensions, see our[AuctionWorx development and customization services](https://www.systenics.com/auctionworx/development-and-customization/) for broader implementation support.
## Create Custom Object
In top-right corner of main navigation header, you will see "Setup" link and click on it > on left side navigation menu click on "Create" link under "Build" section > under expanded sub-menu, click on "Objects" link > click on "New Custom Object" button shown in main content area > Enter data as given in screenshot below > click on "Save" button.
Figure 1: Salesforce - Create Custom Object
Now you have successfully created a Phonebook object.
Figure 2: Salesforce - Custom Objects list
## Create Attributes or Fields
Next, we have to define attribute for this "Phonebook" custom object. Under Build > Create > Objects > from Custom Object page, click on custom object name.
Figure 3: Salesforce - Custom Fields and Relationships
It will open the details view for "Phonebook" custom object. Under "Custom Fields & Relationships" section, click on "New" button > Select Data Type of object > Click on Next > Fill appropriate data and click on "Save" button.
We have created four fields such as Email, First Name, Last Name and Phone for PhoneBook custom object.
Now let's start with coding :)
After successful authentication with Salesforce as we have seen in previous blog, we have to create same object in our code. You can access Salesforce object and its attribute by its API name.
```
public class PhoneBook
{
public const String SObjectTypeName = "PhoneBook__c";
public string Email__c { get; set; }
public string FirstName__c { get; set; }
public string LastName__c { get; set; }
public long Phone__c { get; set; }
}
```
## Create
```
// Initialization
PhoneBook phoneBook = new PhoneBook();
// Create Query
var addPhoneData = new PhoneBook { Email__c = "test@example.com", FirstName__c = "John", LastName__c = "Doe", Phone__c = 9876543210 };
var result = await client.CreateAsync(PhoneBook.SObjectTypeName, addPhoneData);
if (result.Id == null)
{
Console.WriteLine("Cannot insert data to Phonebook!");
return;
}
Console.WriteLine("Successfully added the record.");
```
## Update
```
// Update Query
var success = await client.UpdateAsync(PhoneBook.SObjectTypeName, result.Id, new { FirstName__c = "Tim" });
if (!string.IsNullOrEmpty(success.Errors.ToString()))
{
Console.WriteLine("Failed to update test record!");
return;
}
Console.WriteLine("Successfully updated the record.");
```
## Delete
```
// Delete Query
Console.WriteLine("Deleting the record by ID.");
var deleted = await client.DeleteAsync(PhoneBook.SObjectTypeName, result.Id);
if (!deleted)
{
Console.WriteLine("Failed to delete the record by ID!");
return;
}
Console.WriteLine("Successfully deleted the record.");
```
## How to check Salesforce Operations?
Salesforce provides "Developer Console" which allows you to execute SQL like queries to verify the data inserted into custom objects. You can execute below given query using these steps: Click on your name given in top-right corner in main navigation header > click on Developer Console > it will open a popup for "Force.com Developer Console" > under Query Editor tab > Execute command given below in Query Editor > click on Execute button.
```
Select FirstName__c, LastName__c, Email__c, Phone__c from PhoneBook__c
```
Figure 4: Salesforce - Developer Console
## Why we need Salesforce Integration?
We can perform Salesforce integration for any application which requires CRM feature. We have integrated Salesforce with [RainWorx](http://www.rainworx.com/) [AuctionWorx](https://www.systenics.com/auctionworx/) project and similar implementations are widely used across modern [AuctionWorx platform](https://www.systenics.com/auctionworx/) deployments.
"AuctionWorx Enterprise is a complete auction website solution. List your own products or create a marketplace with multiple vendors. It can be configured and ready to deploy as-is or customized to suit your business needs. AuctionWorx Enterprise includes Auctions, Fixed Price, and Classified listings. All listing formats can be turned on/off and configured through the web-based Admin Control Panel." - refer [this link](http://www.rainworx.com/AuctionWorx) to know more about AuctionWorx.
We have performed Salesforce Integration on following actions:
- When new user registers successfully on AuctionWorx website.
- When a user wins the bid on Auction listing then this winner's information gets saved in Salesforce so that customer support team can coordinate further to close the purchase process.
- When a user changes his/her profile details then we can call Salesforce API to update the details in Salesforce.
## Some Helpful Links
[Salesforce Developers - SOAP API Developer Guide](https://developer.salesforce.com/docs/atlas.en-us.api.meta/api/)
You can [download our sample](https://github.com/systenics/SalesforceSample) Salesforce CRUD C# Application project from GitHub.
## Related pages on Systenics
- [AuctionWorx platform overview](https://www.systenics.com/auctionworx/)
- [AI-powered listing description generation](https://www.systenics.com/auctionworx/ai-enhanced-listings-description-generation/)
- [AuctionWorx development and customization](https://www.systenics.com/auctionworx/development-and-customization/)
## Need help implementing this for your business?
Our team helps plan, build, and scale marketplace and auction workflows. Explore [industry solutions](https://www.systenics.com/solutions/), [platform products](https://www.systenics.com/products/), and [custom development services](https://www.systenics.com/auctionworx/development-and-customization/) tailored to your goals.
[Book a quick consultation](https://outlook.office.com/bookwithme/user/231015685f21467da5ef6e3eb8b50240@systenics.com/meetingtype/hbYq2z1Hj0C2e7DuwBqdnw2?anonymous&ep=mcard).
---
## Page: Revolutionizing Auctions with AI Products: How Systenics Empowers AuctionWorx
URL: https://www.systenics.com/blogs/revolutionizing-auctions-with-ai-products-how-systenics-empowers-auctionworx/
Description: Systenics AI products allows users to streamline their workflows, enhance customer engagement, and, achieve greater success in their auctions.
# Revolutionizing Auctions with AI Products: How Systenics Empowers AuctionWorx
**by:** Saurabh Nandu **in:** [General](https://www.systenics.com/blogs/category/general/) **tags:**[*AuctionWorx*](https://www.systenics.com/blogs/tag/auctionworx/), [*AI*](https://www.systenics.com/blogs/tag/ai/)
The auction landscape is undergoing a significant transformation. While the core principle of competitive bidding persists, the tools and strategies employed have become increasingly sophisticated in the digital age. At Systenics Solutions, we leverage the power of Artificial Intelligence (AI) to develop innovative products that empower AuctionWorx platform users to streamline workflows, enhance customer engagement, and ultimately achieve greater success in their auctions.
This article explores how our two flagship AI enabled products, the**Auction Listing Descriptions Generator** and**AuctionWorx CoPilot**, can significantly benefit AuctionWorx customers.
You can also explore our broader[AuctionWorx platform solutions](https://www.systenics.com/auctionworx/) and[AuctionWorx add-on products](https://www.systenics.com/products/) if you are evaluating a wider roadmap beyond AI features.
## Elevating Auction Listings with AI-Generated Descriptions
One of the cornerstones of a successful auction is crafting clear, informative, and engaging descriptions for each listed item. Compelling descriptions not only equip potential buyers with the necessary details to make informed decisions but also improve Search Engine Optimization (SEO), ensuring your listings reach a wider audience. However, manually generating high-quality descriptions for a large volume of items can be a time-consuming and resource-intensive task.
Systenics's Auction Listing Descriptions Generator addresses this challenge head-on. This AI-powered tool utilizes advanced natural language processing (NLP) techniques to analyze product data and generate unique, informative descriptions for each item. It can also combine product images to identify and generate appropriate listing descriptions. You can explore this workflow in our[AI-enhanced listings description generation solution](https://www.systenics.com/auctionworx/ai-enhanced-listings-description-generation/).
**Benefits of AI-Generated Descriptions:**
- **Enhanced Efficiency:** Free yourself and your backend team from the mundane task of writing descriptions. Our AI tool can generate descriptions for a large volume of items in a fraction of the time it would take manually.
- **Improved Accuracy:** Eliminate the risk of human error by leveraging AI's ability to process and analyze vast amounts of data. Descriptions will be factually accurate and consistent across all listings.
- **Boosted SEO:** The AI tool can integrate relevant keywords organically into the descriptions, propelling your listings in search engine results.
- **Engaging Content:** AI can generate descriptions that are not only informative but also capture the attention of potential buyers and highlight the unique features of each item.
## Introducing AuctionWorx CoPilot - AI powered customer support
In today's digital world, effective communication is paramount to auction success. Potential buyers often have questions about the listed items, auction process, or payment methods. Addressing these inquiries promptly and efficiently can significantly improve buyer engagement and ultimately lead to higher bids.
AuctionWorx CoPilot, our innovative AI-powered chat assistant, addresses this need by providing AuctionWorx users with a 24/7 virtual assistant capable of interacting with potential buyers in real-time.
**Benefits of AuctionWorx CoPilot:**
- **Streamlined Customer Engagement:** CoPilot can answer frequently asked questions (FAQs) about listings, auction rules, and payment methods, freeing up your team to address more complex inquiries.
- **24/7 Availability:** Potential buyers can receive immediate answers to their questions, regardless of the time zone or day of the week.
- **Increased Lead Generation:** CoPilot can proactively initiate conversations with website visitors, identify potential buyers, and capture their contact information for further engagement.
- **Enhanced User Experience:** By providing instant and accurate answers, CoPilot creates a positive user experience for potential buyers, fostering trust and encouraging participation in the auction.
## The Synergistic Power of AI
The true strength of Systenics' AI products lies in their synergistic effect. When used together, the Auction Listing Descriptions Generator and AuctionWorx CoPilot create a powerful combination that can significantly enhance your auctions.
Imagine a scenario where a potential buyer visits your AuctionWorx listing. CoPilot immediately greets them and offers assistance. The buyer has a question about a specific item. CoPilot seamlessly directs them to the detailed description generated by the AI tool, which provides all the necessary information. If the buyer has further questions, CoPilot can answer them directly or connect them with a live representative.
This seamless interaction not only streamlines the customer experience but also ensures that potential buyers have all the information they need to make informed bidding decisions, ultimately leading to a more successful auction for you.
## The Future of Auctions: Powered by AI and Systenics
At Systenics, we are constantly innovating and exploring new ways to leverage AI to empower AuctionWorx clients. We believe that AI has the potential to revolutionize the auction industry by:
- **Personalized Marketing:** AI can analyze buyer behavior and demographics to create targeted marketing campaigns that reach the right audience for each auction.
- **Dynamic Pricing:** AI can analyze market trends and competitor data to suggest optimal starting prices and adjust them in real-time based on bidding activity.
- **Fraud Detection:** AI can identify and prevent fraudulent bidding activity, ensuring a fair and secure auction environment.
- **Industry-specific problems:** AI can be harnessed for industry/domain specific solutions to speed up time consuming and repetitive tasks. Our team at Systenics can help identify and provide innovative solutions for your specific problems.
[Connect with Systenics](https://outlook.office.com/bookwithme/user/231015685f21467da5ef6e3eb8b50240@systenics.com/meetingtype/hbYq2z1Hj0C2e7DuwBqdnw2?anonymous&ep=mcard) to know more about our AI Products and how we can enhance your AuctionWorx Platform experience through product innovation and[custom AuctionWorx development](https://www.systenics.com/auctionworx/development-and-customization/).
## Related pages on Systenics
- [AuctionWorx platform overview](https://www.systenics.com/auctionworx/)
- [AI-powered listing description generation](https://www.systenics.com/auctionworx/ai-enhanced-listings-description-generation/)
- [Community activity feed](https://www.systenics.com/auctionworx/community-activity-feed/)
## Need help implementing this for your business?
Our team helps plan, build, and scale marketplace and auction workflows. Explore [industry solutions](https://www.systenics.com/solutions/), [platform products](https://www.systenics.com/products/), and [custom development services](https://www.systenics.com/auctionworx/development-and-customization/) tailored to your goals.
[Book a quick consultation](https://outlook.office.com/bookwithme/user/231015685f21467da5ef6e3eb8b50240@systenics.com/meetingtype/hbYq2z1Hj0C2e7DuwBqdnw2?anonymous&ep=mcard).
---
## Page: Real-time Chat Room with Text, Image and File Support Built on Node.js, Express.js and Socket.io
URL: https://www.systenics.com/blogs/real-time-chat-room-with-text-image-and-file-support-built-on-nodejs-expressjs-and-socketio/
Description: We would like to announce the release of our open source small project, a real time chat room with Text, Image and File transfer support. Built on NodeJS, ExpressJS and Socket.IO.
# Real-time Chat Room with Text, Image and File Support Built on Node.js, Express.js and Socket.io
**by:** Systenics Team **in:** [Programming](https://www.systenics.com/blogs/category/programming/) **tags:**[*Node.js*](https://www.systenics.com/blogs/tag/nodejs/), [*Socket.io*](https://www.systenics.com/blogs/tag/socketio/)
## Overview
We would like to announce the release of our open source small project, a real time chat room with Text, Image and File transfer support. Built on NodeJS, ExpressJS and Socket.IO.
[**You can see the live demo here**](http://chat.systenics.com/)
## Features
- Provides chat messaging using socket.io
- Allows file sharing of image,doc,pdf,excel,text and mp3.
- Periodic file deletion to save server space.
- Quick messaging and file sharing using formadible
## Screen Shots
Figure1: Login page
Figure 2: Chat Room
## Installation
You need node,npm and bower installed globally:
```
- Step1: Clone ChatRoom repository locally
```
```
- Step2: cd into cloned directory
```
```
- Step3: install dependencies using commands
```
```
$ sudo npm install
```
```
$ bower install
```
```
- Step4: cd into and edit app.js
set $rootScope.baseUrl to
set $socketProvider.setConnectionUrl('http://your_ip_address:8282')
```
```
- Step5: run project using node app.js in terminal
```
```
- Step6: go to your browser and enter url
```
File shared among users will be stored in /public/app/upload in respective doc, music and image directory. The files in upload directory are stored with some expiry time (8 hours), the files will be deleted after expiry time. The routine_cleanup function deletes files after every one hour.
you can change the file expiry time by changing variable expiryTime and routine cleanup time by changing variable routineTime in app.js.
## Technologies Used
ChatRoom uses a number of open source projects to work properly:
- [AngularJS] - HTML enhanced for web apps!
- [Bootstrap] - great UI boilerplate for modern web apps
- [AdminLTE] - great UI based on bootstrap
- [node.js] - evented I/O for the backend
- [Express] - fast node.js network app framework
- [jQuery] - javascript library
- [lightbox] - javascript plugin for image pop-ups
## Get Source
And of course ChatRoom itself is open source with a [public repository](https://github.com/systenics/ChatRoom) on GitHub.
## Related pages on Systenics
- [Live auctions features](https://www.systenics.com/auctionworx/live-auctions/)
## Need help implementing this for your business?
Our team helps plan, build, and scale marketplace and auction workflows. Explore [industry solutions](https://www.systenics.com/solutions/), [platform products](https://www.systenics.com/products/), and [custom development services](https://www.systenics.com/auctionworx/development-and-customization/) tailored to your goals.
[Book a quick consultation](https://outlook.office.com/bookwithme/user/231015685f21467da5ef6e3eb8b50240@systenics.com/meetingtype/hbYq2z1Hj0C2e7DuwBqdnw2?anonymous&ep=mcard).
---
## Page: Publishing Umbraco 13 to Production
URL: https://www.systenics.com/blogs/publishing-umbraco-13-to-production/
Description: This blog post focuses on steps to be taken to publish Umbraco 13 in a Production environment.
# Publishing Umbraco 13 to Production
**by:** Saurabh Nandu **in:** [Programming](https://www.systenics.com/blogs/category/programming/) **tags:**[*Umbraco*](https://www.systenics.com/blogs/tag/umbraco/)
## Overview
In this blog we will try to cover some of the recommended steps that should be taken when publishing Umbraco 13 based website to production. The official documentation does have lot of parts covered, but there are a few gaps which we wish to cover in this blog.
We are using the Umbraco The Starter Kit [ https://docs.umbraco.com/umbraco-cms/tutorials/starter-kit ] as the base project for this blog post.
## Project Setup
Assuming you are using Visual Studio 2019, clone the source for The Starter Kit project from Github site [ https://github.com/umbraco/The-Starter-Kit/tree/release-13.0.0 ] (ensure you use the Release Tags feature to select the right version of the source code you wish to use.). Set the Umbraco.SampleSite.Web project as the start-up project in Visual Studio and run the solution and run the project.
Figure 1: Install Umbraco
The first time you run the project Umbraco will ask you standard questions to setup username and password and click Next to complete setup and run the site. We are going to stick with the standard Stater Kit for the purposes of the blog.
## Preparing for Production
-
### Add appsettings.Production.json settings file
Add the appsettings.Production.json settings file if not already added to your project in Visual Studio. This settings file will have the settings needed for the production environment. Umbraco documentation [ https://docs.umbraco.com/umbraco-cms/fundamentals/setup/server-setup/runtime-modes#production-mode ] does provide good guidelines to setup the production settings to prepare Umbraco for production environment. There is also detailed docs provided for all the settings at[ https://docs.umbraco.com/umbraco-cms/reference/configuration ]. We are picking the settings which seem most relevant to productions environments.
The Connection string should be updated to point to the prod database, if hosted on the cloud, Key Vault or similar secrets services can be used to store the conection string securely.
```
{
"ConnectionStrings": {
"umbracoDbDSN": "Server=production-server;Database=UmbracoProductionDB;User Id=username;Password=password;"
}
}
```
Logging: Adjust the Logging levels for production to limit the size of the logs.
```
{
"Serilog": {
"MinimumLevel": {
"Default": "Information",
"Override": {
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
}
}
}
```
Umbraco Specific Settings: Configure Umbraco for production use and optimize for production caching. It is important to set the Runtime setting to Production to ensure proper caching fromthe CMS.
```
{
"Umbraco": {
"CMS": {
"Hosting": {
"Debug": false
},
"RuntimeMinification": {
"UseInMemoryCache": true,
"CacheBuster": "AppDomain"
},
"Runtime": {
"Mode": "Production"
},
"ModelsBuilder": {
"ModelsMode": "Nothing"
},
"WebRouting": {
"DisableRedirectUrlTracking": true
}
}
}
}
```
Update the Production site URL as well as SMTP server settings.
-
### Database Selection
The Starter Kit uses SQLLite database, so that it does not need any additional Database engine. SQLLite is wildly popular and can also be used in production for smaller websites. It simplifies the deployment and saves cost of hosting a SQL Server database. Although if you are going to host a popular CMS with a large number of visitors it may be best to migrate the database to SQL Server. There are several tools like [ https://erikej.github.io/SqlCeToolbox/ ] which can help in the migration of the database. In case you decide to migrate the database, make sure you update the appsettings.Production.json settings file to have the right connection string to the production database.
-
### robots.txt
Update your robots.txt file to allow or disallow search engine crawling as appropriate for your production site.
-
### Publish - Release Build
Publish the build in release mode for production deployment. A folder publish to manually transfer the files to the production server. Alternatively, we can directly publish from VS to Azure.
## Related pages on Systenics
- [AuctionWorx products](https://www.systenics.com/products/)
## Need help implementing this for your business?
Our team helps plan, build, and scale marketplace and auction workflows. Explore [industry solutions](https://www.systenics.com/solutions/), [platform products](https://www.systenics.com/products/), and [custom development services](https://www.systenics.com/auctionworx/development-and-customization/) tailored to your goals.
[Book a quick consultation](https://outlook.office.com/bookwithme/user/231015685f21467da5ef6e3eb8b50240@systenics.com/meetingtype/hbYq2z1Hj0C2e7DuwBqdnw2?anonymous&ep=mcard).
---
## Page: Offshore vs Nearshore vs Local Developers for SMBs
URL: https://www.systenics.com/blogs/offshore-vs-nearshore-vs-local-software-developers-us-small-business/
Description: An honest perspective from an offshore software founder on choosing between local, nearshore, and offshore development for your business.
# Offshore vs Nearshore vs Local Developers for SMBs
**by:** Saurabh Nandu **in:** [General](https://www.systenics.com/blogs/category/general/) **tags:**[*Dedicated Teams*](https://www.systenics.com/blogs/tag/dedicated-teams/), [*Offshore Development*](https://www.systenics.com/blogs/tag/offshore-development/), [*SMB Growth*](https://www.systenics.com/blogs/tag/smb-growth/), [*Custom Software*](https://www.systenics.com/blogs/tag/custom-software/)
Let us address the elephant in the room. When you consider partnering with an overseas software company, you naturally wonder whether an engineering team thousands of miles away can be counted on with your software, confidential data, and strict deadlines. That concern is entirely justified. I am Saurabh Nandu, co-founder of Systenics Solutions, and I have spent nearly two decades architecting custom .NET, web, and Microsoft Azure platforms for US small and mid-sized businesses from our tech hub in Navi Mumbai. Here is my honest, candid take on when offshore development makes smart business sense, when it does not, and how nearshore and domestic options compare.
## Evaluating the Three Development Delivery Models
Small and mid-market business owners sourcing custom engineering generally choose among three distinct operational models, each offering unique trade-offs across cost, communication, and talent access.
**Local: Domestic US agencies or independent consultants.** Partnering locally means your team works in the same time zone, can hold whiteboard sessions face to face, and shares identical cultural references. The limitation is usually capacity and budget. Senior domestic developers command premium rates, and smaller companies often find themselves limited to whatever local talent happens to be available.
**Nearshore: Teams in Latin America or Canada.** Nearshore partners typically operate within one to three hours of US business hours, making morning stand-ups and real-time collaboration straightforward. Travel for on-site visits is convenient, and billing rates sit midway between local and offshore tiers. While talent pools are larger than a single local market, technical depth in specialized stacks can still vary.
**Offshore: Established teams in India, Eastern Europe, or Southeast Asia.** Working offshore involves noticeable time zone variance, which requires structured overlap windows and deliberate written documentation. In return, businesses gain direct access to deep benches of senior .NET, Azure, cloud, and AI engineers. The favorable cost structure allows growing companies to fund a complete multidisciplinary engineering Squad for the cost of a single domestic freelancer.
## Side-by-Side Comparison
Factor Local Nearshore Offshore Cost profile Highest overall hourly investment Moderate savings compared to local Exceptional value for senior engineering talent Working-hour overlap Full alignment across business hours Substantial real-time daily overlap Targeted overlap windows with structured async updates Communication style Informal chats and in-person check-ins Real-time messaging with weekly syncs Detailed written specs, recorded reviews, and scheduled demos IP and legal protection Direct domestic legal jurisdiction Close jurisdictional frameworks Explicit contractual IP assignments and standard US NDAs Scaling agility Fast kickoff, slower to expand team size Rapid start and moderate scaling ability Fast onboarding of specialized full-stack engineering pods Optimal project fit Short exploratory spikes and on-site hardware setups Medium applications requiring continuous daylong chatter Dedicated product builds, platform scaling, and cloud modernizations
## When Offshore Is Not the Right Fit
Offshore development is not a silver bullet for every software problem, and any technology partner claiming otherwise is not being realistic.
- Quick one-off bug fixes or brief scripting updates that take only an afternoon do not warrant an offshore team; a local freelancer is your best bet.
- If your application involves physical interaction with local warehouse hardware, proprietary laboratory equipment, or daily on-site presence, offshore simply cannot accommodate that requirement.
- If an agency balks at writing down specifications, architectural choices, and clear acceptance criteria, do not proceed regardless of geography. Offshore partnerships flourish only when documentation is rigorous.
- If your data environment involves strict federal defense or statutory compliance that explicitly forbids code access outside the United States, offshore engagements are off the table.
## How a Professional Offshore Squad Builds Trust
The underlying anxiety behind remote offshore engineering usually boils down to accountability: will this team deliver on schedule, maintain quality, and safeguard our intellectual property? Those challenges are thoroughly solved with disciplined operational processes. Here is how our Squad at Systenics approaches our [custom software solutions](https://www.systenics.com/solutions/):
We establish guaranteed daily US working-hour overlap windows so your team participates in live sprint planning, stand-ups, and interactive demos. We draft detailed requirements and technical specifications before writing code, eliminating surprises weeks into the engagement. Following initial discovery, we quote transparent, fixed-price milestones so you review and approve working software before releasing payments. Crucially, you retain full, unreserved ownership of Git repositories, cloud subscriptions, and architecture from the very first commit. We also readily connect prospective clients directly with our long-term US partners so you can hear about our delivery firsthand. Learn more about how we structure dedicated teams in our guide on [why SMBs choose a dedicated .NET development Squad](https://www.systenics.com/blogs/why-smbs-choose-dedicated-dotnet-development-squad/), and explore our background on our [about us page](https://www.systenics.com/about-us/).
## Seven Essential Questions to Ask Before Signing
- Do our agreements state in writing that we own all intellectual property and cloud infrastructure from day one?
- What specific hours will the development team be online and actively collaborating with our team?
- What does your documentation and sprint review process look like, and can we review a sample?
- What contingency protocols and knowledge-transfer systems protect our project if an engineer changes roles?
- Can we speak directly and candidly with active, long-standing client references?
- Is the project kicked off with a defined discovery milestone, or are we locked into an open-ended engagement?
- How are milestone deliverables defined, tested, and validated prior to invoice approval?
## Frequently Asked Questions
### Is offshore software development safe for a small business?
Yes, provided your vendor operates under a binding written agreement with clear intellectual property assignment, strong NDAs, and direct access to your code repositories and cloud accounts from day one. Geographic location is rarely the problem; working with vendors who avoid clear written commitments is where risks emerge.
### What is the difference between nearshore and offshore development?
Nearshore development typically refers to partner teams located in Canada or Latin America operating within or close to US working hours. Offshore development involves engineering teams based in regions like India, Eastern Europe, or Southeast Asia. While time zones differ, reputable offshore partners establish dedicated overlap windows and clear written communication to keep sprints synchronized.
### How do I hire offshore developers as a small business?
Begin with a well-defined discovery sprint instead of signing a massive open-ended agreement. Insist on clear written technical specifications, scheduled live demonstrations, milestone-based invoicing, and unreserved ownership of the source code. Request direct calls with current reference clients before finalizing your engagement.
### When should a small business avoid offshore development?
Avoid offshore setups for minor ad-hoc tasks requiring only a few hours of work, systems demanding daily physical on-site access to specialized hardware, or proprietary systems governed by strict statutory regulations prohibiting data from leaving the United States.
### What should I ask an offshore or nearshore vendor before signing?
Verify who owns the source code and production infrastructure in writing, what daily overlap hours are guaranteed, how requirements are tracked, what continuity plans protect against staff turnover, and whether you can speak directly with active client references.
## Let Us Plan Your Next Mission
Finding the right engineering balance is about aligning your budget, technical roadmap, and communication needs. If you would like an experienced perspective on how our Squad can help you launch or scale your application, book a time on my calendar to talk through your goals.
[Connect for mission launch **](https://outlook.office.com/bookwithme/user/231015685f21467da5ef6e3eb8b50240@systenics.com/meetingtype/hbYq2z1Hj0C2e7DuwBqdnw2?anonymous&ep=mcard)
## Related pages on Systenics
- [AuctionWorx development and customization](https://www.systenics.com/auctionworx/development-and-customization/)
- [About Systenics](https://www.systenics.com/about-us/)
## Need help implementing this for your business?
Our team helps plan, build, and scale marketplace and auction workflows. Explore [industry solutions](https://www.systenics.com/solutions/), [platform products](https://www.systenics.com/products/), and [custom development services](https://www.systenics.com/auctionworx/development-and-customization/) tailored to your goals.
[Book a quick consultation](https://outlook.office.com/bookwithme/user/231015685f21467da5ef6e3eb8b50240@systenics.com/meetingtype/hbYq2z1Hj0C2e7DuwBqdnw2?anonymous&ep=mcard).
---
## Page: Migrating Legacy ASP.NET (.NET Framework & MVC) to .NET 10: The Practical SMB Modernization Playbook
URL: https://www.systenics.com/blogs/migrating-legacy-aspnet-to-dotnet-10-smb-modernization-playbook/
Description: A risk-managed engineering playbook for business owners and engineering leaders modernizing legacy .NET Framework, WCF, and ASP.NET MVC apps to .NET 10 without costly full rewrites.
# Migrating Legacy ASP.NET (.NET Framework & MVC) to .NET 10: The Practical SMB Modernization Playbook
**by:** Saurabh Nandu **in:** [Programming](https://www.systenics.com/blogs/category/programming/) **tags:**[*.NET*](https://www.systenics.com/blogs/tag/net/), [*ASP.NET Core*](https://www.systenics.com/blogs/tag/aspnet-core/), [*Azure*](https://www.systenics.com/blogs/tag/azure/), [*Cloud Architecture*](https://www.systenics.com/blogs/tag/cloud-architecture/)
If your business is still running critical line-of-business applications on .NET Framework 4.x, older ASP.NET MVC, or WCF services, you are in good company. Across small and mid-sized businesses, thousands of dependable systems built a decade ago still process millions in daily revenue.
They function reliably day-to-day, but beneath the surface, technical debt accumulates quietly:
- **High Infrastructure Expenses:** Legacy .NET Framework ties your applications exclusively to Windows Server VMs, cutting you off from lightweight Linux containers, Azure Container Apps, and cost-effective serverless architectures.
- **Security and Compliance Challenges:** Aging library dependencies and deprecated cryptographic protocols trigger red flags during modern enterprise security audits.
- **Hiring Difficulties:** Senior engineers want to build with modern C# language features and high-performance runtime tooling. Maintaining monolithic decade-old codebases often slows down release velocity and hurts team morale.
With the arrival of **.NET 10**, cloud-native container density and runtime performance have reached unprecedented heights. But how do you make the leap without getting trapped in a multi-year, budget-draining total rewrite?
Here is the pragmatic, battle-tested migration playbook our Superhero Squad uses to modernize legacy .NET estates with **100% Mission Success**.
## Why Total Rewrites Fail Most of the Time
When teams realize their legacy codebase is showing its age, the instinctive reaction is often: *"Let's scrap everything and build it from scratch with modern tech."*
In practice, total rewrites are extraordinarily risky for growing businesses. Ten years of nuanced business rules, forgotten edge cases, custom tax calculations, and database optimizations live inside the existing code. When you rewrite from zero:
- New feature development grinds to a halt for 12 to 18 months while engineers re-implement existing functionality.
- Budgets frequently double as undocumented legacy requirements surface midway through the rebuild.
- A big-bang cutover carries immense operational risk for your paying customers.
There is a far smarter approach: **The Strangler Fig Modernization Pattern**.
## The Strangler Fig Strategy: Modernizing Incrementally Without Downtime
Named after the Australian tree that grows around an existing host until it stands independently, the Strangler Fig pattern allows you to replace legacy subsystems piece-by-piece while both old and new runtimes operate concurrently in production.
### Phase 1: Architectural Audit and Assembly Decoupling
Before migrating web controllers, examine the class libraries underneath. Legacy systems frequently entangle database queries, business rules, and UI rendering into tight couplings.
- **Analyze Dependencies:** Identify legacy APIs like `System.Web`, `HttpContext.Current`, WCF bindings, or outdated FormsAuthentication handlers.
- **Target .NET Standard 2.0:** Refactor shared domain logic and calculation libraries to target `.NET Standard 2.0`. Because both .NET Framework 4.6.2+ and modern .NET 10 can consume .NET Standard 2.0 assemblies, you can share code across old and new runtimes simultaneously without duplicating code.
### Phase 2: Reverse Proxy Routing with YARP
To avoid migrating every endpoint at once, place Microsoft's **YARP (Yet Another Reverse Proxy)** in front of your domain.
All incoming web requests initially route through the reverse proxy directly to your existing legacy IIS backend. As individual controllers, API routes, or feature areas are migrated to new .NET 10 services, the proxy routes those specific URL paths (such as `/api/v2/orders` or `/checkout`) to the new container. To your end users and client applications, the transition happens invisibly.
### Phase 3: Database and ORM Modernization
Upgrading your data access layer from older Entity Framework 6 or Linq-to-SQL to modern **Entity Framework Core** unlocks dramatic performance improvements.
Modern EF Core on .NET 10 provides compiled queries, batch updates, query splitting, and vector support that routinely cut query execution times by 40% to 60%. For read-heavy, high-throughput microservices, pairing EF Core with micro-ORMs like Dapper yields near-raw SQL execution speeds with minimal memory overhead.
### Phase 4: Modernizing Services with gRPC and REST Minimal APIs
Windows Communication Foundation (WCF) was an enterprise standard years ago, but it lacks native runtime support in modern cross-platform .NET.
During modernization, internal service-to-service communication shifts to **gRPC** for binary-serialized, sub-millisecond calls, or clean RESTful ASP.NET Core Minimal APIs with built-in OpenAPI documentation.
## The Direct Business ROI of .NET 10
Modernization is not just about cleaner code; it delivers direct financial returns:
Dimension Legacy .NET Framework 4.8 Modern .NET 10 on Azure **Operating System** Windows Server (expensive per-core licensing) Linux Containers (Alpine or Debian with zero OS licensing costs) **Hosting Density** Heavy IIS app pools on dedicated VMs Lightweight Azure Container Apps with auto-scaling to zero **Memory Footprint** 300MB to 1GB+ per worker process 40MB to 120MB per container instance **Throughput and Concurrency** Limited thread pool scalability Asynchronous execution, Span, hardware vectorization, and minimal allocations
## How Our Dedicated Squad Accelerates Your Modernization
Your internal engineers are already focused on supporting existing customers and shipping daily updates. Asking them to research breaking framework changes and rebuild legacy architectures on the side often leads to burnout and missed deadlines.
Through our [Dedicated Development Squad](https://www.systenics.com/solutions/) model, Systenics supplies experienced, senior .NET engineers who specialize in migration and modernization missions:
- **Fixed-Cost Discovery and Roadmapping:** We audit your legacy codebase, identify hidden dependency risks, and provide a fixed-price milestone roadmap before work begins.
- **Zero Business Disruption:** We build incrementally using the Strangler pattern, delivering working milestones while your core application runs uninterrupted.
- **Hands-On Knowledge Transfer:** Once the modern .NET 10 system is live on Azure, our Squad conducts comprehensive training with your in-house team on modern CI/CD, telemetry, and container operations.
## Ready to Modernize Your .NET Application?
Do not let legacy architecture hold back your growth or inflate your cloud hosting bills. Connect with our Superhero Squad to plan a risk-free modernization to .NET 10 with clear milestones and full transparency.
[Connect for Mission Launch **](https://outlook.office.com/bookwithme/user/231015685f21467da5ef6e3eb8b50240@systenics.com/meetingtype/hbYq2z1Hj0C2e7DuwBqdnw2?anonymous&ep=mcard)
## Need help implementing this for your business?
Our team helps plan, build, and scale marketplace and auction workflows. Explore [industry solutions](https://www.systenics.com/solutions/), [platform products](https://www.systenics.com/products/), and [custom development services](https://www.systenics.com/auctionworx/development-and-customization/) tailored to your goals.
[Book a quick consultation](https://outlook.office.com/bookwithme/user/231015685f21467da5ef6e3eb8b50240@systenics.com/meetingtype/hbYq2z1Hj0C2e7DuwBqdnw2?anonymous&ep=mcard).
---
## Page: Auction Platform Lessons for Marketplace Builders
URL: https://www.systenics.com/blogs/lessons-from-auction-platforms-for-building-a-marketplace/
Description: Over fifteen years of engineering auction platforms taught us what makes two-sided marketplaces thrive. Here is what we have learned.
# Auction Platform Lessons for Marketplace Builders
**by:** Saurabh Nandu **in:** [General](https://www.systenics.com/blogs/category/general/) **tags:**[*Marketplace*](https://www.systenics.com/blogs/tag/marketplace/), [*AuctionWorx*](https://www.systenics.com/blogs/tag/auctionworx/), [*Custom Software*](https://www.systenics.com/blogs/tag/custom-software/), [*Product Strategy*](https://www.systenics.com/blogs/tag/product-strategy/)
Having spent over fifteen years building and tailoring high-volume auction platforms, I can tell you that online auctions are the ultimate proving ground for two-sided marketplaces. Both buyers and sellers must arrive simultaneously, countdown timers run in real time, substantial money changes hands, and transaction disputes inevitably arise. The engineering lessons we have learned building on AuctionWorx apply directly to any multi-sided marketplace you set out to launch.
## Liquidity Comes Before Features
An auction site with zero active bidders is worse than an offline catalog. It immediately signals to first-time visitors that the market is inactive, and perceived inactivity destroys trust before your product can get off the ground. Sellers who list products once to find empty rooms rarely return, and buyers who browse barren listings do not bother bookmarking the site.
This reality governs every marketplace platform we engineer. Before our Squad refines sophisticated search filters or designs recommendation feeds, we collaborate with operators to make sure day-one liquidity is secured. That often means curating initial inventory by hand, pre-registering an initial buyer circle eager for those listings, and only then adding nice-to-have browsing features. Real liquidity is the actual product; everything else is built to support it.
## Trust and Dispute Resolution Are Core Products
In dynamic marketplaces, trust cannot be treated as a secondary feature added down the road. Rigorous identity and payment verification keep bad actors from placing fraudulent bids. Transparent seller feedback gives buyers confidence to spend significant sums. And when a buyer defaults on payment or requests a return, the platform must provide a clear, fair dispute workflow to prevent brand reputation from evaporating overnight.
Founders sometimes treat dispute handling and user verification as informal tasks to handle over email until volume scales. That is a costly mistake. Buyer verification, seller rating algorithms, non-payment protocols, and automated refunds are foundational platform features. Integrating them into your architecture from the outset earns the user confidence needed to scale sustainably.
## Payments and Payouts Make or Break the Business
Marketplaces coordinate financial transfers between parties with distinct fees, premiums, and payouts attached to every completed trade. If a payout is delayed, a buyer premium calculates incorrectly, or a refund stalls, users do not just complain; they abandon the platform entirely.
This financial plumbing deserves careful engineering. Secure escrow holds protect both counterparties until fulfillment conditions are satisfied. Split payouts automatically allocate seller proceeds while routing platform fees directly into company merchant accounts. Clear handling of buyer fees, chargebacks, sales tax, and automated settlement reports may not look exciting on a pitch deck, but they ensure your business survives and scales safely.
## Mobile Readiness Is Not a Phase-Two Item
Look at user behavior during the final moments of a timed auction and mobile necessity becomes obvious. Bidders are rarely seated in front of a multi-monitor desktop setup. They are checking updates on their smartphones between meetings, commuting, or spending time with family, making final bids right from their phones. Delaying mobile support means losing transactions at the exact moment purchase intent peaks. We dive into this dynamic in our article on [why an AuctionWorx mobile app is essential for growth](https://www.systenics.com/blogs/why-an-auctionworx-mobile-app-is-essential-for-growth/).
Every modern marketplace features its own critical moment, such as accepting an incoming offer, snagging flash inventory, or confirming quick delivery. Architecting a polished mobile web and native app experience from your first development milestone ensures you capture those conversions.
## Back-Office Administration Is Half the Platform
Public storefronts capture most of the excitement when designing marketplace concepts, but operational administration tools determine whether the platform runs profitably. Reliable catalog management tools, automated batch invoicing, item moderation queues, and operational dashboards allow operators to see what is happening across inventory lanes at any moment.
We architect every marketplace mission with powerful administrative controls baked in from day one. Without solid back-office tools, scaling volume does not produce efficiency; it simply buries your operational team in chaotic manual spreadsheets and support emails.
## Structured Cataloging and Fast Search Drive Revenue
In marketplace environments, listing conversions rely heavily on how effectively items are cataloged. Well-defined attributes and taxonomy let buyers filter directly to what they need. Crisp photography, structured specifications, and honest condition ratings convert casual browsers into confirmed buyers. Poorly structured items remain invisible regardless of their underlying market value.
Consistent data modeling is not administrative busywork; it is the engine that pairs ready buyers with relevant inventory. Investing in structured taxonomy and intuitive search early pays ongoing dividends across your entire customer acquisition funnel.
## Build for Extensibility, Not Continuous Rewrites
The reason we have successfully expanded AuctionWorx environments for fifteen years without starting from scratch is strict architectural separation. Custom business rules, external connectors, and bespoke workflows live outside the core application engine, allowing underlying platform versions to update cleanly. When developers patch modifications directly into vendor source code, every future update risks breaking vital functionality.
When our Squad builds custom marketplaces, we follow the same design discipline. Custom APIs, payment gateways, and proprietary business logic connect through modular interfaces. This architecture allows your marketplace to evolve gracefully as business models pivot, sparing you costly rewrites every time your strategy expands.
## Scoping a Lean Marketplace MVP with Predictable Milestones
Every marketplace build begins with an in-depth discovery sprint. We map buyer and seller personas, identify primary transaction loops, and evaluate potential fraud risks. From there, we scope the leanest viable software slice that empowers buyers and sellers to transact safely: item listing, real-time bidding or instant purchase, split settlement, basic trust metrics, and essential admin visibility.
Secondary features such as advanced personalization or multi-tier loyalty mechanics can wait for subsequent releases once user demand validates your market. We deliver projects through transparent milestone billing tied to demonstrable software, and you retain complete source code ownership upon launch. If you are comparing a bespoke build against commercial platforms, explore our analysis on [build vs buy: custom software vs SaaS for small business](https://www.systenics.com/blogs/build-vs-buy-custom-software-vs-saas-small-business/). You can explore our deep auction platform experience on [our AuctionWorx hub](https://www.systenics.com/auctionworx/) and view our broader capabilities on [our solutions page](https://www.systenics.com/solutions/).
## Frequently Asked Questions
### How do I build a two-sided marketplace?
Start by cultivating both sides of the transaction together. Bring a committed cohort of active sellers and an engaged audience of qualified buyers into your platform before pouring resources into elaborate feature roadmaps. Anchor trust, frictionless payments, and operator admin controls around that core transaction loop, and expand progressively.
### What does marketplace software development actually involve beyond the buyer-facing app?
Customer-facing storefronts and mobile apps represent only part of the platform. The unsung foundation is back-office tooling: inventory cataloging, multi-party invoicing, dispute mediation, moderation queues, and financial reconciliations. Without solid admin capabilities, operators spend endless hours handling exceptions manually.
### How much does it cost to build a marketplace platform for a small business?
Costs depend heavily on scoping and whether you use established application foundations like AuctionWorx or build every component from scratch. A disciplined MVP focusing on a validated transaction flow with payments and admin visibility is much more affordable and faster to launch than an open-ended mega build.
### What is a marketplace MVP and what should it include?
A marketplace MVP represents the leanest platform that enables a verified buyer and seller to complete a real financial transaction safely. That requires listing creation, bidding or checkout, escrow or split payments, fundamental reputation signals, and basic admin oversight. Secondary enhancements such as AI recommendations or complex loyalty tiers can follow in subsequent phases.
### Why is mobile important for a marketplace from day one?
In real-time trading and auctions, key decisions happen in closing minutes when users are on the go. The same dynamic applies across all marketplaces when items sell quickly, bids update, or counteroffers arrive. Mobile responsiveness is not an optional afterthought; it is where active transactions conclude.
If you are designing a new marketplace platform and want practical guidance from a Squad with over fifteen years of deep domain experience, let us connect to plan your mission launch.
[Connect for mission launch **](https://outlook.office.com/bookwithme/user/231015685f21467da5ef6e3eb8b50240@systenics.com/meetingtype/hbYq2z1Hj0C2e7DuwBqdnw2?anonymous&ep=mcard)
## Related pages on Systenics
- [AuctionWorx platform overview](https://www.systenics.com/auctionworx/)
- [AuctionWorx products](https://www.systenics.com/products/)
- [Industry solutions](https://www.systenics.com/solutions/)
## Need help implementing this for your business?
Our team helps plan, build, and scale marketplace and auction workflows. Explore [industry solutions](https://www.systenics.com/solutions/), [platform products](https://www.systenics.com/products/), and [custom development services](https://www.systenics.com/auctionworx/development-and-customization/) tailored to your goals.
[Book a quick consultation](https://outlook.office.com/bookwithme/user/231015685f21467da5ef6e3eb8b50240@systenics.com/meetingtype/hbYq2z1Hj0C2e7DuwBqdnw2?anonymous&ep=mcard).
---
## Page: Integration of Nexmo SMS and Verify API using C# for AuctionWorx
URL: https://www.systenics.com/blogs/integration-of-nexmo-sms-and-verify-api-using-c-for-auctionworx/
Description: This tutorial explains how to use Nexmo SMS and Verify API to add additional functionality into AuctionWorx web application.
# Integration of Nexmo SMS and Verify API using C# for AuctionWorx
**by:** Shruti Sawant **in:** [Programming](https://www.systenics.com/blogs/category/programming/) **tags:**[*AuctionWorx*](https://www.systenics.com/blogs/tag/auctionworx/), [*C#*](https://www.systenics.com/blogs/tag/c-sharp/), [*ASP.NET MVC*](https://www.systenics.com/blogs/tag/aspnet-mvc/)
## Introduction
This tutorial explains how to use Nexmo SMS and Verify API to add additional functionality into AuctionWorx MVC application. Nexmo SMS API is used to send and receive a high volume of SMS anywhere in the world. There are many APIs Nexmo provides and in this article I am going to explain two APIs - SMS and Verify.
For teams planning SMS notifications, buyer verification, or other custom AuctionWorx workflows, our[AuctionWorx development and customization services](https://www.systenics.com/auctionworx/development-and-customization/) cover implementation, testing, and platform-specific integration work.
Nexmo even provides an official [Nexmo Client Library for C#/.NET](https://github.com/Nexmo/nexmo-dotnet) for .Net Framework 4.5.2 and above which will allow you to integrate their API calls with your C# application. But in our case, we had an older version of AuctionWorx MVC application which was running on .Net Framework 4.5.1 and hence we decided to write our own code to call their APIs. Refer [this link](https://github.com/Nexmo/nexmo-dotnet/issues/3) to know more about .Net Framework issue on Nexmo GitHub.
## Pre-requisites
1. Mobile or landline phone number (mobile preferred to receive SMS).
2. [Nexmo Test Account](https://dashboard.nexmo.com/sign-up) - you can create a test account using your mobile or landline phone number and Nexmo provides free credit which is enough to get started to learn how to use their APIs in your application.
3. Visual Studio (C#)
## Nexmo SMS API
1. It is used to send SMS to given number. Using this API, you can send any customize text message. It follows below scenario.
2. Create Request: Send a request to Nexmo to send SMS to user.
3. Get Response: Gives response to ensure that SMS request you sent is successful.
### SMS API Request
This is rest API. For e.g. https://rest.nexmo.com/sms/json?api_key=xxxxxxxx&api_secret=xxxxxxxx&to=ToNumber&from=FromNumber&text=hello+test+message
Where,
a. https://rest.nexmo.com/sms is Base URL. All the request to the SMS API must use this URL. Your base URL becomes either: json / XML (https://rest.nexmo.com/sms/json or https://rest.nexmo.com/sms/xml)
b. **api_key** and **api_secret**: Nexmo provides this "api_key" and "api_secret" from [Nexmo Dashboard](https://dashboard.nexmo.com/sign-in)
c. **to**: A single phone number in international format. You can set one recipient only for each request.
d. **from**: A single phone/mobile number with country code from which SMS is going to be sent.
e. **text**: The SMS body. Messages where "type" is "text" (the default) are in UTF-8 with URL encoding.
Let's start with the coding :)
1. Create 2 model classes - SmsResponse and Message.
```
public class SmsResponse
{
public string MessageCount { get; set; }
public List Messages { get; set; }
}
public class Message
{
public string To { get; set; }
public string MessageId { get; set; }
public string Status { get; set; }
public string RemainingBalance { get; set; }
public string MessagePrice { get; set; }
public string Network { get; set; }
public string From { get; set; }
}
```
2. Create class "SMS" and create a method "SendSms" of return type "SmsResponse" and pass "to" number and "type=text" string as a parameter.
3. Now to send request to Nexmo SMS API, use following code:
```
string uri = string.Format("{0}/sms/json?from={1}&to={2}&text={3}&api_key={4}&api_secret={5}&type={6}",
ConfigurationManager.AppSettings["Nexmo.Url.Rest"],
HttpUtility.UrlEncode(ConfigurationManager.AppSettings["Nexmo.from_number"]),
HttpUtility.UrlEncode(toNumber),
HttpUtility.UrlEncode(text),
HttpUtility.UrlEncode(ConfigurationManager.AppSettings["Nexmo.api_key"]),
HttpUtility.UrlEncode(ConfigurationManager.AppSettings["Nexmo.api_secret"]),
type);
var json = new WebClient().DownloadString(uri);
```
Here you have to add "api_key" and "api_secret" as I mentioned above. I have added this key-value pair in web.config file as shown below.
```
```
4. To get the SMS API response:
```
SmsResponse result = JsonConvert.DeserializeObject(json);
```
### SMS API Response
Each request you make using the SMS API returns a response - the "status" and "price" of your request to Nexmo in JSON or XML format. Each response comes in specific format with key and value pair.
```
{
"message-count": "1",
"messages": [
{
"status": "returnCode",
"message-id": "messageId",
"to": "to",
"client-ref": "client-ref",
"remaining-balance": "remaining-balance",
"message-price": "message-price",
"network": "network",
"error-text": "error-message"
}
]
}
```
[Refer this link](https://docs.nexmo.com/messaging/sms-api/api-reference#keys) for detail information. I have attached the output of the SMS API below.
Figure 1: Output for SMS API Sample
## Nexmo Verify API
Nexmo Verify API is used to send a PIN by SMS or Text-To-Speech in order to prove that a user can be contacted on a specific phone number.
By default, the Nexmo Verify API sends PIN (OTP) by an SMS. Due to some reason if there is no reply, it sends PIN by TTS. The reason can be the receiver number user is providing might be a landline number.
This can be used to verify that a phone number is valid, reachable and accessible by that user.
### Verify API Request
A Verify API request looks like: https://api.nexmo.com/verify/json?api_key=xxxxxxxx&api_secret=xxxxxxxx&number=xxxxxxxxxxxx&brand=MyApp
Where,
a. https://api.nexmo.com/verify is Base URL. All the request to the SMS API must use this URL. Your base URL becomes either: json / XML (https://api.nexmo.com/verify/json or https://api.nexmo.com/verify/xml)
b. **api_key** and **api_secret**: Nexmo provides this "api_key" and "api_secret" from [Nexmo Dashboard](https://dashboard.nexmo.com/sign-in)
c. **to**: A single phone number in international format. You can set one recipient only for each request.
d. **number**: A single phone/mobile number with country code to which PIN is going to be sent.
e. **brand**: The name of the company or application for which you are using Verify API. For example: "Your brand PIN is ...". For more details, [click here](https://docs.nexmo.com/verify/api-reference/api-reference#vrequest).
1. Create 2 model classes - JsonResponse and JsonVerifyCheckResponse.
```
public class JsonResponse
{
public string RequestId { get; set; }
public int Status { get; set; }
}
public class JsonVerifyCheckResponse
{
public string EventId { get; set; }
public int Status { get; set; }
public decimal Price { get; set; }
public string Currency { get; set; }
public string Error { get; set; }
public string RequestId { get; set; }
}
```
2. Create another class "CallTTS" and add method into it named "SendSMSOrCall" with return type "JsonResponse"
3. Now to send request to Verify API, add following line:
```
string uri = string.Format("{0}/verify/json?api_key={1}&api_secret={2}&number={3}&brand={4}",
ConfigurationManager.AppSettings["Nexmo.Url.Api"],
HttpUtility.UrlEncode(ConfigurationManager.AppSettings["Nexmo.api_key"]),
HttpUtility.UrlEncode(ConfigurationManager.AppSettings["Nexmo.api_secret"]),
HttpUtility.UrlEncode(toNumber),
"--your app name goes here--");
var json = new WebClient().DownloadString(uri);
```
You can use more parameters as you want. For more details, [click here](https://docs.nexmo.com/verify/api-reference/api-reference#rparameters)
4. To get Verify API response, add following line:
```
JsonResponse result = JsonConvert.DeserializeObject(json);
```
5. Each request you make to the Verify API returns:
```
{
"request_id": "requestId",
"status": "status",
"error_text": "error"
}
```
6. Now to check whether the PIN number user entered is correct or not, I have created another method named "VerifyOTPCode" with parameter "requestId", "code" and "toNumber" of type string with return type "JsonVerifyCheckResponse"
Where, requestId = Id which is generated by Nexmo per request code = PIN number which user will enter toNumber = phone/mobile number to whom SMS is to be sent. For more details, [click here](https://docs.nexmo.com/verify/api-reference/api-reference#vrequest).
7. To send request, add following code in this method:
```
string uri = string.Format("{0}/verify/check/json?api_key={1}&api_secret={2}&request_id={3}&code={4}",
ConfigurationManager.AppSettings["Nexmo.Url.Api"],
HttpUtility.UrlEncode(ConfigurationManager.AppSettings["Nexmo.api_key"]),
HttpUtility.UrlEncode(ConfigurationManager.AppSettings["Nexmo.api_secret"]),
requestId, code);
var json = new WebClient().DownloadString(uri);
```
8. Now add below line to deserialize the given object and get the response.
```
JsonVerifyCheckResponse result = JsonConvert.DeserializeObject(json);
```
Response will look like following format:
```
{
"event_id": "eventId",
"status": "status",
"price": "price",
"currency": "currency",
"error_text": "error"
}
```
9. The response contains key-value format. For more details about responses, [click here](https://docs.nexmo.com/verify/api-reference/api-reference#ckeys). I have attached the output of Verify API below.
Figure 2: Output for Verify API Sample
## Some Helpful Links
[Getting started sending SMS guide](https://help.nexmo.com/hc/en-us/articles/204014803-Getting-started-sending-SMS-guide)
[Nexmo Developer](https://developers.nexmo.com/Quickstarts/verify/search/)
Happy Coding :)
## Related pages on Systenics
- [AuctionWorx platform overview](https://www.systenics.com/auctionworx/)
- [AI-powered listing description generation](https://www.systenics.com/auctionworx/ai-enhanced-listings-description-generation/)
- [AuctionWorx development and customization](https://www.systenics.com/auctionworx/development-and-customization/)
## Need help implementing this for your business?
Our team helps plan, build, and scale marketplace and auction workflows. Explore [industry solutions](https://www.systenics.com/solutions/), [platform products](https://www.systenics.com/products/), and [custom development services](https://www.systenics.com/auctionworx/development-and-customization/) tailored to your goals.
[Book a quick consultation](https://outlook.office.com/bookwithme/user/231015685f21467da5ef6e3eb8b50240@systenics.com/meetingtype/hbYq2z1Hj0C2e7DuwBqdnw2?anonymous&ep=mcard).
---
## Page: Beyond Copy-Paste Prompts: Integrating Enterprise AI for Automated Auction Lotting & Cataloging
URL: https://www.systenics.com/blogs/integrating-enterprise-ai-for-automated-auction-lotting-cataloging/
Description: Why manual copy-pasting into ChatGPT breaks down for high-volume auction catalogs, and how integrating enterprise OpenAI directly into AuctionWorx slashes listing preparation time while lifting SEO.
# Beyond Copy-Paste Prompts: Integrating Enterprise AI for Automated Auction Lotting & Cataloging
**by:** Saurabh Nandu **in:** [Programming](https://www.systenics.com/blogs/category/programming/) **tags:**[*AuctionWorx*](https://www.systenics.com/blogs/tag/auctionworx/), [*Artificial Intelligence*](https://www.systenics.com/blogs/tag/artificial-intelligence/), [*Azure*](https://www.systenics.com/blogs/tag/azure/), [*Web Development*](https://www.systenics.com/blogs/tag/web-development/)
If your auction intake team is opening ChatGPT in a separate browser tab, uploading photos one by one, typing out prompt templates, and copying the text back into your marketplace admin panel, you have a manual bottleneck disguised as an AI strategy.
For an occasional seller listing three vintage items on the weekend, manual prompting feels like magic. But for an auction business processing 500 to 5,000 lots every week across estate liquidations, commercial equipment, or overstock merchandise, **manual copy-pasting slows everything to a crawl**. It eats up warehouse labor, introduces formatting inconsistencies across consignors, and risks exposing private client manifests to consumer AI models.
At Systenics, our Superhero Squad approaches AI not as an external novelty chatbot, but as an embedded superpower integrated directly into your auction workflow. Here is why embedding AI straight into your [AuctionWorx](https://www.systenics.com/auctionworx/) platform cuts listing preparation time by hours and gives your catalogs an immediate lift in search traffic and buyer interest.
## The Three Big Flaws of the Copy-Paste AI Workflow
### 1. Labor Costs and Tab-Switching at Scale
Cataloging 1,000 lots requires taking photographs, noting specifications, writing accurate titles, crafting search-optimized descriptions, and selecting taxonomy categories. If copying and pasting back and forth takes just 90 seconds per lot, your staff spends **over 25 hours of pure clerical time** on every single auction event.
### 2. Uncontrolled Hallucinations and Inconsistent Formatting
Auction buyers need structured, dependable details: exact dimensions, manufacturer part numbers, tested operating conditions, and accessories included. Consumer AI tools frequently generate wordy marketing copy instead of the concise, structured specifications bidders look for before committing money.
### 3. Data Privacy and Consignor Confidentiality
Free or consumer-grade AI tools often use submitted prompts and uploaded files to train public models. Pasting private consignor manifests, unreleased commercial inventory, or confidential asset valuations into public prompts creates serious data privacy and compliance risks.
## The Better Approach: Embedded Enterprise AI in AuctionWorx
Instead of treating AI as an external chore, our [AI Enhanced Listings Description Generation](https://www.systenics.com/auctionworx/ai-enhanced-listings-description-generation/) module embeds OpenAI intelligence directly into the AuctionWorx listing manager and native mobile apps.
Here is how the streamlined intake process works:
- **Visual and Spec Analysis:** When intake personnel take photos of a lot using the [AuctionWorx Buyer+Seller Pro Mobile App](https://www.systenics.com/auctionworx/mobile-apps/) or upload images in the web admin, the integrated AI vision pipeline inspects the item to recognize brand logos, model plates, and physical condition.
- **Automated Description and SEO Generation:** With a single click, the platform processes the title, category, and imagery to produce clear, structured descriptions formatted specifically for auction conversion and organic search engines.
- **Enterprise Data Security:** All API requests pass through private enterprise endpoints with zero data retention for model training, ensuring complete confidentiality for your auction house and consignors.
## The Double Win: Higher Hammer Prices and Organic Search Traffic
Many auction houses treat item descriptions as an afterthought, relying on a single blurry photo and a vague 5-word title like *"Lot 204 - Power Tool"*.
This hurts auction performance in two measurable ways:
- **Lost Search Engine Rankings:** Search engines cannot index what is not on the page. When lots include detailed descriptions highlighting brand names, model numbers, and technical specifications, every lot page becomes an organic landing page for targeted buyers searching Google.
- **Greater Buyer Confidence:** Bidders hesitate to bid aggressively on ambiguous lots. Accurate, thorough descriptions answer buyer questions immediately, driving up to a **25% increase in bidding engagement** and higher final sale prices.
## Combining AI with Barcode Intake
For liquidators handling retail returns and overstock merchandise, AI descriptions pair smoothly with our [Barcode Listing Creation Add-On](https://www.systenics.com/auctionworx/barcode-listing-creation/).
Intake staff scan the original UPC barcode using a handheld scanner or smartphone camera to pull manufacturer specifications and retail MSRP. The AI engine immediately refines the copy and drafts a publication-ready listing highlighting the current condition in seconds.
## Predictable, One-Time Product Pricing
Unlike SaaS platforms that extract monthly subscriptions or charge a fee on every listing you create, our AI Enhanced Listings product is available for a **one-time fixed investment of $2,699**.
That includes the Buyer+Seller Pro Mobile App for iOS and Android, complete deployment on your AuctionWorx Enterprise or Events edition, and configuration by our experienced engineering Squad.
## Superpower Your Intake Operations
Eliminate repetitive data entry so your team can focus on bringing in high-value consignments and growing your buyer network.
[Connect for Mission Launch **](https://outlook.office.com/bookwithme/user/231015685f21467da5ef6e3eb8b50240@systenics.com/meetingtype/hbYq2z1Hj0C2e7DuwBqdnw2?anonymous&ep=mcard)
## Related pages on Systenics
- [AuctionWorx platform overview](https://www.systenics.com/auctionworx/)
- [AI-powered listing description generation](https://www.systenics.com/auctionworx/ai-enhanced-listings-description-generation/)
- [AuctionWorx development and customization](https://www.systenics.com/auctionworx/development-and-customization/)
## Need help implementing this for your business?
Our team helps plan, build, and scale marketplace and auction workflows. Explore [industry solutions](https://www.systenics.com/solutions/), [platform products](https://www.systenics.com/products/), and [custom development services](https://www.systenics.com/auctionworx/development-and-customization/) tailored to your goals.
[Book a quick consultation](https://outlook.office.com/bookwithme/user/231015685f21467da5ef6e3eb8b50240@systenics.com/meetingtype/hbYq2z1Hj0C2e7DuwBqdnw2?anonymous&ep=mcard).
---
## Page: Integrate Salesforce with C# or ASP.NET MVC Application
URL: https://www.systenics.com/blogs/integrate-salesforce-with-c-or-aspnet-mvc-application/
Description: This tutorial explains the manual steps to authenticate Salesforce account using C# or ASP.NET MVC application. Even though the sample provided is C# Console application, we have implemented the same with RainWorx
# Integrate Salesforce with C# or ASP.NET MVC Application
**by:** Dhanashri Karale **in:** [Programming](https://www.systenics.com/blogs/category/programming/) **tags:**[*C#*](https://www.systenics.com/blogs/tag/c-sharp/), [*ASP.NET MVC*](https://www.systenics.com/blogs/tag/aspnet-mvc/), [*SalesForce*](https://www.systenics.com/blogs/tag/salesforce/)
## Introduction
This tutorial explains the manual steps to authenticate Salesforce account using C# or ASP.NET MVC application. Even though the sample provided is C# Console application, we have implemented the same with ASP.NET MVC application for RainWorx's [AuctionWorx](https://www.systenics.com/auctionworx/) software as part of broader [AuctionWorx development and customization work](https://www.systenics.com/auctionworx/development-and-customization/).
## Pre-requisites
1. Salesforce Test Account
2. Visual Studio (C#)
## Manual Steps for SalesForce Registration
1. Let's start by creating a new project with name - "SalesForceAuthSample". Open Visual Studio, New Project -> Visual C# -> Windows -> Console Application
Figure 1: Visual Studio > New Project
2. Create [Salesforce test account](https://login.salesforce.com/).
3. Add references for "DeveloperForce.force" using NuGet Package Manager in your project.
4. For Salesforce Integration, we need following information such as Security Token, Consumer Key, Consumer Secret, Username, Password and IsSandBoxUser.
**Security Token:** We will get Security Token from the following location - Dropdown with Username located at top right corner > My Settings > Personal > Reset My Security Token. On clicking "Reset Security Token" button, the new Security Token will be sent on registered email address.
Figure 2: Salesforce > Security Token
**Consumer Key and Consumer Secret:** We will get Consumer Key and Consumer Secret from the following location - Set Up > Create > App > New. Enter all required data. Callback URL is very important for authentication purpose and then Save it.
Figure 3: Salesforce > Consumer Secret and Consumer Key
After saving the API, it will show page similar to screenshot given below.
Figure 4: Salesforce > Apps
Click on Connected App Name and you will get Consumer Secret and Consumer Key.
Figure 5: Salesforce > Connected App Details
**Username and Password:** The Username and Password will be your test Salesforce account login username and password.
**IsSandBoxUser:** In code given below, we will set this parameter to "true".
```
using Salesforce.Common;
using Salesforce.Force;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SalesForceAuthSample
{
class Program
{
private static readonly string SecurityToken = System.Configuration.ConfigurationManager.AppSettings["SecurityToken"];
private static readonly string ConsumerKey = System.Configuration.ConfigurationManager.AppSettings["ConsumerKey"];
private static readonly string ConsumerSecret = System.Configuration.ConfigurationManager.AppSettings["ConsumerSecret"];
private static readonly string Username = System.Configuration.ConfigurationManager.AppSettings["Username"];
private static readonly string Password = System.Configuration.ConfigurationManager.AppSettings["Password"];
private static readonly string IsSandboxUser = System.Configuration.ConfigurationManager.AppSettings["IsSandboxUser"];
static void Main(string[] args)
{
try
{
var task = RunSample();
task.Wait();
}
catch (Exception e)
{
Console.WriteLine(e.Message);
Console.WriteLine(e.StackTrace);
var innerException = e.InnerException;
while (innerException != null)
{
Console.WriteLine(innerException.Message);
Console.WriteLine(innerException.StackTrace);
innerException = innerException.InnerException;
}
}
}
private static async Task RunSample()
{
try
{
var auth = new AuthenticationClient();
// Authenticate with Salesforce
Console.WriteLine("Authenticating with Salesforce");
var url = IsSandboxUser.Equals("true", StringComparison.CurrentCultureIgnoreCase)
? "https://login.salesforce.com/services/oauth2/token"
: "https://test.salesforce.com/services/oauth2/token";
await auth.UsernamePasswordAsync(ConsumerKey, ConsumerSecret, Username, Password, url);
Console.WriteLine("Connected to Salesforce");
var client = new ForceClient(auth.InstanceUrl, auth.AccessToken, auth.ApiVersion);
// retrieve all accounts
Console.WriteLine("Get Accounts");
}
catch (Exception e)
{
Console.WriteLine(e.Message);
Console.WriteLine(e.StackTrace);
}
}
}
}
```
In next blog, I will explain about simple CRUD operations which we can perform on Salesforce.
Link - [Salesforce CRUD operations using C# in AuctionWorx (ASP.NET MVC application)](https://www.systenics.com/blogs/salesforce-crud-operations-using-c-in-auctionworx-aspnet-mvc-application/)
Happy Coding :)
## Related pages on Systenics
- [AuctionWorx platform overview](https://www.systenics.com/auctionworx/)
- [AI-powered listing description generation](https://www.systenics.com/auctionworx/ai-enhanced-listings-description-generation/)
- [AuctionWorx development and customization](https://www.systenics.com/auctionworx/development-and-customization/)
## Need help implementing this for your business?
Our team helps plan, build, and scale marketplace and auction workflows. Explore [industry solutions](https://www.systenics.com/solutions/), [platform products](https://www.systenics.com/products/), and [custom development services](https://www.systenics.com/auctionworx/development-and-customization/) tailored to your goals.
[Book a quick consultation](https://outlook.office.com/bookwithme/user/231015685f21467da5ef6e3eb8b50240@systenics.com/meetingtype/hbYq2z1Hj0C2e7DuwBqdnw2?anonymous&ep=mcard).
---
## Page: How to Choose an AuctionWorx Development Partner
URL: https://www.systenics.com/blogs/how-to-choose-an-auctionworx-development-partner/
Description: Seven questions to ask before hiring anyone to customize your AuctionWorx marketplace, and why RainWorx partner status should be the first one.
# How to Choose an AuctionWorx Development Partner
**by:** Saurabh Nandu **in:** [General](https://www.systenics.com/blogs/category/general/) **tags:**[*AuctionWorx*](https://www.systenics.com/blogs/tag/auctionworx/)
AuctionWorx is a .NET platform with a deep, mature codebase. This means the difference between a good customization and a mess you'll pay to undo is entirely in who you hire. The pool of developers who genuinely know the platform is small. Here's how to vet them.
## Seven questions to ask
### 1. Are you a RainWorx partner: can RainWorx confirm it?
Partner status means the vendor works with the platform's maker, gets early access to releases, and has a reputation to protect inside the ecosystem. We're a [RainWorx Premium Partner](https://www.systenics.com/auctionworx/) and happy for you to verify that directly. Anyone can claim AuctionWorx experience; partner status is checkable.
### 2. How many years and how many installations?
Ask for numbers, not adjectives. Ours: 15+ years on the platform across Enterprise and Events editions.
### 3. Will my customizations survive an AuctionWorx upgrade?
The single most expensive mistake in this ecosystem is a customization welded into core files. Insist on extension-based approaches that survive version upgrades, and ask the vendor to explain theirs.
### 4. Is the pricing fixed before work starts?
Hourly billing on an unfamiliar codebase is a blank check. Look for published product pricing and fixed-cost quotes per milestone. Here's ours, in the open: [/auctionworx/pricing/](https://www.systenics.com/auctionworx/pricing/).
### 5. Can I see it running?
Live customer sites and demo videos beat screenshots. Ask to see the actual add-on running on an actual marketplace.
### 6. Who handles deployment and what happens after?
A price that excludes deployment isn't a price. Every published price on our [pricing list](https://www.systenics.com/auctionworx/pricing/) includes deployment; ask any vendor the same.
### 7. Do they understand the auction business, or just the code?
Soft closes, buyer's premiums, consignor settlements, lotting workflows: a partner who's built for estate sales, car auctions and livestock rings solves in domain language, not just C#.
## Red flags
- No verifiable partner status
- No published pricing anywhere
- "We'll modify the core files, it's faster"
- Portfolio is all generic web work with one auction site
- Deployment billed separately as a surprise
## Vet Us With the Same List
Vet us with the same seven questions. Book a call and bring the list.
[Book a Call **](https://outlook.office.com/bookwithme/user/231015685f21467da5ef6e3eb8b50240@systenics.com/meetingtype/hbYq2z1Hj0C2e7DuwBqdnw2?anonymous&ep=mcard)
## Related pages on Systenics
- [AuctionWorx platform overview](https://www.systenics.com/auctionworx/)
- [AI-powered listing description generation](https://www.systenics.com/auctionworx/ai-enhanced-listings-description-generation/)
- [AuctionWorx development and customization](https://www.systenics.com/auctionworx/development-and-customization/)
## Need help implementing this for your business?
Our team helps plan, build, and scale marketplace and auction workflows. Explore [industry solutions](https://www.systenics.com/solutions/), [platform products](https://www.systenics.com/products/), and [custom development services](https://www.systenics.com/auctionworx/development-and-customization/) tailored to your goals.
[Book a quick consultation](https://outlook.office.com/bookwithme/user/231015685f21467da5ef6e3eb8b50240@systenics.com/meetingtype/hbYq2z1Hj0C2e7DuwBqdnw2?anonymous&ep=mcard).
---
## Page: Getting Hired at Systenics as a Fresher: Interview Tips & Process
URL: https://www.systenics.com/blogs/getting-hired-at-systenics-as-fresher/
Description: Looking for software developer interview questions at Systenics? Learn about our hiring process, technical rounds, and what we look for in freshers.
# Getting Hired at Systenics as a Fresher: Interview Tips & Process
**by:** Siddhi Nandu **in:** [General](https://www.systenics.com/blogs/category/general/) **tags:**[*Interview*](https://www.systenics.com/blogs/tag/interview/)
## This post applies to Freshers only who are as hired as Trainee Software Developer.
This post is coming out of our need to constantly be on the watch to hire fresh talent. We are always in need of great talent, I think every organization is. Good employees are our biggest assets and we value them the most in this organization. We are in the business of showcasing excellence. And thus our employee's brilliance is our only wealth. Hiring an employee is a ritual of expanding our family and it has to be carefully achieved. This post is for the candidates who want to be the part of a company that values their talent the most.
I would like to highlight the few key areas we are most concerned about in our interviewees. The most important thing is the passion for technology. We don't expect you to be geek, but at the same time you should be well versed with the latest technology trends just as like being well versed with the cricket scores! You should be open to learning new technology as this is an evolving world and each new day sees a new discovery. Thus, you must be able to adapt to the changing environment. We wish to be on the cutting edge of the technology and like all our employees to share the same vision.
The other most essential aspect is your Communication Skill. It is the most important part of People Skills that one should focus and spend time cultivating it. We are focused on building solutions for the International Clients and we want our team members to be able to clearly understand and communicate with our clients. Excellent verbal as well as written communication is a key to happy clients!
The interview call is a chance of a lifetime to get hired and start your career in the right direction, so don't ruin it! Give it your best shot, we understand you are a bit nervous. Our process is very robust, tried with several hundred interviewees and it makes sure that we get the ideal candidate for our team. The biggest repeated excuse we keep hearing is "I have not prepared, but if given time then I can prepare". Its a stupid excuse, if you are not prepared then don't come for the interview and waste both your time and ours! How do you expect to get hired, if you do not prepare?
So we iterate again, prepare well in advance and make sure you have no excuses to make when you come for the interview. Visit our company website, read [about the kind of work we do](https://www.systenics.com/about-us/), read our blogs, check out the technologies we are working upon. Get a good sense about us before you come for an interview, after all it's one of the biggest decisions of your life!
Following is the interview process that we follow.
## Step 1: Apply for Job
**To apply through your College:**
In case our company has approached your campus and your TPO or Placement Coordinator has forwarded your resume or details to us, you don't need to apply online. We will fix the date of interview with your TPO and he/she will in turn inform you. In that case, you will directly come to Step 3.
**To apply Online:**
Visit Jobs page on our website [www.systenics.com/jobs](https://www.systenics.com/jobs/). Apply from there to your suitable opening. Email your resume to us on the email address provided on Jobs page. It is sad to see how many candidates fail to understand the simplicity of this process and continue to spam our company email address with their resumes. Please we have a special process for submitting resumes, use it! Mailing your resumes on every email address you find is only going to get you sidelined.
## Step 2: Shortlisting and Getting called for Interview
Every single resume is meticulously checked and relevant candidates are shortlisted. On getting shortlisted, you will receive an email with the date of interview. Take an effort to make your resume stand out and grab our attention. Copy pasting the same objectives and formats from several others just makes your resume invisible amongst the pile of several others.
## Step 3: Technical Interview - Round One
Prepare for your interview, before applying to us, if you are not prepared, take your time to get up to speed and then apply. Generally every interviewee is given a specific time for interview, please be ON time and I can't stress that enough. Being 3 hours early is similar to being 3 hours late! A specific time slot has been assigned to you so that we do not make our candidates wait long for their interviews, please try to adhere to the time slot provided as a convenience to everyone.
Be prepared with answers for the standard HR questions like:
- Tell something about yourself.
- What do you know about Systenics?
- Where do you see yourself 2 years from now?
- What are your strengths and weaknesses? etc.
These are some illustrative questions. The next thing is be prepared with your academic projects. Make sure you know everything about it. Be honest with us, its very easy for us to make out when you start telling lies. We want to see what work you have put in your project, how much efforts you took on the project in terms of innovation, research etc.
The next and the most important thing is to brush up all your concepts about what you have studies in your academics. We know you are not well verse with current technologies like C#, ASP.NET, but our expectation is that you are thorough with the concepts taught in your academic curriculum. Know basics of your programming language C/C++ or Java in and out. Revise the concepts of Databases, Web Technologies and OOPS. Before interviewing, read and write some samples manually so that you have a good grasp of concepts, this is not your college exam where you can give us mugged up answers. We will quiz you on the concepts and only those who have actually taken the pains to understand the programming language pass our technical test.
We also test you on your logic and problem solving capabilities but there nothing we ask that is not taught in your academic syllabus. But at the same time we are not going to ask you textbook questions. We are looking for candidates who have the ability to apply what they have learnt in their colleges in practical problems. Anyone who relies on pure mug up of text book is bound to fail our tests. Thus, be well prepared, take the time before the interview to sit with a good programming book and write out some samples so that you can understand the programming and logic concepts well.
Once your interview is completed, unless asked otherwise please leave our premises and do not crowd waiting for your friends. If you are selected we will call you within two weeks. If you have not heard from us within two weeks means that you have not cleared our interview.
## Step 4: Psychometric Evaluation and Aptitude Test - Round Two
Once you clear the technical interview, you will appear for Psychometric Evaluation and the Aptitude Test. Psychometric Evaluation gives the outline of your personality traits. Be honest and quick in answering. It helps us understand your strengths and weakness. Using it we can map you to different functions in the organization. Aptitude test is for analyzing your logical thinking and data interpretation ability.
## Step 5: Personal Interview - Round Three
One of our team member might also conduct a second round of personal interview. These are the guys you will be working with so make sure you demonstrate to them that you are a team player as well as you have the qualities to make a good developer.
## Step 6: Interview with CEO - Round Four
If you have worked hard and know your technologies well, you get the final interview with our CEO. We know its been a long process for you, its been the same for us too. So continue ahead in confidence, demonstrate to us that you are a smart, intelligent, honest candidate with integrity. Feel free to voice any concerns or questions you have during the interview process, make sure that all your doubts are resolved before you finish your interview.
Post all the interviews we analyze your verbal and written test results as well as discuss with our team members who have taken part in the interview process. If everyone is confident then you will be presented with an offer along with package details within two weeks of your interview.
We look for candidates who wish to work with us in the long run as well as who are self-learners and have potential to become great developers. If you are planning for future studies, going abroad please discuss this upfront with us so that our goals can align with yours.
Once an offer is presented you are given about 2-3 days to discuss the offer with your parents and revert back to us. If you wish to accept the offer and begin your career with us then let us know as soon as possible. Further steps are explained to candidates who are selected.
## Summary
In this article I have tried to highlight and demystify the interview process at Systenics. We hope you take the time to read this information and prepare yourself accordingly for the interview. We wish you the best of luck!
## Related pages on Systenics
- [About Systenics](https://www.systenics.com/about-us/)
## Need help implementing this for your business?
Our team helps plan, build, and scale marketplace and auction workflows. Explore [industry solutions](https://www.systenics.com/solutions/), [platform products](https://www.systenics.com/products/), and [custom development services](https://www.systenics.com/auctionworx/development-and-customization/) tailored to your goals.
[Book a quick consultation](https://outlook.office.com/bookwithme/user/231015685f21467da5ef6e3eb8b50240@systenics.com/meetingtype/hbYq2z1Hj0C2e7DuwBqdnw2?anonymous&ep=mcard).
---
## Page: Generate Sitemap using Umbraco 6 CMS and ASP.NET MVC Razor code
URL: https://www.systenics.com/blogs/generate-sitemap-using-umbraco-6-cms-and-aspnet-mvc-razor-code/
Description: Sitemap is still considered one of the most important element of Website development. Google and Bing do provide an option to reference your website sitemap so that their bots can traverse through all the links. But, most developers or website administrators often forget to include it. In this blog post, I will explain the steps to create a Sitemap using Umbraco 6, ASP.NET Partial View and Razor code. This article assumes that you have Umbraco 6 configured to use Mvc as the default rendering engine so that MVC Partial Views can be used.
# Generate Sitemap using Umbraco 6 CMS and ASP.NET MVC Razor code
**by:** Shailesh Patel **in:** [Programming](https://www.systenics.com/blogs/category/programming/) **tags:**[*ASP.NET MVC*](https://www.systenics.com/blogs/tag/aspnet-mvc/), [*Razor*](https://www.systenics.com/blogs/tag/razor/), [*Umbraco*](https://www.systenics.com/blogs/tag/umbraco/)
Sitemap is still considered one of the most important element of Website development. Google and Bing do provide an option to reference your website sitemap so that their bots can traverse through all the links. But, most developers or website administrators often forget to include it. In this blog post, I will explain the steps to create a Sitemap using Umbraco 6, ASP.NET Partial View and Razor code. This article assumes that you have Umbraco 6 configured to use Mvc as the default rendering engine so that MVC Partial Views can be used.
Our sample Content hierarchy is as below:
```
Content
- Home
- Solutions
- Products
- Contact Us
- Sitemap
```
## Getting Started
We need to include all child items under parent menu item (Home) and create a sitemap dynamically.
In Umbraco CMS administration tool, click on **Settings** section and right-click on **Document Types** to create a new document named as **Sitemap**. Let **Master Document Type** be set to **None…** and **Create matching template** checked. Now click on **Sitemap** document type and go to **Structure** tab and set the checkbox for **Allow at root** option. Make sure that the **Allow at root** is checked on Home document type.
Also, you can add **umbracoNaviHide** property under **Generic properties** tab for base document type used by Home and all child pages within it. If this property is checked then a link to that page will not be included in the sitemap.
Copy-paste the code from Listing 1 to Sitemap template. Refer [Sitemap XML protocol](http://www.sitemaps.org/protocol.html) to understand the format of XML required by search engines.
Listing 1: Sitemap.cshtml
```
@inherits Umbraco.Web.Mvc.UmbracoTemplatePage
@{
Layout = null;
Response.ContentType = "text/xml";
}
@Html.Partial("GenerateSitemap", @Model.Content)
```
Next step is to right-click on **Partial Views** and create a new partial view named as **GenerateSitemap**. This will bring up an editor. Copy-paste the code from Listing 2 below into the editor and click **Save** icon to save the sitemap partial view.
Listing 2: GenerateSitemap.cshtml
```
@inherits Umbraco.Web.Mvc.UmbracoViewPage
@{
Layout = null;
var parent = Model.Previous().AncestorOrSelf(1);
if(@parent.Name== "Home")
{
@GetUrlWithDomainPrefix(parent.Url, parent.Name)@(string.Format("{0:s}+00:00", parent.UpdateDate))
@ListChildNodes(parent);
}
}
@helper ListChildNodes(IPublishedContent startNode)
{
const int maxLevelForSiteMap = 100;
foreach (var node in startNode.Children.Where(x => x.IsVisible()))
{
@GetUrlWithDomainPrefix(node.Url, node.Name)@(string.Format("{0:s}+00:00", node.UpdateDate))
if (node.Level <= maxLevelForSiteMap )
{
@ListChildNodes(node)
}
}
}
@functions {
private static string GetUrlWithDomainPrefix(string url, string name) {
if (url.StartsWith("/"))
url = url.Substring(1);
var domainPrefix = string.Format("http://{0}/", HttpContext.Current.Request.ServerVariables["HTTP_HOST"]);
if (url.StartsWith(domainPrefix))
return url;
else
return domainPrefix + url;
}
}
```
By default, partial views in Umbraco 6 inherits from the **Umbraco.Web.Mvc.UmbracoViewPage** class as shown on line 1 above.
The statement on line 4, **var parent = Model.Previous().AncestorOrSelf(1)** allows us to go one node back and traverse through all child items under Content tree-view. This code will work recursively based on the number of level it must traverse to generate the sitemap.
## Create Sitemap Link
Now the final step is to create a content for sitemap from Content section. Right-click on **Content** and click on **Create** to enter name as **Sitemap** and **Choose Document Type** as Sitemap. Click on the Sitemap content to know the link for sitemap. Do remember to submit this link to Google and Bing so that your website gets indexed. You can also include this link in robots.txt file.
I hope you find this blog post helpful in increasing your website page rank.
## Related pages on Systenics
- [AI-powered listing description generation](https://www.systenics.com/auctionworx/ai-enhanced-listings-description-generation/)
- [AuctionWorx development and customization](https://www.systenics.com/auctionworx/development-and-customization/)
- [Excel plugin for listing creation](https://www.systenics.com/auctionworx/listings-creation-excel-plugin/)
## Need help implementing this for your business?
Our team helps plan, build, and scale marketplace and auction workflows. Explore [industry solutions](https://www.systenics.com/solutions/), [platform products](https://www.systenics.com/products/), and [custom development services](https://www.systenics.com/auctionworx/development-and-customization/) tailored to your goals.
[Book a quick consultation](https://outlook.office.com/bookwithme/user/231015685f21467da5ef6e3eb8b50240@systenics.com/meetingtype/hbYq2z1Hj0C2e7DuwBqdnw2?anonymous&ep=mcard).
---
## Page: Enable TLS 1.2 for Authorize.Net and Salesforce API calls
URL: https://www.systenics.com/blogs/enable-tls-12-for-authorizenet-and-salesforce-api-calls/
Description: This tutorial explains how to enable TLS 1.2 for Authorize.Net and Salesforce API calls.
# Enable TLS 1.2 for Authorize.Net and Salesforce API calls
**by:** Shailesh Patel **in:** [General](https://www.systenics.com/blogs/category/general/) **tags:**[*ASP.NET MVC*](https://www.systenics.com/blogs/tag/aspnet-mvc/), [*SalesForce*](https://www.systenics.com/blogs/tag/salesforce/)
## Introduction
This tutorial explains how to enable TLS 1.2 for Authorize.Net and Salesforce API calls. Authorize.Net and Salesforce have been preparing for using TLS 1.1 or higher since past few months. Both of them have changed their developer or sandbox accounts to use TLS 1.1 or higher or TLS 1.2. Authorize.Net plans to switch production to TLS 1.2 by Sept 18, 2017 (refer[this link](https://community.developer.authorize.net/t5/News-and-Announcements/Experiencing-Sandbox-Connection-Issues-TLS-1-2-Is-Now-Required/m-p/57948#M196)) and Salesforce is planning to switch to TLS 1.1 or higher by July 22, 2017 (refer[this link](https://help.salesforce.com/articleView?%3Fd=701300000021Jky&eid=ss-tc&id=Salesforce-disabling-TLS-1-0&language=en_US&type=1)).
## Why You Need TLS 1.2?
If you are using developer sandbox account for Authorize.Net then you may have noticed following exception message - “An unexpected error occurred on a send” with inner exception as “Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host.”
To solve this issue there are 2 options as mentioned in this[Salesforce knowledge article](https://help.salesforce.com/articleView?%3Fd=701300000021Jky&eid=ss-tc&id=Salesforce-disabling-TLS-1-0&language=en_US&type=1):
### Option 1
Add following C# line:
```
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
```
before “var authRequest = new AuthorizeNet.AuthorizationRequest...”.
### Option 2
Instead of changing the source code and deploying the build, you try this option which requires adding a registry value on your development / test / production server.
Add a new DWORD “SchUseStrongCrypto” with value “1” for following registry keys:
```
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319
```
and
```
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319
```
Note: The above changes are applicable only if your application is using .NET 4.5 or .NET 4.5.2. [AuctionWorx](https://www.systenics.com/auctionworx/) uses .NET 4.5.2 and hence this solution is best suited for it.
## Useful Links
One of the major reason for switching to TLS 1.2 is PCI compliance too. For PCI compliance, we came across few articles which helps us to configure server for compliance.
[IIS Crypto](https://www.nartac.com/Products/IISCrypto/Download) from Nartac Software
[TLS / SSL Settings from Microsoft TechNet (registry subkey to disable TLS 1.0)](https://technet.microsoft.com/en-us/library/dn786418(v=ws.11).aspx#BKMK_SchannelTR_TLS10)
[Disabling TLS 1.0 on your Windows 2008 R2 server from MSDN Blogs](https://blogs.msdn.microsoft.com/friis/2016/07/25/disabling-tls-1-0-on-your-windows-2008-r2-server-just-because-you-still-have-one/)
## Related pages on Systenics
- [AI-powered listing description generation](https://www.systenics.com/auctionworx/ai-enhanced-listings-description-generation/)
- [AuctionWorx development and customization](https://www.systenics.com/auctionworx/development-and-customization/)
## Need help implementing this for your business?
Our team helps plan, build, and scale marketplace and auction workflows. Explore [industry solutions](https://www.systenics.com/solutions/), [platform products](https://www.systenics.com/products/), and [custom development services](https://www.systenics.com/auctionworx/development-and-customization/) tailored to your goals.
[Book a quick consultation](https://outlook.office.com/bookwithme/user/231015685f21467da5ef6e3eb8b50240@systenics.com/meetingtype/hbYq2z1Hj0C2e7DuwBqdnw2?anonymous&ep=mcard).
---
## Page: Creating an Ajax enabled Contact Form in Umbraco 6 with ASP.NET MVC 4 and Twitter Bootstrap
URL: https://www.systenics.com/blogs/creating-an-ajax-enabled-contact-form-in-umbraco-6-with-aspnet-mvc-4-and-twitter-bootstrap/
Description: In the previous blog post, I covered how to create a Bootstrap enabled responsive website in Umbraco 6 using ASP.NET MVC 4. In this blog post, I intend to build upon the previous post to add a Contact Form, which is one of the key requirements of any simple web site which will email the owner of the site with the contents of the form. The aim of this blog post is two fold, firstly we will see how to write controllers in Umbraco 6 using ASP.NET MVC 4. Secondly, we will see how we can Ajax enable the same contact form in Umbraco 6 for better user experience.
# Creating an Ajax enabled Contact Form in Umbraco 6 with ASP.NET MVC 4 and Twitter Bootstrap
**by:** Saurabh Nandu **in:** [Programming](https://www.systenics.com/blogs/category/programming/) **tags:**[*ASP.NET MVC*](https://www.systenics.com/blogs/tag/aspnet-mvc/), [*Umbraco*](https://www.systenics.com/blogs/tag/umbraco/), [*Bootstrap*](https://www.systenics.com/blogs/tag/bootstrap/), [*Ajax*](https://www.systenics.com/blogs/tag/ajax/)
In the previous [blog post](https://www.systenics.com/blogs/create-a-responsive-fluid-html5css3-based-website-on-umbraco-6-using-twitter-bootstrap/), I covered how to create a Bootstrap enabled responsive website in Umbraco 6 using ASP.NET MVC 4. In this blog post, I intend to build upon the previous post to add a Contact Form, which is one of the key requirements of any simple web site which will email the owner of the site with the contents of the form. The aim of this blog post is two fold, firstly we will see how to write controllers in Umbraco 6 using ASP.NET MVC 4. Secondly, we will see how we can Ajax enable the same contact form in Umbraco 6 for better user experience.
## Defining the Contact Us Document Type
[Download the source code](https://www.systenics.com/media/CreatingResponsiveBootstrapUmbraco6.zip) attached in the previous blog post, load it in Visual Studio and run the website. Login to Umbraco control panel (navigate to [http://localhost:/Umbraco](http://localhost:port/)) and provide the admin credentials (username: root and password: @123test) to login to the admin control panel. The first step we need to take is to create a new document type for the contact form. In the Umbraco's admin website, click on **Settings** under **Sections** to load the site settings.
Expand the **Document Types** under **Settings** tree and right click on the **[PageBase]** document type and select **Create** from the context menu. In the **Create** dialog give the name as** Contact Us** and unselect **create a matching template** and click **Create** to create the new document type. Switch to the **Tabs** tab and create a **New Tab** with the name **Contact Information**. Next switch to the **Generic Properties** tab and add a property with the following details.
Name: Contact Us Contact Information
Alias: contactUsContactInformation
Type: Richtext editor
Tab: Contact Information
We need to allow the Contact Us page to be created below the Home page. Click on the **Home** document type, switch to the **Structure** tab, select **Contact Us** under **Allowed child nodetypes** and click save icon. This step will allow the Contact Us content page to be created under the content page which uses the Home document type.
## Creating the Contact Model
Switch to Visual Studio, right click **Models** in Solution Explorer and select **Add –> Class** from the context menu. Give the name as **Contact.cs** in the **Add New Item** dialog and click **Add** to create the new class. Copy paste the code from Listing 1 below to populate the Contact model.
```
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.DataAnnotations;
namespace MVCUmbraco.Models
{
public class Contact
{
[Required]
string Name { get; set; }
[Required]
[DataType(DataType.EmailAddress)]
string Email { get; set; }
[Display(Name="Company Name")]
string CompanyName { get; set; }
[Required]
string Message { get; set; }
}
}
```
Listing 1 - Contact.cs - Contact Model class
The above Listing 1 has a simple model for the **Contact** class. I have used the **Required** and **DataType** annotations attributes to ensure that the model has validation on the server and client side. Once we have the model ready, the next step is to create the controller for it. Right click the **Controllers** folder in Solution Explorer and choose** Add –> Controller** from the context menu. Provide the **Controller Name** as **ContactController** and click **Add** with default empty template to create a new Controller. Copy paste the code from Listing 2 below into Visual Studio to update the **ContactController** class.
```
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using MVCUmbraco.Models;
using System.Net.Mail;
using System.Net;
namespace MVCUmbraco.Controllers
{
public class ContactController : Umbraco.Web.Mvc.SurfaceController
{
[HttpPost]
public ActionResult SendMail(Contact form)
{
string retValue = "There was an error submitting the form, please try again later.";
if (!ModelState.IsValid)
{
return Content(retValue);
}
if (ModelState.IsValid)
{
//Update your SMTP server credentials
using (var client = new SmtpClient { Host = "smtp.gmail.com", Port = 587, EnableSsl = true,
Credentials = new NetworkCredential("user@gmail.com", "password"),
DeliveryMethod = SmtpDeliveryMethod.Network})
{
var mail = new MailMessage();
mail.To.Add("user@gmail.com"); // Update your email address
mail.From = new MailAddress(form.Email, form.Name);
mail.Subject = String.Format("Request to Contact from {0}", form.CompanyName);
mail.Body = form.Message;
mail.IsBodyHtml = false;
try
{
client.Send(mail);
retValue = "Your Request for Contact was submitted successfully. We will contact you shortly.";
}
catch (Exception)
{
throw;
}
}
}
return Content(retValue);
}
}
}
```
Listing 2 – ContactController.cs
Listing two above shows that we inherit our controller class from **Umbraco.Web.Mvc.SurfaceController**, which is the base class you require to inherit when you plan to use your controller in Umbraco 6. Other parts of the code are simple and they are just sending an email with the contents of the Contact Form. Please make sure you change the SMTP Server credentials and To email address to meet your needs. You can save and compile your visual studio project to ensure there are no errors.
Since we want to use Standard ASP.NET MVC controls and validation we need to update our style sheet to include classes that are used by ASP.NET MVC default validation. Open **site.css** stylesheet in Visual Studio from Solution Explorer under **CSS** folder and append the classes shown in Listing 3 in the start of the css file and save the file.
```
/* Styles for validation helpers
-----------------------------------------------------------*/
.field-validation-error {
color: #ff0000;
}
.field-validation-valid {
display: none;
}
.input-validation-error {
border: 1px solid #ff0000;
background-color: #ffeeee;
}
.validation-summary-errors {
font-weight: bold;
color: #ff0000;
}
.validation-summary-valid {
display: none;
}
```
Listing 3 – Updates to site.css
The above classes are used by the ASP.NET MVC framework for showing validation errors. We also need to include the JavaScript files used for Validation as well as Ajax calls. In the previous blog post we had defined the JavaScripts in the **PageBase.cshtml** template which acts as a Master template for all pages on our site. In solution explorer, expand **Views** and open **PageBase.cshtml** file for editing in Visual Studio. You will find the JQuery and Bootstrap JavaScript files included on lines 35 and 36. Copy the code from listing 4 below and paste it at line 37 in the **PageBase.cshtml** file.
```
```
Listing 4 – Include additional script files in PageBase.cshtml
We have included 3 JavaScripts which are required for unobtrusive validation as well as for ajax. I have included these files in the Master template for simplicity purposes, if you wish you can include them on the required pages only. We also need to update the **web.config** file to enable unobtrusive validation and ajax. Open the **web.config** file from Solution Explorer and navigate to **appSettings** section around line 34. Add the following settings from listing 5 below into the **appSettings** section of your **web.config** file.
```
```
Listing 5 – Settings to enable Unobtrusive validation and ajax in Umbraco 6
We are now set to define of Contact Form. We define the form as a partial view, Switch to your browsers Umbraco admin, and select **Settings** from **Sections** if you are not already there. Right click on Partial Views under Settings and select Create from the context menu. Give the name as ContactForm and click Create to create the new partial view. Copy paste the code from Listing 6 into the Umbraco editor and click the save icon to save the file.
```
@inherits Umbraco.Web.Mvc.UmbracoViewPage
@using (Ajax.BeginForm("SendMail", "Contact", new AjaxOptions { HttpMethod = "POST",
InsertionMode = InsertionMode.Replace, UpdateTargetId = "target",
OnFailure = "ShowError()", OnSuccess = "ShowSuccess()" }))
{
}
```
Listing 6 – ContactForm partial view
You can see from the code above that our partial view inherits from the generic **Umbraco.Web.Mvc.UmbracoViewPage** class which is instantiated to our **MVCUmbraco.Models.Contact** class type. We do this so that our Model class is available as a **model** in our partial view. Next we use **Ajax.BeginForm** helper to define our Ajax enabled form, just like we use in normal ASP.NET MVC 4 forms. We pass the action and controller name as parameters, make sure you have them correctly defined else your form will keep giving all kinds of errors. We also pass an **AjaxOptions** object to the helper and define that we want to replace the contents of the **target** div upon success of the form. We also hook up the **OnFailure** and **OnSuccess** client side events to appropriate JavaScript methods. We then define the the MVC controls for the Model. You will note that the form has been styled as per Bootstrap guidelines. The **ShowError** and **ShowSuccess** JavaScript methods use appropriate Bootstrap classes to display styled alerts.
We now need to create a **Template** for the Contact form which will have the view for the form. Expand the **Templates** node under **Settings** and right click on **[PageBase]** and select **Create** from the context menu. Provide the **Name** as **Contact Us** and click **Create** in the dialog to create a new template for **Contact Us** page under the **[PageBase]** template. Cope paste the code from Listing 7 into the Umbraco editor and click on the save icon to save the file.
```
@inherits Umbraco.Web.Mvc.UmbracoTemplatePage
@{
Layout = "PageBase.cshtml";
var contact = new MVCUmbraco.Models.Contact();
}
@section content{
@Umbraco.Field("contactUsContactInformation")
Write to Us
@Html.Partial("ContactForm", contact)
}
```
Listing 7 – Contact Us template
In the above Listing 7 we have defined a variable **contact** which is an instance of our model class and is used to pass the model to the partial view. We have also used Bootstrap formatting and divided the page into two major areas one having the **contactUsContactInformation** Umbraco field and another including our **ContactForm** partial view.
We need to set this as the default template for the **Contact Us** document type. Expand **Document Types** under **Settings** and select** Contact Us** under the**[PageBase]** document type. Select **Contact Us** as the **Default Template** and click the save icon so that the **Contact Us** template is used as the default template for the** Contact Us** document type.
Now that we have the **Contact Us** document type and template all set, we need to create the Contact Us page. Click on **Content** under **Settings** and right-click on the **Home** page under **Content** tree and select **Create** from the context menu. In the create dialog provide the page name as **Contact Us** and **choose the document type** as **Contact Us** and click **Create** to create the content page. Provide the appropriate Contact Information (your address) under the **Contact Information** tab, then switch to the **Generic Properties** tab and provide the information for the **SEO Title** and **SEO Description** for the page. Now you are all set, click Save and Publish icon to save and publish the page. The figures below show screenshot of the application in various stages. Please note that if you are having errors with the form the first step to trouble shoot is to ensure that you have provided the right SMTP configuration details in the **ContactControler** class.
Figure 1 - Ajax Enabled Contact Form
Figure 2 - Client Side validation errors
Figure 3 – Server Side error sending email
Figure 4 – Success submitting the form
In this blog post we saw the process of building an Ajax enabled Contact Form in Umbraco 6 using Bootstrap and ASP.NET MVC 4. You can apply similar concepts to build other Ajax enabled forms for your site. We also saw the process of adding a new document type, template and partial view for the contact form in Umbraco 6.
## Downloads
[Click here](https://www.systenics.com/media/AjaxContactFormBootstrapUmbraco6.zip) to download the sample code for this article.
## Related pages on Systenics
- [AI-powered listing description generation](https://www.systenics.com/auctionworx/ai-enhanced-listings-description-generation/)
## Need help implementing this for your business?
Our team helps plan, build, and scale marketplace and auction workflows. Explore [industry solutions](https://www.systenics.com/solutions/), [platform products](https://www.systenics.com/products/), and [custom development services](https://www.systenics.com/auctionworx/development-and-customization/) tailored to your goals.
[Book a quick consultation](https://outlook.office.com/bookwithme/user/231015685f21467da5ef6e3eb8b50240@systenics.com/meetingtype/hbYq2z1Hj0C2e7DuwBqdnw2?anonymous&ep=mcard).
---
## Page: Create navigation menu in Umbraco 6 using ASP.NET MVC Partial View and Razor
URL: https://www.systenics.com/blogs/create-navigation-menu-in-umbraco-6-using-aspnet-mvc-partial-view-and-razor/
Description: I was recently faced with the challenge of implementing a navigation menu in Umbraco 6, it was very difficult to search creditable samples which worked in Umbraco 6. In this blog post, I will explain the steps to create a navigation menu using partial view as you can see on current Systenics website. Besides linking the pages, we also wanted to display a help text for each menu item. Umbraco 6 provides several ways to implement the same, you could either use Macros, but I have chosen to write a MVC Partial View. This article assumes that you have Umbraco 6 configured to use Mvc as the display engine so that MVC Partial Views can be used.
# Create navigation menu in Umbraco 6 using ASP.NET MVC Partial View and Razor
**by:** Shailesh Patel **in:** [Programming](https://www.systenics.com/blogs/category/programming/) **tags:**[*.NET*](https://www.systenics.com/blogs/tag/net/), [*ASP.NET MVC*](https://www.systenics.com/blogs/tag/aspnet-mvc/), [*Razor*](https://www.systenics.com/blogs/tag/razor/), [*Umbraco*](https://www.systenics.com/blogs/tag/umbraco/)
## Introduction
I was recently faced with the challenge of implementing a navigation menu in Umbraco 6, it was very difficult to search creditable samples which worked in Umbraco 6. In this blog post, I will explain the steps to create a navigation menu using partial view as you can see on current Systenics website. Besides linking the pages, we also wanted to display a help text for each menu item. Umbraco 6 provides several ways to implement the same, you could either use Macros, but I have chosen to write a MVC Partial View. This article assumes that you have Umbraco 6 configured to use Mvc as the display engine so that MVC Partial Views can be used.
Figure 1: Systenics navigation menu
Our sample Content hierarchy is as below:
Home
- Solutions
- Products
- Contact Us
## Getting Started
We need to include the parent menu item (Home) and traverse through all child pages to create the menu in header section.
In Umbraco administration tool –> **Settings** section, right click on **Partial Views** and select **Create** from the context menu. Give the name as **NavigationMenu** and click **Create** to create the new partial view and bring up its editor. Copy paste the code from listing 1 below into the editor and click **Save** to save the menu.
Listing 1: NavigationMenu.cshtml
```
@inherits Umbraco.Web.Mvc.UmbracoViewPage
@using System.Collections;
@{
Layout = null;
var parent = Model.AncestorOrSelf(1);
string classSelectedMenuItem = "";
if(Model.Name == parent.Name)
{
classSelectedMenuItem = "selected_menu_item";
}
Dictionary menuItems =
new Dictionary();
menuItems.Add("Home", "start here");
menuItems.Add("Solutions", "services we provide");
menuItems.Add("Contact Us", "request a quote");
}
```
By default partial views in Umbraco 6 inherit from the **Umbraco.Web.Mvc.UmbracoViewPage** class as shown on line 1 above. In the above code listing, we are looping over the results of Lambda expression query which has items with **IsVisible** property set as **true**. This property is set by adding the **umbracoNaviHide** property to the document type that is used to display the pages. A try-catch block is added on line 31 which will allow the code to execute and render a blank span tag in case there is no description provided for the added page in the dictionary item. You will have to manually update the **menuItems** object on line 12 to contain descriptions for all your pages.
To use this partial view, include it in your base template using the following code of listing 2. We pass the @Model.Content parameter to the partial view so that it can find the pages for the application.
Listing 2: Include NavigationMenu in your base template
```
@Html.Partial("NavigationMenu", @Model.Content)
```
I hope you find this little blog post helpful.
## Related pages on Systenics
- [AI-powered listing description generation](https://www.systenics.com/auctionworx/ai-enhanced-listings-description-generation/)
- [About Systenics](https://www.systenics.com/about-us/)
## Need help implementing this for your business?
Our team helps plan, build, and scale marketplace and auction workflows. Explore [industry solutions](https://www.systenics.com/solutions/), [platform products](https://www.systenics.com/products/), and [custom development services](https://www.systenics.com/auctionworx/development-and-customization/) tailored to your goals.
[Book a quick consultation](https://outlook.office.com/bookwithme/user/231015685f21467da5ef6e3eb8b50240@systenics.com/meetingtype/hbYq2z1Hj0C2e7DuwBqdnw2?anonymous&ep=mcard).
---
## Page: Create a Responsive, Fluid HTML5/CSS3 based website on Umbraco 7 using Bootstrap 3.0 Framework
URL: https://www.systenics.com/blogs/create-a-responsive-fluid-html5css3-based-website-on-umbraco-7-using-bootstrap-30-framework/
Description: Building responsive, fluid HTML5/CSS3 based websites are a rage these days delivering the best ROI for clients investing in building new web sites. Building a single website which adapts itself depending on the device screen size gives end users richer experiences. There are several ways of building responsive websites, one of the popular ways to to use an existing framework like Bootstrap which provide base scaffolding to quickly build responsive websites. In this blog post I am going to focus on how to integrate Bootstrap v3.0.X with Umbraco 7 to build a HTML5/CSS3 based fluid responsive website. The goal is to build a simple single page responsive web page similar to the Jumbotron bootstrap sample and focus on the integration part so that you can build more complex layouts as required. I plan to build upon this sample in future blog posts.
# Create a Responsive, Fluid HTML5/CSS3 based website on Umbraco 7 using Bootstrap 3.0 Framework
**by:** Saurabh Nandu **in:** [Programming](https://www.systenics.com/blogs/category/programming/) **tags:**[*ASP.NET MVC*](https://www.systenics.com/blogs/tag/aspnet-mvc/), [*Umbraco*](https://www.systenics.com/blogs/tag/umbraco/), [*Bootstrap*](https://www.systenics.com/blogs/tag/bootstrap/)
Building responsive, fluid HTML5/CSS3 based websites are a rage these days delivering the best ROI for clients investing in building new web sites. Building a single website which adapts itself depending on the device screen size gives end users richer experiences. There are several ways of building responsive websites, one of the popular ways to to use an existing framework like Bootstrap which provide base scaffolding to quickly build responsive websites. In this blog post I am going to focus on how to integrate **Bootstrap v3.0.X** with Umbraco 7 to build a HTML5/CSS3 based fluid responsive website. The goal is to build a simple single page responsive web page similar to the Jumbotron [bootstrap sample](https://getbootstrap.com/examples/jumbotron/) and focus on the integration part so that you can build more complex layouts as required. I plan to build upon this sample in future blog posts.
This article assumes you have setup Umbraco 7 in VS 2013 as given in my previous blog post [Setting up Umbraco 7 in Visual Studio 2013 for MVC 4 development](https://www.systenics.com/blogs/setting-up-umbraco-7-in-visual-studio-2013-for-mvc-4-development/).
## Getting Started with Bootstrap integration
Open up the Umbraco 7 project in Visual Studio 2013 and start the Nuget Package Manager from **Tools** menu –>**Library Package Manager** –> **Package Manager Console**. On the Package Manager Console Screen, type the command**Install-Package bootstrap**. Please refer to Figure 1 to see the command being executed.
Figure 1: Install Bootstrap from Nuget
The above command will install the latest version of Bootstrap, currently its 3.0.3. The folder structure of the nuget package contents are different from the folder structure required by Umbraco. So we will have to move some files around to ensure that the bootstrap files are available within the Umbraco framework to be used. This nuget package creates the folders **Content** (for CSS files), **Fonts** (for Font files) and places JavaScripts in the **Scripts** folder in the root of the project. Umbraco needs style sheet files to be placed in the **CSS** folder. In the **Solution Explorer** window, expand the **Content** folder and select the **bootstrap-theme.min.css** and **bootstrap.min.css** style sheet files and drag them into the the **CSS** folder below as shown in Figure 2 below. This action will copy over the style sheet files we want to use into the correct Umbraco folder, the Font files and Script files are in their correct folders and do not need any change. Now bootstrap is ready to be used within our Umbraco template.
Figure 2: Solution Explorer – after copy of 2 style sheet files.
## Building Our Responsive, Fluid Sample
The simple web page that I plan to build will have single Homepage as shown in the [Jumbotron bootstrap sample](https://getbootstrap.com/examples/jumbotron/). Before you being building any website in Umbraco its very important to identify the sites structure followed by the structure of each page. Its essential that this information is thought through before hand so that its easier to arrange the Umbraco doctypes and templates accordingly. Figure 3 displays the layout for the Home page.
Figure 3: Home Page layout
As you can see from Figure 3 above the page has three distinct areas primary message, 3 secondary messages and login control. Both the Primary Message and Secondary Message areas have title and content areas. Once we have fixed the areas of the page we will define them as editable below so that the content editors can edit the appropriate content based on the structure of the page and not worry about its display format.
Since we are trying to build a replica of the Jumbotron Bootstrap sample, the best way to start is to analyze its source and build appropriate parts in Umbraco. You should follow this method whenever you try to implement a template which has predefined HTML/CSS provided with the designer. Open the Jumbotron sample in the browser**right-click** and select **View Source** from the context menu. This source will act as our guide while we try to build our template. The neat feature of Umbraco is that it can create identical HTML from its template without injecting any tags of its own. This is a great feature when you want to implement a new website based on designs provided by a designer. Listing 1 below shows the source code for the Jumbotron sample.
```
Jumbotron Template for Bootstrap
This is a template for a simple marketing or informational website. It includes a large callout called a jumbotron and three supporting pieces of content. Use it as a starting point to create something more unique.
Donec id elit non mi porta gravida at eget metus. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Etiam porta sem malesuada magna mollis euismod. Donec sed odio dui.
Donec id elit non mi porta gravida at eget metus. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Etiam porta sem malesuada magna mollis euismod. Donec sed odio dui.
Donec sed odio dui. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Vestibulum id ligula porta felis euismod semper. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus.
```
Listing 1: Jumbotron bootstrap sample source code.
We need to analyze this source to figure out all its external dependencies like images, style sheets and javascripts to ensure we have that available on our project structure. On analyzing the elements in Listing 1 above we can see that there is a reference to a **favicon.png, ie8-responsive-file-warning.js** and ** jumbotron.css** files which we do not have in our project. The **favicon.png** and **ie8-responsive-file-warning.js** we will omit as its not necessary for this sample, you can provide it and change its path as necessary in your project. The missing **jumbotron.css** file is what we need to add to our project.
### Add new Stylesheet to Umbraco
We need to add our custom **jumbotron.css** style sheet into to the project, this style sheet will contains styles which are specific to our site. Right click the **css** folder in the Solution Explorer and select **Add** –>** New Item**to open the Add New Item dialog. Select **Style Sheet** from the templates selection and give the name **jumbotron.css**and click **OK** to create the style sheet file. If you are viewing the source of the jumbotron sample is a browser like chrome, then click **jumbotron.css** file referenced to see its source. Copy paste the code from the css source (as shown in listing 2 below) into the**jumbotron.css** style sheet file open in visual studio. Listing 2 contains all the styles required by our custom website, feel free to update the style sheet as per your requirements. Save the file and we are ready to start building templates in Umbraco.
```
/* Move down content because we have a fixed navbar that is 50px tall */
body {
padding-top: 50px;
padding-bottom: 20px;
}
```
Listing 2: Jumbotron.css style sheet
## Creating the Site base Document Type
Now that we have addressed all the external dependencies of the site, its time to start working on the Umbraco templates. Run the Umbraco project in Visual Studio, it will launch the site in the default browser and inform you that site needs to be setup. Click on the **Setup your new website** button to be redirected to Umbraco administration site. Provide the credentials Username: **root** and Password: **@123test** (if you are using code from my previous sample) to login to the administration control panel.
The first step for creating a new site is to create a new **Document Type** in Umbraco. Umbraco allows you to nest Document Types, its an important feature to ensure that common properties for all documents are defined at the base document level so that they are reused in child document types. Its very similar to the master page concept in ASP.NET, but different given the fact that master pages deal with layouts (which are similar to the Templates concept in Umbraco) while document types deal with defining properties that will be available for the CMS Content Editor to edit. In our case there are three properties that we need to define on the base document type: **SEO Title**,** SEO Description** and **umbracoNaviHide**. The first two properties are self explanatory and will map to title and description meta tag in the content header. The 3rd property is specific named Umbraco property. Basically if you set the **umbracoNaviHide** property on any of the content pages it will make the page invisible from the navigation menu’s even though the page remains published. This property is optional, but I find it a good practice to include it since there are pages like Sitemap which need not show up in the navigation menu but at the same time they are required.
Click on **Settings** –>**Document Type (…)** –> **+ Create** as shown in figure 4 below to create a new Document Type.
Figure 4: Create new Document Type
In the **Create** dialog provide the **Name** as**[PageBase]** and click **Create** to create the Document Template as well as a matching Template with the same name as shown in figure 5. The Template will be used as our Master Layout.
Figure 5: Create new [PageBase] document type and Template
The **[Pagebase]** document type will open in the editor. Switch to the **Generic properties** tab and click on the **Click here to add a new property** link to add the 3 properties as listed below and **save**them. Figures 6 to 8 show them being added.
Name: SEO Title
Alias: sEOTitle
Type: Textstring
Figure 6: SEO Title Property
Name: SEO Description
Alias: sEODescription
Type: textbox multiple
Figure 7: SEO Description Property
Name: umbracoNaviHide
Alias: umbracoNaviHide
Type: True/false
Figure 8: UmbracoNaviHide property
Now that we have our base page setup we need to create Partial View for our Site Navigation Header so that we can include it into our **[PageBase]** template. Right click **Partial Views** under **Settings** and select **Create** from the menu. In the **Create** dialog give the **Name** as **Navigation** and click **Create** to create the Partial view and open its editor. Copy paste the code from listing 3 below into the editor and click the **Save** button to save the partial view.
```
@inherits Umbraco.Web.Mvc.UmbracoTemplatePage
@*
Macro to display child pages below the root page of a standard website.
Also highlights the current active page/section in the navigation with
the css class "current".
*@
@{
@*Get the root of the website *@
var root = CurrentPage.AncestorOrSelf(1);
}
```
Listing 3: Navigation Partial View
The above listing uses the Bootstrap Navigation bar component to build the navigation menu. We loop over all published and visible pages in Umbraco to build the dynamic navigation menu. You can see that rest of the HTML code is copied from the Jumbotron source which we had opened in the browser.
Under **Settings**, expand **Templates** node and click on the** [PageBase]** template to open it in Umbraco editor. This template was automatically created when we created the Document Type with the same name. This template will server as our Master Layout template. Copy Paste code from listing 4 into the editor and click the **Save** button to save the template in Umbraco.
```
@inherits Umbraco.Web.Mvc.UmbracoTemplatePage
@{
Layout = null;
}
@Umbraco.Field("sEOTitle")
@Html.Partial("Navigation", @Model.Content)
@RenderSection("jumbotron")
@RenderSection("content")
```
Listing 4: [PageBase] template
In the above listing I have defined a HTML5 based responsive template using Bootstrap classes where necessary. If you compare the code from Listing 3 below with the source from Listing 1 you will find that I have kept the HTML which will repeat on all pages in the**[PageBase]** template and the home page specific HTML has been replaced by RenderSection razor commands which will be rendered from the child templates. I have also changed the path for all local CSS and JavaScript files so that they point to the right local folder. The appropriate Bootstrap style sheets and JavaScripts have also been included into the template file. You will also find that I am using the Umbraco Field method to define the SEO Title and SEO Description properties that we defined on the **[PageBase]** document type on the page.
Now we need to define the Home Page document type, expand the **Document Types** node under **Settings**. Right click on the **[PageBase]** node and select **Create** from the menu. Provide the document name as **Home** and *uncheck* the **Create Matching template** checkbox and click **Create** button to create the **Home** document type under the **[PageBase]** document. We create it under the **[PageBase]** document so that it can inherit properties defined in the base document. Switch to the **Structure** tab and select **Yes** for **Allow at root**so that Home page can be the root of the site. **Save** the setting and switch to the **Tabs** tab so that we can define the tabs required for the Homepage. Add 2 new tabs named **Primary Message** and **Secondary Message** by entering the tab name and clicking**New Tab** button. Switch to the **Generic Properties** tab and add the following properties. These properties have been defined looking at the Jumbotron example and every bit of information that we want to be editable on the Home page needs to be defined as a property in the document type definition.
Name: homePrimaryMessageTitle
Alias: homePrimaryMessageTitle
Type: Textstring
Tab: Primary Message
Name: homePrimaryMessageContent
Alias: homePrimaryMessageContent
Type: Richtext editor
Tab: Primary Message
Name: homePrimaryLink
Alias: homePrimaryLink
Type: Content Picker
Tab: Primary Message
Name: homeSecondaryMessageTitle1
Alias: homeSecondaryMessageTitle1
Type: Textstring
Tab: Secondary Message
Name: homeSecondaryMessageContent1
Alias: homeSecondaryMessageContent1
Type: Richtext editor
Tab: Secondary Message
Name: homeSecondaryMessageLink1
Alias: homeSecondaryMessageLink1
Type: Content Picker
Tab: Secondary Message
Name: homeSecondaryMessageTitle2
Alias: homeSecondaryMessageTitle2
Type: Textstring
Tab: Secondary Message
Name: homeSecondaryMessageContent2
Alias: homeSecondaryMessageContent2
Type: Richtext editor
Tab: Secondary Message
Name: homeSecondaryMessageLink2
Alias: homeSecondaryMessageLink2
Type: Content Picker
Tab: Secondary Message
Name: homeSecondaryMessageTitle3
Alias: homeSecondaryMessageTitle3
Type: Textstring
Tab: Secondary Message
Name: homeSecondaryMessageContent3
Alias: homeSecondaryMessageContent3
Type: Richtext editor
Tab: Secondary Message
Name: homeSecondaryMessageLink3
Alias: homeSecondaryMessageLink3
Type: Content Picker
Tab: Secondary Message
Once you have saved all the properties your properties definition for the **Home** document type should look like figure 9 below.
Figure 9: Home document type properties
Now let’s define the matching **Home** template so that we have appropriate containers defined to display the properties that have been added by us. Expand the **Templates** node under **Settings** and right click on the existing **[PageBase]** template and select **Create** from the menu to create a new template using**[PageBase]** as the master template. Enter the template name as **Home** and click **Create** button to create it. You will see that the new template uses the**[PageBase]** template as the master page template. Copy paste the code from Listing 5 below into the editor for **Home** template and click the**Save** button to save the template.
```
@inherits Umbraco.Web.Mvc.UmbracoTemplatePage
@{
Layout = "PageBase.cshtml";
}
@section jumbotron{
}
```
Listing 5: Home template
The above listing 5 lays out the appropriate HTML elements using Bootstrap styles and also uses Umbraco **Field** razor to provide placeholder for content that will be provided by the end user. Now that we have the **Home** template setup we need to update the **Home** document type so that it uses this template by default. Expand **Document Types** under **Settings** and then select the **Home** document type. Under the **Info** tab, **Default Template** choose **Home** from the drop down list and click **Save** button. Now we are all set to build our content page for the **Home** document type. Click on **Content** icon, right click on **Content** and click on **Home** from the menu to create a new **Home** page as shown in figure 10.
Figure 10: Add Home page
This action will create a new content page with the Home document type. Provide the **Name** as **Home** and fill up the properties for the page. The properties that we defined in the Home document type are shown as tabs. These same tabs will be available to your content editors to edit content for the page. As you can see the content page really hides the inner implementation details of the page and just presents the user with a friendly view to edit content as per their requirements. The power of Umbraco CMS shines in this aspect where you are given totally liberty to define the tabs and its editable properties so that the content is presented to content editors in a format they understand rather than training the content editors to understand the limited structure other CMS systems provide.
Fill up the content of each of the **Home** page tabs and save them as you proceed. Its important that you also fill up the **SEO Title** and **SEO Description** properties on the **Properties** tab. You can see that even though these properties were defined on the**[PageBase]** document type, they have been inherited by the**Home** document type. Once you have filled all the information, click on the Save and Publish button to publish the page and make it available for everyone to view as shown in Figure 11 below.
Figure 11: Save home page properties
Figure 11 shows the unpublished view of the **Home** content page. Once the page is published you can see that Umbraco has provided a published date as well as path to view the published page. If you click on that path or access the Umbraco website Url in a new browser you will be able to view the final result of the responsive website. You can use the**Responsive Design View** tool available in latest version of**FireFox** browser to test the responsive capabilities of the site. Figures 12 to 14 show the Home page rendered in different browser sizes.
Figure 12: 320x480 Mobile view of the Home page
Figure 13: 768x1024 Tablet View
Figure 14: Full HD 1900x1080 view
The above 3 figures show the mobile, tablet and desktop view of the responsive Home page. You can see how the page menu automatically changes to an icon on the mobile screen (Figure 12,13) and other content elements are also laid out one below another on the mobile browser. You can see similar fluid changes between the tablet and desktop screen sizes.
## Summary
In this blog post I have integrated the popular Bootstrap framework into Umbraco 7 CMS. I have covered all the steps related to integration as well as building your first responsive, fluid Home page in Umbraco 7. This blog post should serve as a starting point for anyone interested in building responsive fluid layouts on Umbraco 7. In future blog posts I plan to extend on this sample adding more features.
## Download
[Click here](https://www.systenics.com/media/CreatingResponsiveBootstrapUmbraco7.zip) to download the sample used in this article.
## Related pages on Systenics
- [AuctionWorx development and customization](https://www.systenics.com/auctionworx/development-and-customization/)
## Need help implementing this for your business?
Our team helps plan, build, and scale marketplace and auction workflows. Explore [industry solutions](https://www.systenics.com/solutions/), [platform products](https://www.systenics.com/products/), and [custom development services](https://www.systenics.com/auctionworx/development-and-customization/) tailored to your goals.
[Book a quick consultation](https://outlook.office.com/bookwithme/user/231015685f21467da5ef6e3eb8b50240@systenics.com/meetingtype/hbYq2z1Hj0C2e7DuwBqdnw2?anonymous&ep=mcard).
---
## Page: Create a Responsive, Fluid HTML5/CSS3 based website on Umbraco 6 using Twitter Bootstrap
URL: https://www.systenics.com/blogs/create-a-responsive-fluid-html5css3-based-website-on-umbraco-6-using-twitter-bootstrap/
Description: Building responsive, fluid HTML5/CSS3 based websites are a rage these days delivering the best ROI for clients investing in building new web sites. Building a single website which adapts itself depending on the device screen size gives end users richer experiences. There are several ways of building responsive websites, one of the popular ways to to use an existing framework like Bootstrap from Twitter which provide base scaffolding to quickly build responsive websites. In this blog post I am going to focus on how to integrate Twitter Bootstrap with Umbraco 6 and MVC/Razor display engine to build a HTML5/CSS3 based responsive website. The goal is to build a simple single page responsive website similar to the fluid bootstrap sample and focus on the integration part so that you can build more complex layouts as required. I plan to build upon this sample in future blog posts.
# Create a Responsive, Fluid HTML5/CSS3 based website on Umbraco 6 using Twitter Bootstrap
**by:** Saurabh Nandu **in:** [Programming](https://www.systenics.com/blogs/category/programming/) **tags:**[*ASP.NET MVC*](https://www.systenics.com/blogs/tag/aspnet-mvc/), [*Razor*](https://www.systenics.com/blogs/tag/razor/), [*Umbraco*](https://www.systenics.com/blogs/tag/umbraco/), [*Bootstrap*](https://www.systenics.com/blogs/tag/bootstrap/)
Building responsive, fluid HTML5/CSS3 based websites are a rage these days delivering the best ROI for clients investing in building new web sites. Building a single website which adapts itself depending on the device screen size gives end users richer experiences. There are several ways of building responsive websites, one of the popular ways to to use an existing framework like Bootstrap from Twitter which provide base scaffolding to quickly build responsive websites. In this blog post I am going to focus on how to integrate **Twitter Bootstrap** with Umbraco 6 and MVC/Razor display engine to build a HTML5/CSS3 based responsive website. The goal is to build a simple single page responsive website similar to the fluid [bootstrap sample](http://twitter.github.io/bootstrap/examples/fluid.html) and focus on the integration part so that you can build more complex layouts as required. I plan to build upon this sample in future blog posts.
I am aware that there exists a Bootstrap package for Umbraco, but I found that it has not been updated in a while so I choose to start with a blank slate. I this blog post I am assuming that you have already setup [Umbraco 6 with MVC](https://www.systenics.com/blogs/setting-up-umbraco-6-in-visual-studio-2012-for-mvc-development/) as explained in the last blog post. The Visual Studio 2012 project that I am using is already provided as a download in the previous article.
## Getting Started with Bootstrap integration
Once you have the Visual Studio 2012 project ready, head over to the [Bootstrap website](http://twitter.github.io/bootstrap/index.html) to [download](http://getbootstrap.com/2.3.2/) its zip file. Bootstrap provides a wide variety of [customization](https://www.systenics.com/auctionworx/development-and-customization/) options, for the purpose of this article I am just using the default download, feel free to customize your download as required. Extract the zip file to a temporary folder so that its contents are available for us to import into Umbraco. You can learn more about the files included in the bootstrap zip from [here](http://twitter.github.io/bootstrap/getting-started.html#file-structure), for the purpose of this blog I will focus on using only the required files and minified versions of the same, since I do not intend to customize the default Bootstrap scripts.
Run (Ctrl+F5) the Umbraco project from within Visual Studio to launch it in the browser so that we can start importing the bootstrap items into our project. If you have not created any content in your Umbraco then you will be presented with the default **Set up your website** button and click on it to login to the admin site (credentials for the admin site are given in the [previous article](https://www.systenics.com/blogs/setting-up-umbraco-6-in-visual-studio-2012-for-mvc-development/)). In case you already have a site setup, then navigate to [http:///Umbraco](http://sitename/Umbraco) to login into Umbraco admin by providing your credentials.
We need to import the Bootstrap JavaScript and CSS files into our project so that we can use them. In Visual Studio Solution Explorer window right click the project name and select**Add – > New Folder** from the context menu and give the name **css** to the new folder (if one does not already exist). Umbraco by default imports all style sheet files stored in this folder. Right click the **css** folder in Solution Explorer and select **Add** –> **Existing Item** from the context menu, navigate to the folder where you have extracted the boostrap files and select both **bootstrap.min.css** and **bootstrap-responsive.min.css** files from the **css** folder. This step will import the boostrap style sheets into your Visual Studio project as well as into Umbraco. Now right click the **scripts** folder in Solution Explorer and select**Add** –> **Existing Item** from the context menu, navigate to the folder where you have extracted the bootstrap files and select **bootstrap.min.js** file from the **js** folder. This step will import the bootstrap JavaScript file into Visual Studio as well as Umbraco. This completes our integration of Bootstrap into Umbraco we now move on to building our simple responsive website.
## Building Our Responsive, Fluid Sample
The simple website that I plan to build will have single Homepage as shown in the [bootstrap sample](http://twitter.github.io/bootstrap/examples/fluid.html). Before you being building any website in Umbraco its very important to identify the sites structure followed by the structure of each page. Its essential that this information is thought through before hand so that its easier to arrange the Umbraco doctypes and templates accordingly. Figure 1 displays the layout for the Home page.
Figure 1 – Published Responsive Bootstrap enabled Umbraco website
As you can see from Figure 1 above the page has three distinct areas primary message, 3 secondary messages and a sidebar. Both the Primary Message and Secondary Message areas have title and content areas. Once we have fixed the areas of the page we will define them as editable below so that the content editors can edit the appropriate content based on the structure of the page and not worry about its display format.
To get started with the custom editing, we need to add our custom site-specific style sheet into to the project, this style sheet will contains styles which are specific to our site. Right click the **css** folder in the Solution Explorer and select **Add** –>**New Item** to open the Add New Item dialog. Select **Style Sheet** from the templates selection and give the name **site.css** and click**OK** to create the style sheet file. Copy paste the code from listing 1 below into the **site.css** style sheet file open in visual studio. Listing 1 contains all the styles required by our custom website, feel free to update the style sheet as per your requirements.
```
body {
padding-top: 60px;
padding-bottom: 40px;
}
.sidebar-nav {
padding: 9px 0;
}
@media (max-width: 980px) {
/* Enable use of floated navbar text */
.navbar-text.pull-right {
float: none;
padding-left: 5px;
padding-right: 5px;
}
}
```
Listing 1: site.css custom style sheet
### Creating the Site base Document Type
Umbraco allows you to nest Document Types, its an important feature to ensure that common properties for all documents are defined at the base document level so that they are reused in child document types. Its very similar to the master page concept in ASP.NET but different given the fact that master pages deal with layouts (which are similar to the Templates concept in Umbraco) while document types deal with defining properties that will be available for the CMS Content Editor to edit. In our case there are three properties that we need to define on the base document type: SEO Title, SEO Description and umbracoNaviHide. The first two properties are self explanatory and will map to title and description meta tag in the content header. The 3rd property is specific named Umbraco property. Basically if you set the umbracoNaviHide property on any of the content pages it will make the page invisible from the navigation menu’s even though the page remains published. This property is optional but I find it a good practice to include it since there are pages like Sitemap which need not show up in the navigation menu but at the same time they are required.
In the web browser go to the Umbraco administration portal. Select **Settings** from the **Sections** as shown in figure 2 below.
Figure 2: Umbraco Admin Settings
Right click on **Document Types** under **Settings** and select **Create** from the context menu (as shown in figure 3) to create a new Document Type.
Figure 3: Create new Document Type
In the **Create** dialog provide the **Name** as**[PageBase]** and click **Create** to create the Document Template as well as a matching Template with the same name as shown in figure 4. The Template will be used as our Master Layout.
Figure 4: Create Base Document Type
The **[Pagebase]** document type will open in the editor. Switch to the **Generic properties** tab and click on the **Click here to add a new property** bar to add the 3 properties as listed below and **save** them. Figures 5 to 7 show them being added.
Name: SEO Title
Alias: sEOTitle
Type: Textstring
Figure 5: SEO Title Property
Name: SEO Description
Alias: sEODescription
Type: textbox multiple
Figure 6: SEO Description property
Name: umbracoNaviHide
Alias: umbracoNaviHide
Type: True/false
Figure 7: umbracoNaviHide property
Now that we have our base page setup we need to create Partial View for our Site Navigation Header so that we can include it into our **[PageBase]** template. Right click **Partial Views** under **Settings** and select **Create** from the context menu. In the **Create** dialog give the **Name** as **Navigation** and click **Create** to create the Partial view and open its editor. Copy paste the code from listing 2 below into the editor and click the Save icon to save the partial view.
```
@inherits Umbraco.Web.Mvc.UmbracoViewPage
@{
Layout = null;
var parent = Model.AncestorOrSelf(1);
string classSelectedMenuItem = "";
// Special Handling for Home page
if(Model.Name == parent.Name)
{
classSelectedMenuItem = "active";
}
}
```
Listing 2: NavigationHeader partial view
The above listing uses the Bootstrap Navigation bar to build the navigation menu. We loop over all published and visible pages in Umbraco to build the dynamic navigation menu.
Under **Settings**, expand **Templates** node and click on the**[PageBase]** template to open it in Umbraco editor. This template with automatically created when we created the Document Type with the same name. This template will server as our Master Layout template. Copy Paste code from listing 3 into the editor and click the **Save** icon to save the template in Umbraco.
```
@inherits Umbraco.Web.Mvc.UmbracoTemplatePage
@{
Layout = null;
}
@Umbraco.Field("sEOTitle")
@RenderSection("Content")
```
Listing 3 - [PageBase] template
In the above listing I have defined a HTML5 based responsive template using Bootstrap classes where necessary. The appropriate Bootstrap style sheets and JavaScripts have also been included into the template file. I have defined one section **Content** on the page which will be replaced by appropriate child pages. You will also find that I am using the Umbraco Field method to define the SEO Title and SEO Description properties that we defined on the **[PageBase]** document type on the page.
Now we need to define the Home Page document type, expand the **Document Types** node under **Settings**. Right click on the **[PageBase]** node and select **Create** from the context menu. Provide the document name as **Home** and *uncheck* the **Create Matching template** checkbox and click **Create** button to create the **Home** document type under the **[PageBase]** document. We create it under the **[PageBase]** document so that it can inherit properties defined in the base document. Switch to the **Structure** tab and select **Yes** for **Allow at root** so that Home page can be the root of the site. **Save** the setting and switch to the **Tabs** tab so that we can define the tabs required for the Homepage. Add 3 new tabs named **Primary Message**, **Secondary Message** and **Sidebar** by entering the tab name and clicking **New Tab** button. Switch to the **Generic Properties** tab and add the following properties.
Name: homePrimaryMessageTitle
Alias: homePrimaryMessageTitle
Type: Textstring
Tab: Primary Message
Name: homePrimaryMessageContent
Alias: homePrimaryMessageContent
Type: Richtext editor
Tab: Primary Message
Name: homeSecondaryMessageTitle1
Alias: homeSecondaryMessageTitle1
Type: Textstring
Tab: Secondary Message
Name: homeSecondaryMessageContent1
Alias: homeSecondaryMessageContent1
Type: Richtext editor
Tab: Secondary Message
Name: homeSecondaryMessageTitle2
Alias: homeSecondaryMessageTitle2
Type: Textstring
Tab: Secondary Message
Name: homeSecondaryMessageContent2
Alias: homeSecondaryMessageContent2
Type: Richtext editor
Tab: Secondary Message
Name: homeSecondaryMessageTitle3
Alias: homeSecondaryMessageTitle3
Type: Textstring
Tab: Secondary Message
Name: homeSecondaryMessageContent3
Alias: homeSecondaryMessageContent3
Type: Richtext editor
Tab: Secondary Message
Name: homeSidebar
Alias: homeSidebar
Type: Richtext editor
Tab: Secondary Message
Once you have saved all the properties your properties definition for the **Home** document type should look like figure 8 below.
Figure 8: Properties defined for Home document type
Now let’s define the matching **Home** template so that we have appropriate containers defined to display the properties that have been added by us. Expand the **Templates** node under **Settings** and right click on the existing **[PageBase]** template and select **Create** from the context menu to create a new template using **[PageBase]** as the master template. Enter the template name as **Home** and click **Create** button to create it. You will see that the new template uses the**[PageBase]** template as the master page template. Copy paste the code from Listing 4 below into the editor for **Home** template and click the **Save** icon to save the template.
```
@inherits Umbraco.Web.Mvc.UmbracoTemplatePage
@{
Layout = "PageBase.cshtml";
}
@section content{
@Umbraco.Field("homeSidebar")
@Umbraco.Field("homePrimaryMessageTitle")
@Umbraco.Field("homePrimaryMessageContent")
@Umbraco.Field("homeSecondaryMessageTitle1")
@Umbraco.Field("homeSecondaryMessageContent1")
@Umbraco.Field("homeSecondaryMessageTitle2")
@Umbraco.Field("homeSecondaryMessageContent2")
@Umbraco.Field("homeSecondaryMessageTitle3")
@Umbraco.Field("homeSecondaryMessageContent3")
}
```
Listing 4 – Home template
The above listing 4 lays out the appropriate HTML elements using Bootstrap styles and also uses Umbraco **Field** method to provide placeholder for content that will be provided by the end user. Now that we have the **Home** template setup we need to update the **Home** document type so that it uses this template by default. Expand **Document Types** under **Settings** and then select the **Home** document type. Under the **Info** tab, **Default Template** choose **Home** from the drop down list and click **Save** icon. Now we are all set to build our content page for the **Home** document type. Click on **Content** icon (figure 2) under **Sections** and from the top tree view right click on **Content** under**Content** title and select **Create** from the context menu. Provide the **Name** as **Home** and select the **Document Type****Home** and click on **Create** button to create the new content as shown in figure 9.
Figure 9 – Create Home content page
You will see that the Home content page is created but unpublished (indicated by the greyed out icon for the page – figure 10) and you are presented with tab to fill up the content for the page. These same tabs will be available to your content editors to edit content for the page. As you can see the content page really hides the inner implementation details of the page and just presents the user with a friendly view to edit content as per their requirements. The power of Umbraco CMS shines in this aspect where you are given totally liberty to define the tabs and its editable properties so that the content is presented to content editors in a format they understand rather than training the content editors to understand the limited structure other CMS systems provide.
Fill up the content of each of the **Home** page tabs and save them as you proceed. Its important that you also fill up the **SEO Title** and **SEO Description** properties on the **Properties** tab. You can see that even though these properties were defined on the **[PageBase]** document type, they have been inherited by the **Home** document type. Once you have filled all the information, click on the Save and Publish icon (circled red in Figure 10) to publish the page and make it available for everyone to view.
Figure 10 – Unpublished Home content page
Figure 10 shows the unpublished view of the **Home** content page. Once the page is published you can see that Umbraco has provided a published date as well as path to view the published page. If you click on that path or access the Umbraco website Url in a new browser you will be able to view the final result of the responsive website. You can use the **Responsive Design View** tool available in latest version of **FireFox** browser to test the responsive capabilities of the site. Figures 11 to 13 show the Home page rendered in different browser sizes.
Figure 11 – 320x480 Mobile view of the Home page
Figure 12 – 786x1024 Tablet view of the Home page
Figure 13 – 1280x600 Desktop view of the Home page
The above 3 figures show the mobile, tablet and desktop view of the responsive Home page. You can see how the page menu automatically changes to an icon on the mobile screen (Figure 11,12) and other content elements are also laid out one below another on the mobile browser. You can see similar fluid changes between the tablet and desktop screen sizes.
## Summary
In this blog post I have integrated the popular Twitter Bootstrap framework into Umbraco 6 CMS. I have covered all the steps related to integration as well as building your first responsive, fluid Home page in Umbraco 6. This blog post should serve as a starting point for anyone interested in building responsive fluid layouts on Umbraco 6. In future blog posts I plan to extend on this sample adding more features.
## Download
[Click here](https://www.systenics.com/media/CreatingResponsiveBootstrapUmbraco6.zip) to download the sample used in this article.
## Related pages on Systenics
- [AuctionWorx development and customization](https://www.systenics.com/auctionworx/development-and-customization/)
## Need help implementing this for your business?
Our team helps plan, build, and scale marketplace and auction workflows. Explore [industry solutions](https://www.systenics.com/solutions/), [platform products](https://www.systenics.com/products/), and [custom development services](https://www.systenics.com/auctionworx/development-and-customization/) tailored to your goals.
[Book a quick consultation](https://outlook.office.com/bookwithme/user/231015685f21467da5ef6e3eb8b50240@systenics.com/meetingtype/hbYq2z1Hj0C2e7DuwBqdnw2?anonymous&ep=mcard).
---
## Page: Create a Grid View with paging and sorting feature using ASP.NET MVC Razor and LINQ
URL: https://www.systenics.com/blogs/create-a-grid-view-with-paging-and-sorting-feature-using-aspnet-mvc-razor-and-linq/
Description: Recently, I came across a requirement to create a Grid View with paging and column sorting feature. Since, I was using ASP.NET MVC there was no server side control such as Repeater, GridView or DataList which are available in ASP.NET. I googled but didn’t come across a good solution except few third-party paid ASP.NET MVC controls. So finally I decided to code my own Grid View with support for paging and column sorting with help from information available on blogs and forums. Even though I am showing the code in context of an example its extensible enough to reuse it elsewhere.
# Create a Grid View with paging and sorting feature using ASP.NET MVC Razor and LINQ
**by:** Ravindra Parcha **in:** [Programming](https://www.systenics.com/blogs/category/programming/) **tags:**[*C#*](https://www.systenics.com/blogs/tag/c-sharp/), [*ASP.NET MVC*](https://www.systenics.com/blogs/tag/aspnet-mvc/)
Recently, I came across a requirement to create a Grid View with paging and column sorting feature. Since, I was using ASP.NET MVC there was no server side control such as Repeater, GridView or DataList which are available in ASP.NET. I googled but didn't come across a good solution except few third-party paid ASP.NET MVC controls. So finally I decided to code my own Grid View with support for paging and column sorting with help from information available on blogs and forums. Even though I am showing the code in context of an example its extensible enough to reuse it elsewhere.
## Prerequisites
Visual Studio 2012
Entity Framework
LocalDb (to deploy the database or you can use SQL Server)
## Key Features
1. Provide Previous/Next button at the bottom of the grid.
2. Provide drop down list to directly jump to any page.
3. Click on column name to sort data.
4. Show current page number and total pages.
In this example, I am using the list of countries to demonstrate paging and column sorting feature.
Listing 1: Screenshot of Grid View with support for paging and column sorting
## Let's start coding
Before looking at the actual implementation of paging and sorting in Grid View, let's start by creating a ViewModel which allow us to customize the data to be viewed and control different aspects of our Grid View. I am using Entity Framework 5, code-first model.
Listing 2: CountryViewModel.cs
```
public class CountryTypeViewModel
{
public List CountryList { get; set; }
public int CurrentPage;
public int pageSize;
public double TotalPages;
public int sortBy;
public bool isAsc;
public string Search;
public int isLastRecord;
public int Count;
}
public class CountryViewModel
{
public int CountryID { get; set; }
public string Name { get; set; }
public string Region { get; set; }
}
```
The class CountryViewModel is a ViewModel that shows only specific columns instead of displaying all the columns defined in the table. A list of CountryViewModel and other properties related to paging and column sorting used in Grid View is defined under CountryTypeViewModel class.
Let's take a look at the action in Controller for Grid View.
Listing 3: GridViewController.cs
```
public CountryTypeViewModel GetCountry(int page = 1, int sortBy = 1, bool isAsc = true, bool isPaging = false)
{
CountryDBContext db = new CountryDBContext();
int pageSize = Convert.ToInt16(ConfigurationManager.AppSettings["PageSize"]);
IEnumerable countryList = null;
CountryTypeViewModel obj = new CountryTypeViewModel();
string sortColumn = string.Empty;
#region SortingColumn
switch (sortBy)
{
case 1:
if (isAsc)
sortColumn = "CountryID";
else
sortColumn = "CountryID Desc";
break;
case 2:
if (isAsc)
sortColumn = "Name";
else
sortColumn = "Name Desc";
break;
case 3:
if (isAsc)
sortColumn = "Region";
else
sortColumn = "Region Desc";
break;
}
#endregion
if (!isPaging)
{
countryList = (from p in db.CountryList
select new CountryViewModel
{
CountryID = p.CountryID,
Name = p.Name,
Region = p.Region
}).OrderBy(sortColumn).ToList();
obj.TotalPages = countryList.Count();
}
else if (isPaging)
{
countryList = (from p in db.CountryList
select new CountryViewModel
{
CountryID = p.CountryID,
Name = p.Name,
Region = p.Region
}).OrderBy(sortColumn).Skip((page - 1) * pageSize).Take(pageSize + 1).ToList();
}
obj.CurrentPage = page;
obj.pageSize = pageSize;
obj.sortBy = sortBy;
obj.isAsc = isAsc;
if (countryList.Count() <= pageSize)
obj.isLastRecord = 2;
if (obj.isLastRecord != 2)
{
if (countryList.Count() <= pageSize)
obj.isLastRecord = 1;
else
obj.isLastRecord = 0;
}
obj.CountryList = countryList.Take(pageSize).ToList();
return obj;
}
```
The method GetCountry is invoked from Index and CountryList actions.
An IEnumerable of type CountryViewModel is defined which ultimately hold the list of all countries. A switch-case block is used which identifies the column number using isAsc variable and sorts using with the help of extension method accordingly.
Also, depending on the current page and page size set from web.config, the LINQ query will select only specific records.
Listing 4: LINQ query to fetch specific records (GridViewController.cs)
```
countryList = (from p in db.CountryList
select new CountryViewModel
{
CountryID = p.CountryID,
Name = p.Name,
Region = p.Region
}).OrderBy(sortColumn).Skip((page - 1) * pageSize).Take(pageSize + 1).ToList();
```
Listing 5: Index action method code when page loads for the first time
```
public ActionResult Index()
{
CountryTypeViewModel obj = new CountryTypeViewModel();
obj = GetCountry(1, 1, true, false);
List PageCount = new List();
for (int i = 1; i <= Math.Ceiling(obj.TotalPages / obj.pageSize); i++)
PageCount.Add(i.ToString());
ViewBag.TotalCountDropDown = new SelectList(PageCount.ToList());
ViewBag.SelectPageIndex = 1;
return View(obj);
}
```
Listing 6: CountryList action method called when next or previous button is clicked
```
public ActionResult CountryList(int page = 1, int sortBy = 1, bool isAsc = true, string TotalCount = null, string SelectPageIndex = null)
{
CountryTypeViewModel obj = new CountryTypeViewModel();
bool isPaging = false;
if (page > 1)
isPaging = true;
if (SelectPageIndex != null)
{
page = Convert.ToInt32(SelectPageIndex);
isPaging = true;
}
obj = GetCountry(page, sortBy, isAsc, isPaging);
if (obj.TotalPages == 0)
obj.TotalPages = Convert.ToDouble(TotalCount);
List PageCount = new List();
for (int i = 1; i <= Math.Ceiling(obj.TotalPages / obj.pageSize); i++)
PageCount.Add(i.ToString());
ViewBag.TotalCountDropDown = new SelectList(PageCount.ToList());
ViewBag.SelectPageIndex = 1;
return View("Index", obj);
}
```
This completes the business logic on Controller side.
Let's take a look at code on the View side.
The helper method SortLink will create link for table header column and the for-each loop creates table rows.
Listing 7: Helper method for SortLink
```
@helper sortLink(string name, int id)
{
@name
if (id == Model.sortBy)
{
}
}
@sortLink("ID", 1)
@sortLink("Country Name", 2)
@sortLink("Region", 3)
@{ int i = 1;
foreach (GridViewSample.Models.ViewModel.CountryViewModel item in Model.CountryList)
{
@item.CountryID
@item.Name
@item.Region
}
}
```
## Performance Aspect
Let's take a look at coding to see how the performance was improved. As a developer, it is very important that we focus on performance during the development cycle instead of investing time after the task gets completed or when the feature goes live. Most of the solutions were fetching all records from SQL Server and later sorting was performed on objects during runtime. This resulted in setting up two objectives which I tried to accomplish using this sample application.
1. When paging is done, fetch only number of records defined in the page size instead of fetching all records and then filtering the records based on page index. Most solutions were fetching all records from database and later paging was done in .NET application pool. Every next or previous click was hitting the server for all the records. When records are less no performance issue you would see generally but when records are in millions, impact is addressable easily and we see the performance lag.
2. When we go for sorting the records, it's done on all records not on just grid view's current page records using OrderBy clause. One way doing it is just retrieve all records, apply the OrderBy clause on it and show the sorted records based on pagination current page number. Here again, we are stuck to all records retrieving process which is not desirable.
Both objectives were achieved using LINQ Extension methods. Here is the reference link which I have referred for this sample application.
[http://aonnull.blogspot.in/2010/08/dynamic-sql-like-linq-orderby-extension.html](http://aonnull.blogspot.in/2010/08/dynamic-sql-like-linq-orderby-extension.html)
Listing 8: Use of Extension method in paging and sorting query.
```
string sortColumn = string.Empty;
switch (sortBy)
{
case 1:
if (isAsc)
sortColumn = "CountryID";
else
sortColumn = "CountryID Desc";
break;
case 2:
if (isAsc)
sortColumn = "Name";
else
sortColumn = "Name Desc";
break;
case 3:
if (isAsc)
sortColumn = "Region";
else
sortColumn = "Region Desc";
break;
}
```
The code snippet given below shows the use of sorting and paging using LINQ.
.OrderBy(sortColumn).Skip((page - 1) * pageSize).Take(pageSize + 1).ToList();
Now both sorting and paging work efficiently by fetching required records using skip() and take() methods from LINQ.
## Deploy Database into LocalDb using Package Manager Console
1. Download the source code file attached below.
2. Unzip and open GridViewSample.sln using Visual Studio 2012.
3. Build solution using Ctrl + Shift + B or click on Build menu → Build Solution.
4. Now open Package Manager Console from Tools → Library Package Manager.
5. Migration is already enabled. Hence, type the following command in Package Manager Console window.
PM> Update-Database –verbose
6. The above command will deploy the database into LocalDb and using the Seed method populate few records into Countries table.
7. Now hit Ctrl + F5 to run the application.
## Areas of Improvement
This sample application can be tweaked further to include search feature. I would recommend using Lucene.Net for search.
I hope you find this post helpful. Happy Coding :)
## Download Sample
[Click here](https://www.systenics.com/media/20130420_GridViewSampleMvc.zip) to download the sample application explained in this blog.
## Related pages on Systenics
- [AI-powered listing description generation](https://www.systenics.com/auctionworx/ai-enhanced-listings-description-generation/)
- [AuctionWorx products](https://www.systenics.com/products/)
- [Industry solutions](https://www.systenics.com/solutions/)
## Need help implementing this for your business?
Our team helps plan, build, and scale marketplace and auction workflows. Explore [industry solutions](https://www.systenics.com/solutions/), [platform products](https://www.systenics.com/products/), and [custom development services](https://www.systenics.com/auctionworx/development-and-customization/) tailored to your goals.
[Book a quick consultation](https://outlook.office.com/bookwithme/user/231015685f21467da5ef6e3eb8b50240@systenics.com/meetingtype/hbYq2z1Hj0C2e7DuwBqdnw2?anonymous&ep=mcard).
---
## Page: Bundle and Minify CSS/JS using ClientDependency in Umbraco 6 MVC/Razor
URL: https://www.systenics.com/blogs/bundle-and-minify-cssjs-using-clientdependency-in-umbraco-6-mvcrazor/
Description: This is going to be a short post on how to configure style sheets and JavaScript
# Bundle and Minify CSS/JS using ClientDependency in Umbraco 6 MVC/Razor
**by:** Saurabh Nandu **in:** [Programming](https://www.systenics.com/blogs/category/programming/) **tags:**[*ASP.NET MVC*](https://www.systenics.com/blogs/tag/aspnet-mvc/), [*Razor*](https://www.systenics.com/blogs/tag/razor/), [*Umbraco*](https://www.systenics.com/blogs/tag/umbraco/)
This is going to be a short post on how to configure style sheets and JavaScript's bundling and minification in Umbraco 6 using **ClientDependency** framework in MVC. The benefits of bundling and minification are obvious as they reduce the number of HTTP requests as well as decrease the download size of resources to the browser resulting in a faster browsing experience. While Microsoft has prebuilt its own libraries to enable these features, Umbraco uses the **ClientDependency** framework to achieve the same. You can read more about the client dependency framework from its [codeplex website](http://clientdependency.codeplex.com/), its got quite a few configurations options and you and read more about them on its website. In this post I am just going to focus on getting an initial configuration up and running since there seems to be lack of clear documentation on the topic and it took me a while too to figure how to set it up correctly.
This article assumes that you already have a installation of Umbraco 6 and have configured its rendering engine to use ASP.NET MVC for the pages.
## Getting Started
The first essential step for **ClientDependency** to work is to ensure that **debug** mode is turned off in the**web.config** file. It's a neat idea, when you are in debug mode, bundling and minification is not applied so you can easily debug your files and continue fixing your css/js. Only when you are ready with the final output and ready for deployment which is indicated by setting **debug** mode as false, it acts as a trigger to turn on **ClientDependency** framework to come into play. So if you are not able to see the effects of bundling and minification the first checkpoint would be to ensure that you have set the **debug** mode to false in the **web.config** file.
```
.....
...
```
Listing 1: Debug mode set as false
The listing above shows a part of the **web.config** file explicitly setting the **debug** mode as false. The next step is to configure the **ClientDependency** framework configuration. Umbraco has a special config file in the **config** folder called **ClientDependency.config** which contains the configuration for the ClientDependency framework. In my test, the standard config file shipped with Umbraco 6.0 did not work correctly for MVC. Using it always lead to errors and at times the assembly ClientDependency.Core.MVC was reported missing by the ASP.NET runtime.
The solution that I found, was to replace contents of the **ClientDependency.config** file with the sample configuration provided in the [sample documentation](http://clientdependency.codeplex.com/wikipage?title=Configuration&referringTitle=Documentation) on codeplex. Listing 2 shows the replaced contents of the config file.
```
```
Listing 2: Updated ClientDependency.config file
The config file above has configurations for both WebForms and MVC pages, you can read the documentation on codeplex to fine tune the configuration to meet the requirements of your project. One very powerful feature configured by the above config is **persistence**. Enabling persistence makes the framework save the bundled and mninified css/js to a temporary file on first run. All later requests are directly served from the static file, this ensures that CPU cycles on the server are saved at the same time response to the client becomes faster. This step can make a big impact on sites with a very high number of visitors. Another point to note is that if you look at line 14 the **clientDependency** tag has a **version** property, it is important to change the version number every time you update the css/js file. The persistence module does not detect changes to CSS/JS on the fly, so if you continue making changes in the css/js files they will not reflect! Ensure that after every change you manually update the version on the config file. The best way to tackle this issue is to ensure that you enable **ClientDependency** only after your JavaScript's and style sheets have stabilized or not use persistence till there is stabilization.
With the configurations setup we are ready to use this framework in our View Templates. Another hiccup is trying to make sense of how to use its HTML helpers in MVC. The [documentation provided at codeplex](http://clientdependency.codeplex.com/wikipage?title=MVCFileRegistration&referringTitle=Documentation) for MVC is inadequate and keeps giving errors when used with Umbraco. Searching through several forum posts there is a solution provided in one of them, but I am not sure why that clarity has not made it back into the original documentation.
The **ClientDependency** framework for MVC works in two parts, in first part you need to use HTML helper methods like **Html.RequireCss** and **Html.RequireJs** to define all the CSS/JS files that are needed on your page. The documentation linked above has various overloads for these helper methods. The second part is to use the **Html.RenderCssHere** and **Html.RenderJsHere** methods within your HTML markup to generate the appropriate link and script tags. Listing 3 shows a sample Umbraco MVC template
```
@inherits Umbraco.Web.Mvc.UmbracoTemplatePage
@using ClientDependency.Core.Mvc;
@{
Layout = "SystenicsBaseBase.cshtml";
@Html.RequiresCss("~/css/Site.css");
@Html.RequiresJs("~/scripts/jquery-1.9.1.min.js",1);
@Html.RequiresJs("~/scripts/commonscript.js",2);
}
@Umbraco.Field("sEOTitle")
@Html.Raw(@Html.RenderCssHere())
@Html.Raw(@Html.RenderJsHere())
.....
```
Listing 3 – Sample Umbraco Template using Html Helpers
Its important to note from code listing 3 that you need to first import the **ClientDependency.Core.Mvc** assembly to use its helpers. The second critical step is to ensure you use the**Html.RequireCss** and **Html.RequireJs** helpers within the initial razor block. I tried defining them elsewhere on the page and it always returns invalid markup. This is a common mistake not documented on the framework site, but it leads to everyone wasting time trying to figure it out. As you can see from the listing above I have included one style sheet and two JavaScript files to be bundled and minified. Lastly, within the HTML head tag the style sheet and JavaScript is rendered. You could alternatively load the JavaScript anywhere within your Body tag for lazy loading of JavaScript.
That's it! Save the template and fire up the Umbraco site in your browser, you will notice that it takes very long to render the first page, but later those pages are served very fast. You can also use the Chrome in-built tools to verify that the css/js files are indeed being bundled and compressed.
I hope this short post will help you setup ClientDependency in your Umbraco setup, making your client websites super fast!
## Related pages on Systenics
- [AuctionWorx products](https://www.systenics.com/products/)
## Need help implementing this for your business?
Our team helps plan, build, and scale marketplace and auction workflows. Explore [industry solutions](https://www.systenics.com/solutions/), [platform products](https://www.systenics.com/products/), and [custom development services](https://www.systenics.com/auctionworx/development-and-customization/) tailored to your goals.
[Book a quick consultation](https://outlook.office.com/bookwithme/user/231015685f21467da5ef6e3eb8b50240@systenics.com/meetingtype/hbYq2z1Hj0C2e7DuwBqdnw2?anonymous&ep=mcard).
---
## Page: Building an ASP.NET Core 1.1 Application with PostgreSQL on Ubuntu Linux
URL: https://www.systenics.com/blogs/building-an-aspnet-core-11-application-with-postgresql-on-ubuntu-linux/
Description: In this blog post, we will update the default scaffold ASP.NET Core 1.1 application using Entity Framework Core to connect to PostgreSQL database using Code first approach on Ubuntu Linux. We will explore some of the new features of ASP.NET Core 1.1 and how easy it is to use entity framework to connect to open source databases like PostgreSQL. We will be using the free, open source Visual Studio Code Editor and .NET CLI to build the application to understand how to build ASP.NET Core applications on Linux or other supported platforms.
# Building an ASP.NET Core 1.1 Application with PostgreSQL on Ubuntu Linux
**by:** Saurabh Nandu **in:** [Programming](https://www.systenics.com/blogs/category/programming/) **tags:**[*ASP.NET Core*](https://www.systenics.com/blogs/tag/aspnet-core/), [*Linux*](https://www.systenics.com/blogs/tag/linux/)
## Overview
ASP.NET Core 1.1 framework is the redefined version of tried and tested ASP.NET optimized to work cross platform and be hosted on various cloud platforms. Microsoft has finally opened up to embrace Linux rather than fight it off and the ASP.NET Core framework is a big step in that direction. In order to be able to achieve a true first class experience on the Linux Platform, Microsoft has rewritten the whole .NET Platform, releasing a subset of the BCL Framework under the .NET Standard and then the ASP.NET Core framework on top of it. ASP.NET Core was built from scratch to be platform independent and cloud optimized as a result of this it has far lesser features as compared to ASP.NET MVC 5 and is slowly catching up on the missing features implementing all the new ones in an platform independent way.
The move to a platform independent ASP.NET Core has several added advantages, dependence of ASP.NET on Windows Server, specifically IIS is gone! ASP.NET Core can be hosted on any of the supporting platforms, this a huge win for small projects where building an ASP.NET Application for clients was cost prohibitive since the clients had to pay the windows server tax. Having a hard dependence on IIS made ASP.NET to be highly uncompetitive from a cost perspective for small projects, where PHP based projects are far more popular due to lower cost of hosting. Heck even Amazon has started [$5 VPS Linux VPS service](https://www.amazonlightsail.com/)! Such low priced hosting solutions have been totally out of reach for ASP.NET developers, hopefully ASP.NET Core will be popular enough for the vendors to start offering it as a selectable runtime option.
The another benefit of moving cross platform is that dependence on Visual Studio goes away. Earlier, it has been unimaginable to build a professional ASP.NET application without using Visual Studio. Even though MS has released Visual Studio Community edition it has its hidden riders associated. ASP.NET Core on the other hand has been built to run via the CLI like other popular open source platforms for e.g NodeJS and any popular text editor can be used to build production sized applications. Microsoft's open source, light-weight Visual Studio Code Editor is also one of the good contenders for building ASP.NET Core applications.
In this blog post, we will update the default scaffold ASP.NET Core 1.1 application using Entity Framework Core to connect to PostgreSQL database using Code first approach on Ubuntu Linux. We will explore some of the new features of ASP.NET Core 1.1 and how easy it is to use entity framework to connect to open source databases like PostgreSQL. We will be using the free, open source Visual Studio Code Editor and .NET CLI to build the application to understand how to build ASP.NET Core applications on Linux or other supported platforms.
## Install ASP.NET Core 1.1 Framework on Ubuntu
The first step to start developing ASP.NET Core applications on Linux is to install the .NET Core runtime. Installation instructions are beyond the scope of this blog as well as constantly evolving as MS keeps updating their platform. As of now, 1.0.1 is the latest version of the .NET Core SDK which has support for the new **csproj** project file and other enhancements, you can install 1.0.1 version of the .NET SDK from [here](https://www.microsoft.com/net/core#linuxubuntu). I prefer Ubuntu 16.04 as the desktop environment for development. Once the .NET SDK is installed we can move forward to developing ASP.NET Core based applications.
## Installing Visual Studio Code
As mentioned above, ASP.NET Core has been freed from Visual Studio and any text editor can be used to develop ASP.NET Core based applications. In this blog I choose to use Visual Studio Code which is an open source offering from Microsoft getting quickly popular and has the best open source editor support for ASP.NET Core. Its been regularly updated and its available for Windows, Mac and Linux. You can download the latest version of [Visual Studio Code from its website](https://code.visualstudio.com/Download). The downloaded *.deb file can be clicked in the File Manager and installed with the Ubuntu Software Center. There are tons of popular extensions available for VS Code. One of the core ones that we will need is the C# extension. If you have VS Code open you can go to the Extensions icon and see the popular extensions. Click on the Install button for C# to install the extension and Reload button once the extension is installed to have it enabled. We are now all set to start building our first ASP.NET Core Application.
**Figure 1:** Install C# extension in Visual Studio Code
## Installing PostgreSQL on Ubuntu
PostgreSQL is a popular open source relational database. Installation and configuration of PostgreSQL is not in the scope for this blog. There are various help guides that can guide you through the installation and configuration steps. Personally I like the [DigitalOcean blog](https://www.digitalocean.com/community/tutorials/how-to-install-and-use-postgresql-on-ubuntu-16-04) which explains the installation and Configuration process in a fairly easy to understand manner. Once you have PostgreSQL installed you should be able to get to the **psql** prompt to run sql queries against your database.
## Starting a New ASP.NET Core project using VS Code
Now that we have the basics requirements for our first ASP.NET Core application ready we can dive straight up into creating our first ASP.NET Core application. Fire Up Visual Studio Code editor, and turn on the Integrated Terminal window from **View** Menu –> **Integrated Terminal** or using the shortcut **Ctrl+`**. The integrated terminal window will also us to run the Dotnet CLI commands so that we do not need an independent terminal window. Navigate to the folder where you wish to create your new application, I usually use create an **Applications** folder to store all my projects. Create a new folder called **AlumniConnect** under the **Applications** folder and use the **DOTNET** CLI command to create a new blank ASP.NET Core project.
Run the following commands as shown in Listing 1 below, in the Integrated Terminal in VS Code to create a new **AlumniConnect** folder as well as create a new ASP.NET Core application using the **dotnet** cli command. It is essential to give read write permissions to the current user on the newly created folder so that we can develop, build and debug the application without seeking admin permissions all the time.
```
sudo mkdir AlumniConnect
sudo chmod ugo+rwx AlumniConnect
cd AlumniConnect
dotnet new mvc --auth Individual --framework netcoreapp1.1
```
**Listing 1:** Dotnet CLI to generate new ASP.NET Core web project
**Figure 2:** Creating a new ASP.NET Core project using dotnet cli commands
As you can see from the figure 2 above, the **dotnet new** cli command has created a set of boiler plate files necessary to start an empty ASP.NET Core project. Before we start working with this project, we need to load it in VS Code editor. Click on the **File** menu –> **Open Folder** and select the **AlumniConnect** folder from the dialog to load the folder. As soon as the folder is selected, VS Code will load the folder and detect that its loading an ASP.NET Core application. Once the folder is loaded at the Integrated Terminal, type the **dotnet restore** command to restore all the NuGet packages for the project.
## Configuring the ASP.NET Core application to use PostgreSQL
The default template generated by the dotnet new cli command creates a project configured to use the SQLLite database. Since we wish to use PostgreSQL as our database one of the first things to do is to add the [Npgsql entity framework core provider](http://www.npgsql.org/efcore/index.html) to our project. To add a new nuget package to our project, run the commands shown in listing 2 in the Integrated Terminal window.
```
dotnet add package Npgsql.EntityFrameworkCore.PostgreSQL
sudo dotnet restore
sudo dotnet build
```
**Listing 2:** Adding Npgsql Entity Framework Core packages to project
The updated .NET SDK adds a new CLI command **dotnet add package ** to add NuGet packages to our project without manually editing and project files. You need to run the **dotnet restore** command after adding any package to ensure that dependent packages are also downloaded and added to the project.
Once we have the required packages we need to make a few changes to the existing generate code to use PostgreSQL instead of the default SQL Lite database. Open up the **appsettings.json** file in the editor and change the **DefaultConnection** property to point to our PostgreSQL database. You will note that ASP.NET Core has removed the **web.config** file and now web application related settings can be stored in the **appsettings.json** file. Make sure you replace the Username and Password in the connect string shown in **Listing 3** below with the right one for your PostgreSQL database.
```
{
"ConnectionStrings": {
"DefaultConnection":"Host=localhost;Database=AlumniConnectDB;Username=postgres;Password=mypassword"
},
.....
}
```
**Listing 3:** appsettings.json file with updated connection string
Next, open the **Startup.cs** file in the VS Code editor and include the **Using Npgsql.EntityFrameworkCore.PostgreSQL;** to reference the PostgreSQL namespace. Then under the **ConfigureServices** method update the code so that the DBContext uses Npgsql (line 45) as the database provider instead of SQL Lite. **Listing 4** shows the updated **Startup.cs** class.
```
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using AlumniConnect.Data;
using AlumniConnect.Models;
using AlumniConnect.Services;
using Npgsql.EntityFrameworkCore.PostgreSQL;
namespace AlumniConnect
{
public class Startup
{
public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true);
if (env.IsDevelopment())
{
builder.AddUserSecrets();
}
builder.AddEnvironmentVariables();
Configuration = builder.Build();
}
public IConfigurationRoot Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext(options =>
options.UseNpgsql(Configuration.GetConnectionString("DefaultConnection")));
services.AddIdentity()
.AddEntityFrameworkStores()
.AddDefaultTokenProviders();
services.AddMvc();
services.AddTransient();
services.AddTransient();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
}
app.UseStaticFiles();
app.UseIdentity();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
}
}
```
**Listing 5:** Changes to Startup.cs class to add PostgreSQL Support
The above changes are enough to switch from SQL Lite to PostgreSQL, although right now there is one more hack that we need to make to ensure that we can run the Entity Framework Migration tools from the CLI to update our database. I hope that its some kind of bug in the currently generated templates and future versions should not need this hack to enable the Entity Framework Tools. Open the AlumniConnect.csproj project file in the Visual Studio editor and add the **Microsoft.EntityFrameworkCore.Tools.DotNet**package definition to the **DotNetCliToolReference** reference section (lines 26 to 28) as shown in **Listing 6** below.
```
netcoreapp1.1aspnet-AlumniConnect-3EC0E2B9-6463-4A54-9EB7-EA6C51F0F7CC1.1.0
```
**Listing 6:** Updated AlumniConnect.csproj file
The updated .NET SDK has moved away from the JSON based **project.json**file to the XML based **project.csproj** file format to be compatible with older versions of ASP.NET project files. The NuGet pakcage definitions which used to be defined in **project.json** file have been shifted into the **project.csproj** amongst other project related settings. Once you save the **AlumniConnect.csproj** file, run the **sudo dotnet restore** command to download and install the **Microsoft.EntityFrameworkCore.Tools.DotNet** package. In my tests, I found that you need to provide elevated permissions after making this change since it downloads the NuGet package in outside the project folder for EF CLI support, so make sure to run this command with elevated permissions. Once it restores the package it will give our project Entity Framework Core CLI commands support.
Now that we have our Entity Framework setup completed, use the Integrated Terminal to fire of the command shown in listing 7 to publish our entities to the PostgreSQL database.
```
sudo dotnet ef database update
```
**Listing 7:** Publish PostgreSQL Database
The command shown in Listing 7 will create the **AlumniConnectDB** PostgreSQL database, if it does not exist as well as publish the schema based on the models required for the project. If you have **PGAdmin3** installed, then you can browse the **AlumniConnectDB** and see the schema generated by the EF CLI tool as shown in **Figure 3** below.
**Figure 3:** PGAdmin3 AlumniConnectDB Schema
Now that we have our EF CLI tools setup we can easily make further changes to the applications Models and use the EF Migrations CLI command to build schema migrations. You can learn more about the [EF CLI commands from here](https://docs.microsoft.com/en-us/ef/core/miscellaneous/cli/dotnet). Run the **dotnet build** and **dotnet run** commands again to launch the application. Point your web browser to [https://localhost:5000](https://localhost:5000/) to load the ASP.NET Core application. This time you can go to the Register link to register a new account (which creates an ASP.NET Identity account in PostgreSQL) as shown in **Figure 4**.
**Figure 4:** Register new account
This completes our short look at running ASP.NET Core 1.1 application on Ubuntu 16.04 using PostgreSQL database. In this blog post I have tried to cover some of the key new features provided by the ASP.NET Core and the .NET CLI. You can easy it very easy and seamless to integrate PostgreSQL into your ASP.NET Core application, almost making it a first class support database in the ASP.NET Core universe. I think this is a great step forward, to be able to unshackle the ASP.NET Framework from Windows Only, IIS Only, Visual Studio Only platform and make it a truly open source platform for development.
You can find the source for this project [here.](https://github.com/saurabhnandu/AlumniConnect)
## Related pages on Systenics
- [AuctionWorx products](https://www.systenics.com/products/)
## Need help implementing this for your business?
Our team helps plan, build, and scale marketplace and auction workflows. Explore [industry solutions](https://www.systenics.com/solutions/), [platform products](https://www.systenics.com/products/), and [custom development services](https://www.systenics.com/auctionworx/development-and-customization/) tailored to your goals.
[Book a quick consultation](https://outlook.office.com/bookwithme/user/231015685f21467da5ef6e3eb8b50240@systenics.com/meetingtype/hbYq2z1Hj0C2e7DuwBqdnw2?anonymous&ep=mcard).
---
## Page: Build vs Buy: Custom Software vs SaaS for SMBs
URL: https://www.systenics.com/blogs/build-vs-buy-custom-software-vs-saas-small-business/
Description: A custom software founder
# Build vs Buy: Custom Software vs SaaS for SMBs
**by:** Saurabh Nandu **in:** [General](https://www.systenics.com/blogs/category/general/) **tags:**[*Custom Software*](https://www.systenics.com/blogs/tag/custom-software/), [*SMB Growth*](https://www.systenics.com/blogs/tag/smb-growth/), [*SaaS*](https://www.systenics.com/blogs/tag/saas/), [*Software Strategy*](https://www.systenics.com/blogs/tag/software-strategy/)
Building custom software makes sense when your operational workflow gives you a true competitive advantage, or when rigid off-the-shelf SaaS tools force you to compromise your core process. On the flip side, buying existing software is the smart choice when you are solving common operational problems that everyone handles the same way. You do not always have to choose all-or-nothing between the two. A practical middle path exists, and exploring that balance is usually where our Squad starts every client discovery conversation.
## Evaluating Your Technology Needs
Whenever someone asks whether they should build custom software, we walk through these core operational questions together. No single answer dictates the outcome, but answering yes to several usually signals that off-the-shelf tools are holding you back.
- How many spreadsheets, manual copy-paste steps, and no-code connectors like Zapier or Make are holding your daily operations together?
- Is your per-seat software bill scaling faster than your revenue because vendor subscription tiers penalize business growth?
- Do you have total control and full ownership of your customer and operational data, or is it trapped inside a proprietary database?
- Does your team regularly run into missing features or API limitations that the vendor has placed in their backlog with no release date in sight?
- Do you face specific industry compliance, data sovereignty, or auditing requirements that commercial cloud subscriptions cannot accommodate?
- Is the workflow you are digitizing the primary reason customers choose you over alternatives in your industry?
## Understanding the True Cost Curve Over Time
Too many software sales pitches rely on inflated ROI charts. Looking at how each model behaves financially over a 3 to 5 year horizon reveals a clearer picture.
Commercial SaaS products are inexpensive to start with and fast to set up. But as your team scales, licensing costs compound. Additional seats, premium feature tiers, and third-party connector fees multiply your monthly software spend. Custom software flips this structure. It involves a higher upfront investment to architect and build, followed by predictable cloud hosting and maintenance costs that stay relatively flat regardless of user count. If your team is growing steadily and you are juggling dozens of overlapping subscriptions, custom ownership often proves more economical over time.
For a deeper framework on calculating total cost of ownership across software lifecycles, review [Gartner's TCO research guide](https://www.gartner.com/en/information-technology/glossary/total-cost-of-ownership-tco).
## The Middle Path: Extend Instead of Reinvent
The decision does not have to be an all-or-nothing choice between total bespoke code and rigid off-the-shelf apps. The most effective approach for many growing businesses is keeping a proven platform at the core and building tailored extensions where they provide tangible competitive advantages.
We see this pattern work exceptionally well with our AuctionWorx clients. Instead of spending hundreds of thousands of dollars rebuilding a complex auction engine from zero, they license a solid, proven platform. Our Squad then builds custom bidding workflows, mobile apps, and enterprise ERP integrations on top of its API. You can read how this architecture functions in our [AuctionWorx technical customization guide](https://www.systenics.com/blogs/auctionworx-customization-guide-bidding-apis-architecture/).
The same philosophy applies across other enterprise systems. If your CRM, inventory management, or accounting software offers rich APIs, building a lightweight custom layer around that core delivers tailored automation without the burden of maintaining foundational infrastructure.
## Signs You Have Outgrown Off-the-Shelf SaaS
- Your team spends more hours managing workarounds and manual syncing than doing productive work.
- Every new employee requires an extensive onboarding checklist solely to navigate software limitations.
- You cannot differentiate your customer experience because your software forces you into identical templates as competitors.
- Critical support tickets regarding feature gaps receive generic responses indicating they are not on the product roadmap.
- You are paying for multiple SaaS tools with overlapping features simply because no single platform supports your complete workflow.
## When We Advise You to Keep Buying
Having developed custom enterprise applications, .NET systems, and Azure cloud solutions since Systenics was founded in 2006, I frequently advise prospective clients against custom builds. Common examples include standard double-entry accounting, team email, and basic CRM systems for small teams. If commercial software already solves 95% of your requirements and the vendor continues to innovate, buying is undeniably the right business decision.
Our goal is helping our clients build sustainable, profitable businesses, not selling development hours for things you can buy off the shelf. If your goals can be met with an existing product, we will tell you directly on our first call.
## How Our Squad Approaches Custom Software Engagements
When a custom solution or platform extension is clearly the right move, we execute through a transparent, disciplined development process. We begin with a collaborative discovery session to analyze your exact workflows and edge cases. From there, we provide a fixed-price proposal before development starts, paired with milestone-based delivery so you test working software at every stage. You retain complete ownership of the source code and infrastructure from day one through mission launch.
If your mission includes upgrading an existing legacy system, take a look at our [ASP.NET to .NET 10 modernization playbook](https://www.systenics.com/blogs/migrating-legacy-aspnet-to-dotnet-10-smb-modernization-playbook/). If you are also deciding on how to structure your development team, read our practical analysis on [offshore vs nearshore vs local software developers](https://www.systenics.com/blogs/offshore-vs-nearshore-vs-local-software-developers-us-small-business/). You can see more examples of what our Squad builds on our [solutions page](https://www.systenics.com/solutions/).
## Frequently Asked Questions
### How do I decide build vs buy software for my small business?
Start with your operational workflow. If the process is standard and every competitor handles it similarly, buying SaaS is almost always the right move. If the process is how you differentiate and win deals, or if you find yourself bending off-the-shelf software with messy spreadsheets and glue scripts, building custom software makes sense.
### Is custom software always more expensive than off-the-shelf SaaS?
Not over the long haul. SaaS software carries monthly per-seat licensing fees that scale up as your headcount grows. Custom software requires an upfront capital investment followed by steady maintenance and hosting. Depending on team size and operational complexity, custom software can easily become more cost-effective over several years.
### When should I build custom software instead of extending a SaaS tool?
Consider custom software when vendor roadmaps ignore your critical feature requests, when your data is locked behind restrictive export limits, or when strict regulatory and compliance requirements outgrow what standard tiers offer.
### What is the middle path between custom software and SaaS?
The middle path involves keeping a reliable commercial platform at the core and building a focused custom extension layer around its APIs. For instance, many AuctionWorx operators maintain the core platform while developing custom bidding engines and ERP integrations on top.
### Should a five-person team ever build custom software?
Rarely for standard operations like accounting, payroll, or basic email. At that stage, buying established SaaS tools with mature roadmaps is much faster and more cost-effective.
If you are tired of wrestling with rigid tools and want an objective perspective on whether to build, buy, or extend, our Squad is ready to help you chart the right course.
[Connect for mission launch **](https://outlook.office.com/bookwithme/user/231015685f21467da5ef6e3eb8b50240@systenics.com/meetingtype/hbYq2z1Hj0C2e7DuwBqdnw2?anonymous&ep=mcard)
## Need help implementing this for your business?
Our team helps plan, build, and scale marketplace and auction workflows. Explore [industry solutions](https://www.systenics.com/solutions/), [platform products](https://www.systenics.com/products/), and [custom development services](https://www.systenics.com/auctionworx/development-and-customization/) tailored to your goals.
[Book a quick consultation](https://outlook.office.com/bookwithme/user/231015685f21467da5ef6e3eb8b50240@systenics.com/meetingtype/hbYq2z1Hj0C2e7DuwBqdnw2?anonymous&ep=mcard).
---
## Page: Bring a Trailer Alternative: Launch Your Own White-Label Auto Auction Marketplace
URL: https://www.systenics.com/blogs/bring-a-trailer-alternative-launch-your-own-white-label-auto-auction-marketplace/
Description: Explore whether listing on third-party car auction marketplaces or owning your own white-label auto auction platform is the smarter long-term strategy. A neutral comparison of marketplace dependency vs. platform ownership with AuctionWorx.
# Bring a Trailer Alternative: Launch Your Own White-Label Auto Auction Marketplace
**by:** Saurabh Nandu **in:** [General](https://www.systenics.com/blogs/category/general/) **tags:**[*AuctionWorx*](https://www.systenics.com/blogs/tag/auctionworx/), [*Automobile Auctions*](https://www.systenics.com/blogs/tag/automobile-auctions/)
The online automobile auction space has exploded over the past decade. Platforms like [Bring a Trailer](https://bringatrailer.com/) (BaT) have played a massive role in that transformation — turning collector car sales into a spectator sport with editorial-style listings, passionate comment threads, and transparent final sale prices. For casual sellers looking to move a single vehicle, these marketplaces are a perfectly viable option.
But here's the question that rarely gets asked: **if you're building an auction *business*** — whether you're a dealer, an auction house, or an entrepreneur entering the auto auction space — is listing on someone else's marketplace really the right long-term play?
In this post, we'll walk through both paths — listing on a third-party marketplace versus launching your own white-label auto auction platform powered by [AuctionWorx Auto Auction Suite](https://www.systenics.com/auctionworx/end-to-end-solution-for-your-used-rare-or-new-automobile-auctions/) — and let you decide which model aligns with your mission.
## The Marketplace Model: What Third-Party Platforms Do Well
Let's give credit where it's due. Third-party auto auction marketplaces like BaT have built impressive ecosystems. They've solved the cold-start problem — amassing hundreds of thousands of registered enthusiasts who actively browse, comment on, and bid on vehicles. For a first-time seller with a single classic car, the built-in audience is the primary value proposition.
These platforms handle the infrastructure, the payment processing, the marketing, and — in BaT's case — an editorial review process that adds credibility to each listing. The seller submits photos and details, the marketplace curates the listing, and buyers show up because they trust the platform's brand.
For individual, infrequent sellers, this works. But as your volume and ambitions grow, this same model introduces a set of strategic trade-offs that are worth examining closely.
## The Hidden Cost: Who Owns Your Customers?
This is the single most important question in the entire marketplace-vs-ownership debate, and it's the one most sellers never ask until it's too late.
When you list a vehicle on a third-party marketplace, **every buyer who bids, every enthusiast who comments, every person who watches your listing — they are the marketplace's customers, not yours.** You don't get their email addresses. You don't see their bidding history across other auctions. You can't send them a notification when your next vehicle goes live. You can't build a CRM, run remarketing campaigns, or develop a relationship that extends beyond a single transaction.
Consider what this means at scale. If you sell 50 vehicles a year on a third-party platform, and each auction attracts 200 unique bidders, that's **10,000 high-intent buyer interactions per year** that belong entirely to someone else's database. Those buyers came for your inventory, but the marketplace captured the relationship. The next time those buyers are ready to bid, they'll browse the marketplace's homepage — not yours.
In any business, your customer list is your most defensible asset. Marketplaces, by design, sit between you and that asset.
## The White-Label Alternative: Building Your Own Platform
The alternative is straightforward: instead of renting space on someone else's marketplace, you **own the entire platform**. Your domain. Your brand. Your mobile app in the App Store. Your buyer database. Your fee structure. Your rules.
This is exactly what the [AuctionWorx Auto Auction Suite](https://www.systenics.com/auctionworx/end-to-end-solution-for-your-used-rare-or-new-automobile-auctions/) enables. It's a fully white-label automobile auction platform that gives you everything a marketplace like BaT offers — VIN decoding, high-resolution photo galleries, community engagement, timed auctions — plus the one thing no marketplace will ever give you: **complete ownership of the business layer**.
You're not a tenant on someone else's platform. You're the platform operator. Every registration, every bid, every dollar in buyer's premium flows through your infrastructure and into your business.
## Side-by-Side: Marketplace vs. Your Own Platform
Here's how the two models compare across the dimensions that matter most for anyone building a sustainable auto auction business:
Dimension Third-Party Marketplace Your Own Platform (AuctionWorx) **Customer Data** The marketplace owns all buyer data, bid history, and contact info ** You own 100% of buyer and seller data — full CRM access **Branding** Their brand, their domain — your vehicles appear under their identity ** Your brand, your domain, your App Store listing **Fee Structure** Marketplace sets buyer's premium + listing fees; you have no control ** You define buyer's premium, seller fees, and commission rates **Listing Control** Editorial team curates and approves listings — they decide what goes live ** You control every listing — approval, presentation, timing **Auction Formats** One format (typically 7-day timed auction) ** Timed, live, proxy bidding, Buy Now, Make Offer — fully configurable **Mobile Presence** No branded mobile app — your inventory lives inside their app ** [Native iOS & Android apps](https://www.systenics.com/auctionworx/mobile-apps/) with YOUR branding and push notifications **Platform Risk** Policy changes, fee hikes, or shutdown could disrupt your business overnight ** You own the platform — zero third-party dependency **Remarketing** No access to buyer behavior for retargeting or outbid notifications ** Full remarketing: outbid alerts, watchlist nudges, email campaigns **Geography** Typically limited to the marketplace's focus region ** Serve any market — local, national, or international **Auto-Specific Tools** Basic photo uploads and description fields ** [VIN decoding](https://www.systenics.com/auctionworx/end-to-end-solution-for-your-used-rare-or-new-automobile-auctions/), damage annotation, condition reports, [AI description generation](https://www.systenics.com/auctionworx/ai-enhanced-listings-description-generation/)
## Deep Dive: Why Data Ownership Changes Everything
Let's spend a moment on the data ownership row, because it's the single factor that determines whether you're building a business or simply feeding someone else's.
### Remarketing to Past Bidders
When you own your platform, every bidder who participates in an auction — even if they don't win — becomes a lead in your database. You know what they bid on, how high they went, and when they dropped off. The next time a similar vehicle hits your platform, you can send a targeted notification: *"A 1972 Datsun 240Z just listed — similar to the one you bid on last month."*
On a third-party marketplace, that bidder is gone. They'll see your next listing only if the marketplace's algorithm decides to surface it. You have no direct channel back to them.
### Building Buyer Loyalty
Repeat buyers are the lifeblood of any auction business. When buyers bookmark your platform, download your [branded mobile app](https://www.systenics.com/auctionworx/mobile-apps/), and enable push notifications for new listings, they're forming a habit around *your* brand — not a marketplace's. Over time, this creates a self-reinforcing cycle: more returning buyers means more competitive bidding, which means higher hammer prices, which attracts more quality consignments.
On a marketplace, buyer loyalty accrues to the marketplace itself. A buyer who loves bidding on your cars will return to BaT's homepage, not yours — and they'll bid on other dealers' cars too.
### Analyzing Bidding Patterns
With your own platform, you get full analytics: which vehicle categories generate the most bids, what time of day auctions close at the highest prices, which geographic regions produce the most active bidders. This data lets you optimize your consignment strategy, schedule auction endings for peak engagement, and target your marketing spend with precision.
On a marketplace, you get a final sale price and a congratulations email.
### Creating a Defensible Business Moat
A proprietary buyer database is an asset that appreciates over time. It's also an asset that's nearly impossible for a competitor to replicate. When you've built a registered base of 5,000, 10,000, or 50,000 auto enthusiasts who actively engage with your platform, that's a moat. It's a competitive advantage that survives market fluctuations, algorithm changes, and competitor moves.
If your entire business runs on a third-party marketplace, your moat is... the quality of your photos. The moment a marketplace changes its fee structure, modifies its curation criteria, or prioritizes a competitor's inventory over yours, you're exposed — with zero customer relationships to fall back on.
## What You Get with AuctionWorx Auto Auction Suite
The [Auto Auction Suite](https://www.systenics.com/auctionworx/end-to-end-solution-for-your-used-rare-or-new-automobile-auctions/) is purpose-built for automobile auctioneers who want marketplace-grade functionality under their own roof. Here's a snapshot of what's included:
- **VIN Decoding:** Automatically populate year, make, model, trim, engine, and 100+ spec fields from a single VIN entry.
- **Damage Annotation:** Interactive vehicle diagrams that let sellers mark and annotate body damage, paint issues, or mechanical concerns — giving buyers transparency that builds trust.
- **AI-Powered Descriptions:** [Generate professional listing descriptions](https://www.systenics.com/auctionworx/ai-enhanced-listings-description-generation/) from structured vehicle data in seconds, maintaining consistent quality across your catalogue.
- **Community Engagement:** Built-in [comment threads and activity feeds](https://www.systenics.com/auctionworx/community-activity-feed/) that mirror the social, discussion-driven experience buyers love on platforms like BaT.
- **Live & Timed Auctions:** Run traditional [simulcast live auctions](https://www.systenics.com/auctionworx/live-auctions/) or modern timed online auctions — or both — from a single platform.
- **Branded Mobile Apps:** [Native iOS and Android apps](https://www.systenics.com/auctionworx/mobile-apps/) published under your brand, with push notifications for outbids, ending-soon alerts, and new listings.
- **Flexible Fee Engine:** Configure buyer's premiums, seller commissions, listing fees, and payment processing exactly the way your business model requires.
- **Full Admin Control:** Approve listings, manage users, moderate comments, export data, configure auction rules — every aspect of the platform is yours to manage.
[Explore the Full Auto Auction Suite **](https://www.systenics.com/auctionworx/end-to-end-solution-for-your-used-rare-or-new-automobile-auctions/)
## Who Should Consider Owning Their Platform?
Not everyone needs their own auto auction platform. If you sell one classic car every few years, a marketplace is the path of least resistance. But the white-label model is the strategically superior choice for:
- **Established Dealers & Auction Houses:** You already have inventory, consignment relationships, and industry reputation. What you need is a technology platform that captures buyer data and grows your digital presence under *your* brand.
- **Niche Collectors & Specialists:** Whether you focus on Japanese imports, pre-war classics, American muscle, or exotic supercars, a dedicated platform positions you as the authority in your niche — something a general marketplace can never replicate.
- **Regional Auction Companies:** If you serve a specific geographic market, your own platform lets you dominate local search results, build a community of regional buyers, and operate without competing against nationwide inventory for attention.
- **Entrepreneurs Entering the Space:** If you see the opportunity in the growing online auto auction market and want to build a scalable business, starting with your own platform from day one ensures every dollar you invest in marketing builds *your* asset, not a marketplace's.
## The Bottom Line
Bring a Trailer and similar third-party marketplaces have done something remarkable: they've proven that collectors and enthusiasts will eagerly participate in online auto auctions. They've validated the market. The question is whether you want to participate in *their* market — or build your own.
For casual, infrequent sellers, marketplaces are a great option. The built-in audience, the curated experience, and the simplicity of the process make them an attractive choice for a single transaction.
But for anyone with ambitions beyond a single sale — for dealers looking to go digital, for auction houses expanding online, for entrepreneurs building the next great auto auction brand — **owning the platform is the strategically defensible path**. You own the data. You own the brand. You own the customer relationships. And every auction you run compounds the value of the business you're building.
Our Superhero Squad has spent over a decade building and deploying auto auction platforms for businesses across the globe. We've seen firsthand how platform ownership transforms auction operations from transactional to scalable — and we're ready to help you launch yours.
## Ready to Own Your Auto Auction Platform?
Let our Squad help you launch your next mission. Whether you're migrating from a third-party marketplace or starting fresh, we'll tailor the [Auto Auction Suite](https://www.systenics.com/auctionworx/end-to-end-solution-for-your-used-rare-or-new-automobile-auctions/) to fit your exact business model, branding, and operational needs.
[Connect for Mission Launch **](https://outlook.office.com/bookwithme/user/231015685f21467da5ef6e3eb8b50240@systenics.com/meetingtype/hbYq2z1Hj0C2e7DuwBqdnw2?anonymous&ep=mcard)
## Related pages on Systenics
- [AuctionWorx platform overview](https://www.systenics.com/auctionworx/)
- [AI-powered listing description generation](https://www.systenics.com/auctionworx/ai-enhanced-listings-description-generation/)
- [Industry solutions](https://www.systenics.com/solutions/)
## Need help implementing this for your business?
Our team helps plan, build, and scale marketplace and auction workflows. Explore [industry solutions](https://www.systenics.com/solutions/), [platform products](https://www.systenics.com/products/), and [custom development services](https://www.systenics.com/auctionworx/development-and-customization/) tailored to your goals.
[Book a quick consultation](https://outlook.office.com/bookwithme/user/231015685f21467da5ef6e3eb8b50240@systenics.com/meetingtype/hbYq2z1Hj0C2e7DuwBqdnw2?anonymous&ep=mcard).
---
## Page: Benefits of Hosting AuctionWorx Platform on Microsoft Azure Cloud
URL: https://www.systenics.com/blogs/benefits-of-hosting-auctionworx-platform-on-microsoft-azure-cloud/
Description: The decision to host an application is a critical one, impacting performance, scalability, security, and cost. AuctionWorx, a robust platform for auction management, can significantly benefit from the cloud-native capabilities offered by Microsoft Azure. This blog delves into the compelling reasons why hosting AuctionWorx on Azure is a strategic advantage.
# Benefits of Hosting AuctionWorx Platform on Microsoft Azure Cloud
**by:** Saurabh Nandu **in:** [General](https://www.systenics.com/blogs/category/general/) **tags:**[*AuctionWorx*](https://www.systenics.com/blogs/tag/auctionworx/), [*Azure*](https://www.systenics.com/blogs/tag/azure/)
### Introduction
The decision to host an application is a critical one, impacting performance, scalability, security, and cost. AuctionWorx, a robust platform for auction management, can significantly benefit from the cloud-native capabilities offered by Microsoft Azure. Hosting AuctionWorx on shared hosting platform is common, until your audience grows and you need to explore better hosting and scalablity options.
This blog delves into the compelling reasons why hosting AuctionWorx on Azure is a strategic advantage and how our[AuctionWorx platform team](https://www.systenics.com/auctionworx/) can help you host your AuctionWorx on Azure.
### Understanding AuctionWorx and Azure
Before diving into the benefits, let's briefly understand the two key players:
#### AuctionWorx Platform
AuctionWorx is a comprehensive platform designed to streamline auction processes. It offers features like item listing, bidding management, payment processing, and real-time reporting. To function optimally, it requires a robust and scalable infrastructure.
#### Microsoft Azure Cloud
Microsoft Azure is a cloud computing platform offering a vast array of services, including compute, storage, networking, databases, and analytics. Its hybrid and multi-cloud capabilities, coupled with robust security features, make it an ideal choice for hosting applications like AuctionWorx.
One key reason Azure is chosen vs. Amazon AWS is that Azure offers the best platform for hosting ASP.NET based applications. There are cost and management time saving hosting your AuctionWorx platform on Azure vs. AWS.
### Key Benefits of Hosting AuctionWorx on Azure
#### 1. Scalability and Flexibility
- **Dynamic Resource Allocation:** Azure's ability to automatically scale resources based on demand is crucial for auction platforms. During peak bidding periods, Azure can effortlessly provision additional compute and storage resources, ensuring optimal performance and preventing system overload.
- **Geographical Distribution:** Azure's global data centers allow you to deploy AuctionWorx closer to your target audience, reducing latency and improving user experience.
- **Files Scalability:** As the number of auctions listings grows, the number of image files generated and managed grows along with it. Azure file storage provides a seamless solution to scale file storage seamlessly at a cost effective rate.
#### 2. Enhanced Performance
- **High-Performance Computing:** As the number of active users bidding on your site grows we need to scale the CPU Compute proportionately to ensure flawless auctions. Real-time bidding of auctions is CPU demanding and Azure have various high-performance compute options to ensure scalability.
- **Low Latency:** Azure's global network infrastructure and content delivery network (CDN) minimize latency, providing a seamless user experience for bidders and auctioneers.
#### 3. Robust Security
- **Comprehensive Threat Protection:** Azure incorporates advanced security measures like threat intelligence, intrusion detection, and data encryption to safeguard your auction data and protect against cyberattacks.
- **Compliance Adherence:** Azure helps you meet industry-specific compliance standards (e.g., GDPR, PCI DSS) with built-in features and certifications, ensuring data privacy and security.
#### 4. Cost-Efficiency
- **Pay-as-you-go Model:** Azure's flexible pricing model allows you to optimize costs by paying only for the resources you consume. This is particularly advantageous during off-peak auction periods.
- **Reserve Pricing:** Azure provides discounted pricing for compute resources reserved for a longer period of time. It's a good opportunity for customers to take advantage of lower pricing and get better resources.
#### 5. Disaster Recovery and Business Continuity
- **Data Backup and Recovery:** Azure offers robust data backup and recovery options, protecting your auction data from accidental deletion or disasters.
- **Geo-Redundancy:** By replicating data across multiple Azure regions, you can ensure business continuity in case of regional outages or disasters.
### Conclusion
Hosting AuctionWorx on Microsoft Azure offers a multitude of benefits, including scalability, performance, security, cost-efficiency, and disaster recovery. By leveraging Azure's comprehensive suite of services, AuctionWorx platforms can achieve optimal performance, enhance user experience, and drive business growth.
### Summary: Let Systenics Help You Migrate to Azure
At Systenics, we specialize in migrating applications to Azure and optimizing their performance. We are Microsoft Gold Partners for Azure Cloud as well as RainWorx Preminium Partners. Our experts have in-depth knowledge of AuctionWorx and Azure, enabling us to seamlessly transition your platform to the cloud. We offer comprehensive migration services, including:
If you also need platform changes during migration, our[AuctionWorx development and customization services](https://www.systenics.com/auctionworx/development-and-customization/) help teams combine hosting improvements with feature delivery, integrations, and operational upgrades.
- Assessment of your current AuctionWorx environment
- Development of a tailored migration plan
- Migration execution and data transfer
- Performance optimization and testing
- Ongoing support and maintenance
[Contact us](https://outlook.office.com/bookwithme/user/231015685f21467da5ef6e3eb8b50240@systenics.com/meetingtype/hbYq2z1Hj0C2e7DuwBqdnw2?anonymous&ep=mcard) today to discuss your AuctionWorx migration needs and experience the benefits of hosting on Azure.
## Related pages on Systenics
- [AuctionWorx platform overview](https://www.systenics.com/auctionworx/)
## Need help implementing this for your business?
Our team helps plan, build, and scale marketplace and auction workflows. Explore [industry solutions](https://www.systenics.com/solutions/), [platform products](https://www.systenics.com/products/), and [custom development services](https://www.systenics.com/auctionworx/development-and-customization/) tailored to your goals.
[Book a quick consultation](https://outlook.office.com/bookwithme/user/231015685f21467da5ef6e3eb8b50240@systenics.com/meetingtype/hbYq2z1Hj0C2e7DuwBqdnw2?anonymous&ep=mcard).
---
## Page: AuctionWorx vs the Alternatives: Choosing Your Auction Platform
URL: https://www.systenics.com/blogs/auctionworx-vs-alternatives-choosing-your-auction-platform/
Description: An honest comparison of AuctionWorx against SaaS auction tools, PHP scripts and no-code marketplace builders, from a team that
# AuctionWorx vs the Alternatives: Choosing Your Auction Platform
**by:** Saurabh Nandu **in:** [General](https://www.systenics.com/blogs/category/general/) **tags:**[*AuctionWorx*](https://www.systenics.com/blogs/tag/auctionworx/)
If you're planning an online auction business, the platform decision is the one you'll live with longest. We've spent 15+ years building on RainWorx's [AuctionWorx](https://www.systenics.com/auctionworx/) as a Premium Partner, so yes, we have a favorite. But we've also watched clients arrive from every alternative on this list, and the honest answer is that the right platform depends on what you're building. Here's the comparison we walk every new client through.
## The five ways to build an auction site
- **Self-hosted commercial platforms (AuctionWorx):** You buy a license once, host it yourself (or in Azure), and own the whole stack: your domain, your data, your fees, your buyer relationships. AuctionWorx is built on Microsoft .NET, which means a mature, enterprise-grade codebase that a professional developer can extend almost without limits.
- **SaaS auction tools (e.g. BiddingOwl, BetterWorld):** Fast to launch and great for one-off charity events. Many are free or cheap because they monetize through your donors or take a percentage. The trade-off: your auction lives on their platform, with their branding rules, their fee changes, and no meaningful customization.
- **Self-hosted PHP scripts (e.g. PHP Pro Bid):** Lower upfront cost and full self-hosting, but you inherit the maintenance burden of the codebase, and finding experienced developers for a niche PHP script is harder than it looks.
- **No-code marketplace builders (e.g. Sharetribe):** Excellent for validating an idea in a weekend. But auction mechanics (proxy bidding, soft-close anti-sniping, reserve logic, buyer's premiums) are exactly the features no-code builders handle worst. Most auction businesses that start here rebuild within two years.
- **Fully custom builds:** Total freedom, maximum cost. Sensible when your auction model is genuinely novel; expensive insurance when AuctionWorx plus targeted customization would get you there for a fraction of the price.
## Side-by-side
Dimension AuctionWorx SaaS Tools PHP Scripts No-Code Builders Fully Custom **Upfront cost** One-time license + hosting Low / free Low Subscription High **Ongoing fees** Hosting only % or fees Hosting Monthly + transaction Hosting **Ownership & data** You own everything Platform owns relationship You own it Partial Total **Auction-specific features** Deep auction feature set Event-focused Moderate Weak for auctions Whatever you pay for **Customizability** Highly customizable (.NET) Minimal Moderate but aging Limited Unlimited **Time to launch** Weeks Days Weeks Days Months **Developer availability** RainWorx partners like us N/A Scarce N/A Any stack you choose
## Where AuctionWorx wins outright
- Recurring commercial auctions (weekly estate sales, dealer car auctions, liquidation lots) where fees and buyer data compound in your favor.
- Anyone who's outgrown a marketplace and wants buyers forming habits around their brand, not eBay's.
- Operators who want auction mechanics that just work: proxy bidding, staggered soft closes, buyer's premiums, invoicing.
## Where it isn't the answer
A single annual charity gala doesn't need a platform license: use a SaaS event tool and keep your weekend. And if you're still validating whether anyone wants your auction concept at all, a no-code experiment is cheaper tuition.
## Extending AuctionWorx: where we come in
Out of the box, AuctionWorx covers the auction engine. The gap between "installed" and "thriving marketplace" is where a development partner earns their keep: [mobile apps](https://www.systenics.com/auctionworx/mobile-apps/), [barcode listing creation](https://www.systenics.com/auctionworx/barcode-listing-creation/), [AI descriptions](https://www.systenics.com/auctionworx/ai-enhanced-listings-description-generation/), [Dutch auctions](https://www.systenics.com/auctionworx/dutch-auctions/), [volume buy](https://www.systenics.com/auctionworx/volume-buy/), and [WHMSPro](https://www.systenics.com/auctionworx/warehouse-management/), all with [transparent one-time pricing](https://www.systenics.com/auctionworx/pricing/), plus vertical end-to-end solutions for [automobiles](https://www.systenics.com/auctionworx/end-to-end-solution-for-your-used-rare-or-new-automobile-auctions/), [real estate](https://www.systenics.com/auctionworx/power-your-property-auctions-with-systenics-innovative-end-to-end-solutions/), [livestock](https://www.systenics.com/auctionworx/streamline-livestock-auctions-with-systenics-end-to-end-solutions/), [estate sales](https://www.systenics.com/auctionworx/end-to-end-solution-for-estate-sales-auctions-with-systenics/), [antiques & collectibles](https://www.systenics.com/auctionworx/power-your-antiques-collectibles-auction-marketplace-with-systenics/) and [e-commerce returns](https://www.systenics.com/auctionworx/end-to-end-solution-for-auction-of-ecommerce-overstock-box-damaged-and-returned-items/).
## Ready to Decide?
Still weighing platforms? Book a 30-minute call and we'll tell you honestly whether AuctionWorx fits your model. If it doesn't, we'll tell you that too.
[Book a Call **](https://outlook.office.com/bookwithme/user/231015685f21467da5ef6e3eb8b50240@systenics.com/meetingtype/hbYq2z1Hj0C2e7DuwBqdnw2?anonymous&ep=mcard)
## Related pages on Systenics
- [AuctionWorx platform overview](https://www.systenics.com/auctionworx/)
- [AI-powered listing description generation](https://www.systenics.com/auctionworx/ai-enhanced-listings-description-generation/)
- [Industry solutions](https://www.systenics.com/solutions/)
## Need help implementing this for your business?
Our team helps plan, build, and scale marketplace and auction workflows. Explore [industry solutions](https://www.systenics.com/solutions/), [platform products](https://www.systenics.com/products/), and [custom development services](https://www.systenics.com/auctionworx/development-and-customization/) tailored to your goals.
[Book a quick consultation](https://outlook.office.com/bookwithme/user/231015685f21467da5ef6e3eb8b50240@systenics.com/meetingtype/hbYq2z1Hj0C2e7DuwBqdnw2?anonymous&ep=mcard).
---
## Page: AuctionWorx Upgrade Playbook: Protect Customizations
URL: https://www.systenics.com/blogs/auctionworx-upgrade-playbook-keep-customizations-safe/
Description: A practical playbook for upgrading AuctionWorx without breaking your custom features, integrations, or database changes.
# AuctionWorx Upgrade Playbook: Protect Customizations
**by:** Saurabh Nandu **in:** [Programming](https://www.systenics.com/blogs/category/programming/) **tags:**[*AuctionWorx*](https://www.systenics.com/blogs/tag/auctionworx/), [*Upgrades*](https://www.systenics.com/blogs/tag/upgrades/), [*.NET*](https://www.systenics.com/blogs/tag/net/), [*DevOps*](https://www.systenics.com/blogs/tag/devops/)
An AuctionWorx platform upgrade should bring speed and new capabilities, not panic on auction day. If your site has been running for a while, chances are it is no longer stock out of the box. You might have custom commission tiers, a branded theme, tailored payment gateways, or custom APIs powering a mobile bidding app. When a core upgrade installer runs, it can easily overwrite modified files if they were placed in the wrong directories. Our Squad put together this field-tested playbook so you can upgrade cleanly and protect your hard-earned customizations.
## Step 1: The Pre-Upgrade Customization Audit
Before anyone touches an upgrade package, you need a precise inventory of every custom element across your application. Knowing exactly where your codebase differs from stock AuctionWorx prevents surprise regressions during deployment.
- Inventory all custom controllers, services, and helper classes added outside standard modules.
- Review theme overrides, Razor views, and custom CSS or JavaScript bundles to see which core templates they originated from.
- Document every database schema modification, including custom tables, added columns, custom indexes, or modified stored procedures.
- Map external integrations such as payment processors, SMS or email gateways, shipping APIs, and mobile app feeds.
- Note your current AuctionWorx version, .NET runtime, IIS settings, and server dependencies.
- Verify who maintains the Git repository and ensure all recent production patches are committed to version control.
## Watch Out for Core File Modifications
If your team cannot pull this inventory together quickly, that is usually a sign that previous modifications were made directly inside core files instead of using supported hooks, partial classes, or override folders. When code is edited directly inside vendor files, every subsequent upgrade requires tedious manual file diffing. We dive deeper into this technical debt in our guide on [why the cheapest AuctionWorx developer costs the most](https://www.systenics.com/blogs/why-the-cheapest-auctionworx-developer-costs-the-most/). If that describes your site, completing this audit first is critical.
## Step 2: Mirror and Rehearse on Staging
Never perform an upgrade directly on your production server. A dedicated staging environment lets you test the migration process safely, uncover conflicts early, and rehearse your exact cutover procedure.
- Clone your production database and web files into an isolated staging environment.
- Scrub or anonymize user credentials, bidder records, and payment tokens in the staging database for privacy and compliance.
- Match the production server configuration closely, including IIS pool settings, SSL bindings, and caching rules. For architectural recommendations, check out our guide to [hosting AuctionWorx on Microsoft Azure](https://www.systenics.com/blogs/benefits-of-hosting-auctionworx-platform-on-microsoft-azure-cloud/).
- Apply the AuctionWorx upgrade package to staging and run a Git diff to identify any overwritten or conflicting files.
- Refactor any fragile customizations into supported extension points provided by newer AuctionWorx releases.
## Step 3: Run a Backup and Restore Fire Drill
A backup is only as good as your ability to restore it under pressure. Before touching live production, back up your complete environment and verify that you can restore it from scratch to a working state.
- Create a full SQL database backup and a compressed snapshot of the entire web application directory.
- Perform a test restore on a secondary test server to confirm that the database attaches and the site boots cleanly.
- Clock the exact restore time so your team knows precisely how long a full rollback takes if needed.
- Ensure backups are safely stored in secure off-site or cloud storage away from the production host.
## Step 4: Execute Methodical Regression Testing
Once staging runs the upgraded version and your custom features are merged, work through a comprehensive end-to-end regression checklist. Do not rely on quick spot checks when real bids and payments are at stake.
- Bidding logic: test standard bids, proxy bidding increments, reserve thresholds, and bid history timestamps.
- Invoicing and fees: generate test invoices to verify that buyer premiums, custom fee structures, and sales taxes calculate properly.
- Payment processing: complete full end-to-end checkout transactions through your active payment gateways in sandbox mode.
- Notification delivery: verify automated emails for outbid alerts, invoices, user registration, and custom transactional alerts.
- Listing management: publish listings with custom attributes, file attachments, and media galleries to confirm fields display properly.
- Operational reporting: run financial statements and seller settlements, comparing the output against pre-upgrade baseline reports.
- Mobile app contracts: test mobile endpoints to confirm JSON payloads and authentication tokens match what the mobile app expects.
- Custom extensions: individually validate any custom plugins, background sync jobs, or ERP integrations.
## Step 5: Define Clear Rollback Triggers
Decide on your go and no-go criteria before you begin the maintenance window, not while troubleshooting under midnight deadlines. Clear criteria eliminate guesswork if unexpected issues appear.
- Establish specific benchmarks for core workflows: if checkout or proxy bidding fails during cutover, rollback is mandatory.
- Designate a single technical lead who has the final authority to call a rollback.
- Keep the restore playbook and timings open and accessible to the deployment team.
- Set a hard cutover time limit. If smoke tests are not fully green by the deadline, roll back cleanly and reschedule instead of improvising fixes on a live site.
## Step 6: Live Cutover and User Communication
With staging tests passing and rollback plans verified, deployment day becomes an orderly execution. Clear communication keeps both sellers and bidders informed and confident in your platform.
- Schedule the cutover during historically low-traffic hours, ensuring no active auctions are closing during the maintenance window.
- Notify your community in advance across email and site announcements with clear dates, times, and expected duration.
- Display a clean, branded maintenance landing page while database migrations and file deployments run.
- Execute a rapid post-deploy smoke test covering authentication, item listings, bidding, and payment processing.
- Monitor server health metrics, exception logs, and customer support queues closely throughout the initial live hours.
Systenics has been a trusted RainWorx Premium Partner for over 15 years, maintaining and upgrading heavily customized AuctionWorx environments across dozens of version releases. If you are preparing for a major version jump or need help untangling legacy modifications, our Squad can partner with your team to deliver a smooth, reliable upgrade. Explore our [AuctionWorx customization services](https://www.systenics.com/auctionworx/development-and-customization/) or check out our architectural overview in the [AuctionWorx technical customization guide](https://www.systenics.com/blogs/auctionworx-customization-guide-bidding-apis-architecture/).
## Frequently Asked Questions
### How do I upgrade AuctionWorx to a new version without losing customizations?
Start by cataloging every modified file, view override, and database change before running any installer. Test the upgrade in an isolated staging clone first, diff your custom code against updated core files, and re-apply changes through standard extension points before deploying to production with a rehearsed rollback plan.
### What breaks most often during an AuctionWorx version upgrade?
Custom views and Razor templates copied directly from earlier core versions tend to break first because new releases update core markup and models. Undocumented database schema changes, custom payment gateway hooks, and mobile app API endpoints are also frequent points of failure.
### Should I test an AuctionWorx migration on a staging site first?
Yes, always. A staging environment mirrored from production allows your team to test the upgrade, identify code conflicts, and practice rollback procedures without risking live auctions or bidder trust.
### How long should I freeze bidding during an AuctionWorx upgrade?
Base your maintenance window on how long your staging rehearsals take instead of guessing. Time the database migration, deployment, and smoke testing in staging, then schedule the live cutover during your lowest-traffic window with advance notice to users.
### What should be in an AuctionWorx regression checklist after an upgrade?
Verify user login, real-time and proxy bidding, invoice generation, buyer premium calculations, payment gateway transactions, email dispatch, admin reports, and mobile API endpoints.
You do not have to gamble on auction day. Partner with our Squad to audit your codebase, upgrade your infrastructure, and bring your AuctionWorx site forward with complete peace of mind.
[Connect for mission launch **](https://outlook.office.com/bookwithme/user/231015685f21467da5ef6e3eb8b50240@systenics.com/meetingtype/hbYq2z1Hj0C2e7DuwBqdnw2?anonymous&ep=mcard)
## Related pages on Systenics
- [AuctionWorx platform overview](https://www.systenics.com/auctionworx/)
- [AuctionWorx development and customization](https://www.systenics.com/auctionworx/development-and-customization/)
- [AuctionWorx products](https://www.systenics.com/products/)
## Need help implementing this for your business?
Our team helps plan, build, and scale marketplace and auction workflows. Explore [industry solutions](https://www.systenics.com/solutions/), [platform products](https://www.systenics.com/products/), and [custom development services](https://www.systenics.com/auctionworx/development-and-customization/) tailored to your goals.
[Book a quick consultation](https://outlook.office.com/bookwithme/user/231015685f21467da5ef6e3eb8b50240@systenics.com/meetingtype/hbYq2z1Hj0C2e7DuwBqdnw2?anonymous&ep=mcard).
---
## Page: AuctionWorx Enterprise vs Events Edition
URL: https://www.systenics.com/blogs/auctionworx-enterprise-vs-events-edition-comparison/
Description: AuctionWorx Enterprise runs marketplace listings with independent closing times, while Events Edition runs scheduled, cataloged auction sales. Here is how to pick.
# AuctionWorx Enterprise vs Events Edition
**by:** Saurabh Nandu **in:** [General](https://www.systenics.com/blogs/category/general/) **tags:**[*AuctionWorx*](https://www.systenics.com/blogs/tag/auctionworx/), [*Auction Platform*](https://www.systenics.com/blogs/tag/auction-platform/), [*Comparison*](https://www.systenics.com/blogs/tag/comparison/)
AuctionWorx Enterprise is built for businesses that list inventory continuously and let each item close on its own timeline, whether you are running a single-seller storefront or an approved multi-seller marketplace. AuctionWorx Events Edition is designed for scheduled auction sales: a catalog of lots tied to a specific event date, ending with staggered, calculated closing times. Both run on RainWorx's proven [AuctionWorx](https://www.systenics.com/auctionworx/) platform, but choosing the wrong edition early leads to painful rework down the road.
## What AuctionWorx Enterprise Is Built For
Enterprise is the foundational edition of AuctionWorx. RainWorx structures it around individual listings instead of scheduled events. Items go live and close on their own schedules without needing to be packaged into a collective sale. That makes Enterprise ideal for an always-on marketplace where fresh inventory arrives daily and buyers browse continuously.
You can operate it as a single seller selling direct inventory, or open it up as a multi-seller exchange where vetted vendors list goods while the platform automatically tracks seller fees and settlement. RainWorx's [documented feature set](https://www.rainworx.com/AuctionWorx/Features) includes proxy bidding, reserve pricing, buy-now purchases, auto-extend sniper protection, fixed-price listings, integrated invoicing with checkout, and deep consignment management (such as custom consignor tiers, settlement statements, and payout reports). Our Squad routinely deploys Enterprise when clients want a branded, 24/7 marketplace operating on their own domain.
## What AuctionWorx Events Edition Is Built For
Events Edition organizes inventory into structured catalogs linked to scheduled auction dates. RainWorx's [Events Edition overview](https://www.rainworx.com/EventsEdition) outlines a workflow centered on drafting lots, setting closing order, and auto-calculating staggered closing intervals so a sale concludes in an orderly, exciting sequence.
You get tools like CSV batch importing for rapid cataloging, one-click copying of unsold lots into upcoming sales, and pre-publish validation checks. You can group lots to close in tandem or let them end individually, with active bidding triggering auto-extensions so buyers cannot snipe lots at the final second. If your auction calendar revolves around scheduled weekly, monthly, or seasonal events, this workflow fits that operational rhythm out of the box. You can explore how this functions on [our live auctions page](https://www.systenics.com/auctionworx/live-auctions/) or watch our [AuctionWorx demo walkthroughs](https://www.systenics.com/auctionworx/videos/).
## Enterprise vs Events Edition, Side by Side
Dimension AuctionWorx Enterprise AuctionWorx Events Edition Sale format Individual listings with independent closing dates Scheduled auction events, cataloged lots, and staggered closing sequences Seller model Single seller or multi-vendor marketplace Single auction house managing scheduled sales Bidding mechanics Proxy bidding, reserves, buy-now, auto-extend, and quick bid Proxy bidding within timed events, closing groups, and auto-extend sniper protection Invoicing Standard sales invoicing, buyer checkout, batch invoice printing, and bulk generation Consolidated event invoicing tied directly to completed auction sales Typical use cases Always-on marketplaces, classifieds, and ongoing consignment inventory Estate liquidations, art sales, charity galas, and scheduled commercial auctions Running both together Some operators run a hybrid model: an always-open consignment marketplace paired with quarterly marquee auction events. Licensing both or bridging them into a unified experience is an architecture discussion our Squad helps clients navigate during initial planning.
## Which Industry Verticals Lean Which Way
The right choice comes down to how your buyers and sellers actually transact, not just the physical goods you sell. Here is what our Squad sees across client projects:
- **Auto dealers and wholesale lanes** with rolling arrivals and independent lot closings generally thrive on Enterprise's marketplace setup.
- **Estate liquidators and benefit fundraisers** building a focused catalog for a single night or weekend gravitate toward Events Edition.
- **Livestock operations** following a strict sale day calendar with ordered rings and lots fit neatly into Events Edition.
- **Real estate auctions** marketing a curated portfolio that closes sequentially on auction day align well with Events Edition.
- **Overstock, return, and surplus liquidators** moving large volumes of diverse merchandise continuously lean toward Enterprise.
- **Antiques and collectibles dealers** split based on model: stores with steady, rolling arrivals pick Enterprise, while houses hosting curated monthly auctions pick Events Edition.
Wondering how the platform compares to other tech stacks? Our [AuctionWorx alternatives guide](https://www.systenics.com/blogs/auctionworx-vs-alternatives-choosing-your-auction-platform/) breaks down licensing, customization, and long-term costs across the industry.
## What Our Squad Asks on a Discovery Call
Before recommending an edition or writing a proposal, we walk through these practical questions:
- Do your listings close independently, or does an entire catalog close together during a scheduled event?
- Are you the sole seller, or do you need approved third parties listing inventory on your site?
- Do you run on a recurring calendar of events, or is inventory added and purchased continuously?
- Do you need consignor settlement sheets, tiered commissions, and automated vendor reporting?
- Will buyers browse an open storefront daily, or register ahead of scheduled sale days?
- Do you anticipate combining a continuous marketplace with periodic cataloged sales down the line?
- What external systems (such as custom ERPs, payment gateways, tax calculation, or shipping carriers) must integrate with the site?
Your answers clarify whether Enterprise, Events Edition, or a blended setup fits best, allowing us to scope your custom [AuctionWorx build](https://www.systenics.com/auctionworx/) accurately from day one.
## Frequently Asked Questions
### What is the difference between AuctionWorx Enterprise and AuctionWorx Events Edition?
AuctionWorx Enterprise is built for individual listings with independent closing times, giving you an ongoing marketplace model that supports one seller or many. AuctionWorx Events Edition is built for scheduled auction events: lots are grouped into a cataloged sale with staggered, calculated closing times.
### Which AuctionWorx edition is right for a single-seller auction business?
Either edition can run a single-seller business. Choose Enterprise if your listings close independently on a rolling basis throughout the week. Choose Events Edition if you group inventory into scheduled sales with a catalog of lots closing in sequence.
### Does AuctionWorx Events Edition support consignment sales?
AuctionWorx Enterprise documents full consignment tools, including consignor statements, per-consignor fee tiers, and commission reporting. Confirm the current consignment feature set for Events Edition against RainWorx published feature pages before picking your edition.
### Can I run both AuctionWorx Enterprise and Events Edition?
Yes. Operators who run an ongoing marketplace alongside periodic cataloged sales sometimes license both editions. They route inventory to whichever workflow fits the event. We can help you evaluate licensing and hosting architecture during discovery before you commit budget.
### Are AuctionWorx Enterprise reviews trustworthy for choosing an edition?
Third-party reviews confirm that the platform is actively supported, but they rarely get into edition-level workflow differences. We recommend checking RainWorx official documentation or speaking with an experienced integration partner before deciding.
Systenics is an authorized RainWorx Premium Partner with over 15 years of experience extending the AuctionWorx platform. Our Squad has architected, customized, and launched both Enterprise and Events Edition builds for auction businesses worldwide. Share your operational workflow with us, and we will help you map out the ideal platform configuration for a smooth, high-impact mission launch.
[Connect for mission launch **](https://outlook.office.com/bookwithme/user/231015685f21467da5ef6e3eb8b50240@systenics.com/meetingtype/hbYq2z1Hj0C2e7DuwBqdnw2?anonymous&ep=mcard)
## Related pages on Systenics
- [AuctionWorx platform overview](https://www.systenics.com/auctionworx/)
- [Barcode-based listing creation](https://www.systenics.com/auctionworx/barcode-listing-creation/)
- [Industry solutions](https://www.systenics.com/solutions/)
## Need help implementing this for your business?
Our team helps plan, build, and scale marketplace and auction workflows. Explore [industry solutions](https://www.systenics.com/solutions/), [platform products](https://www.systenics.com/products/), and [custom development services](https://www.systenics.com/auctionworx/development-and-customization/) tailored to your goals.
[Book a quick consultation](https://outlook.office.com/bookwithme/user/231015685f21467da5ef6e3eb8b50240@systenics.com/meetingtype/hbYq2z1Hj0C2e7DuwBqdnw2?anonymous&ep=mcard).
---
## Page: The Complete Guide to AuctionWorx Customization: From Custom Bidding Engines to API Integrations
URL: https://www.systenics.com/blogs/auctionworx-customization-guide-bidding-apis-architecture/
Description: A practical engineering blueprint for customizing AuctionWorx without breaking core upgradeability. Learn how our Squad builds custom bidding models, native mobile apps, and enterprise ERP integrations.
# The Complete Guide to AuctionWorx Customization: From Custom Bidding Engines to API Integrations
**by:** Saurabh Nandu **in:** [General](https://www.systenics.com/blogs/category/general/) **tags:**[*AuctionWorx*](https://www.systenics.com/blogs/tag/auctionworx/), [*Customization*](https://www.systenics.com/blogs/tag/customization/), [*.NET*](https://www.systenics.com/blogs/tag/net/), [*Web Development*](https://www.systenics.com/blogs/tag/web-development/)
Over the past 15+ years as a [RainWorx Premium Partner](https://www.systenics.com/auctionworx/), our Superhero Squad has worked inside virtually every corner of the AuctionWorx codebase. We have launched platforms on both Enterprise and Events editions, built specialized bidding workflows, and engineered deep enterprise integrations for auction businesses worldwide.
If there is one universal truth we have learned across dozens of client missions (and plenty of rescue missions where corners were cut by inexperienced contractors), it is this: **AuctionWorx is an extraordinarily capable .NET auction foundation, but how you customize it dictates whether your marketplace thrives or stalls.**
Whether you are planning to introduce proprietary bidding rules, connect enterprise inventory pipelines, or launch native mobile apps for iOS and Android, this guide outlines the architectural blueprint we use to build high-scale, upgrade-safe customizations.
## 1. The Foundation: Why Architectural Isolation is Non-Negotiable
The single most expensive mistake an auction company can make is welding custom business logic directly into core platform files. When RainWorx releases security updates, performance improvements, or major feature versions, a platform with hardcoded core edits cannot be upgraded without days or weeks of manual, bug-prone file diffing.
To ensure **100% Mission Success** and protect your long-term investment, every customization must follow a clean, modular extension model:
- **Separate Assembly Architecture:** Maintain custom business logic, domain models, and external API clients in isolated class library assemblies without modifying the main web project directly.
- **Event Handlers and Webhooks:** Tap into AuctionWorx lifecycle events (such as listing creation, invoice generation, or bid placement) using clean service hooks.
- **Theming Discipline:** Customize UI and styling strictly through override views, partials, and dedicated CSS bundles without editing base system templates.
Following this discipline ensures that when your core platform upgrades, your business-critical customizations remain intact, fully testable, and stable.
## 2. Engineering Custom Bidding Engines
While standard English forward auctions work well for general consumer listings, high-volume B2B, wholesale, and specialized liquidation marketplaces often require distinct price-discovery mechanics:
### Dutch (Descending Price) Auctions
In wholesale volume sales or perishable goods liquidation, sellers cannot wait days for a timer to wind down. With [Dutch Auctions](https://www.systenics.com/auctionworx/dutch-auctions/), the price begins high and steps down automatically at set intervals until a buyer claims the current price or the reserve floor is reached. Building this requires reliable timer routines and concurrency controls to prevent duplicate purchases when multiple bidders claim an item simultaneously.
### Make-an-Offer and Counter-Offer Workflows
High-ticket assets like commercial vehicles or heavy industrial machinery frequently close through private negotiation instead of open bidding. Enhancing AuctionWorx with a Make-an-Offer workflow allows buyers to submit binding bids with custom validity windows, giving sellers the superpower to accept, decline, or counter in real time.
### Sealed-Bid and Tender Submissions
For government surplus, real estate tenders, or confidential corporate disposals, sealed-bid functionality keeps submissions encrypted in the database until the auction closing time arrives, protecting market integrity and regulatory compliance.
## 3. Native Mobile Apps: Real-Time Bidding in Buyers' Pockets
Mobile browsers are fine for casual browsing, but serious bidders demand instant push notifications. When an outbid notification arrives via standard email, the lot has often already closed before the buyer opens their inbox.
Our white-label [AuctionWorx Mobile Apps for iOS and Android](https://www.systenics.com/auctionworx/mobile-apps/) connect directly to your AuctionWorx backend via REST APIs and SignalR. This gives your bidders:
- **Sub-Second Push Notifications:** Instant alerts for outbid notifications, saved search matches, and ending-soon countdowns.
- **Biometric Authentication:** Fast, frictionless sign-ins via Face ID and Touch ID to keep bidders in the action.
- **Camera-Driven Lotting:** Mobile camera integration that lets consigner teams scan barcodes or snap high-res lot photos on the fly.
## 4. Enterprise Integrations and Inventory Pipelines
An auction marketplace rarely operates in isolation. As lot volumes scale into the thousands, manual data entry quickly turns into an operational bottleneck. Integrating AuctionWorx with external systems streamlines your entire workflow:
- **Automated Ingestion via Barcode Scanning:** Utilizing tools like our [Barcode Listing Creation Add-On](https://www.systenics.com/auctionworx/barcode-listing-creation/), intake teams can scan manufacturer UPC or EAN barcodes or vehicle VINs (using ChromeData integration) to populate specifications, retail values, and item photos in seconds.
- **Bulk Inventory Ingestion:** The [Listings Creation Excel Plugin](https://www.systenics.com/auctionworx/listings-creation-excel-plugin/) lets operators prepare, validate, and publish hundreds of lots directly from spreadsheet workflows into AuctionWorx with one click.
- **Warehouse Management and Logistics:** Connecting your bidding platform to a dedicated inventory system like [WHMSPro](https://www.systenics.com/auctionworx/warehouse-management/) synchronizes lot intake, bin and rack mapping, buyer pickup appointment scheduling, and automated carrier label generation with FedEx, UPS, and DHL.
- **Payment and Identity Gateways:** Integration with Stripe, Authorize.Net, and automated escrow or split-payment services ensures frictionless post-sale settlement.
## 5. Transparent Pricing vs. The Hourly Black Hole
One of the biggest frustrations auction operators express before coming to Systenics is unpredictable billing from agencies that charge open-ended hourly rates on an unfamiliar codebase.
We do things differently. We publish our product and add-on pricing openly on our [AuctionWorx Pricing Page](https://www.systenics.com/auctionworx/pricing/). Every add-on includes complete deployment directly on your installation. When you require bespoke feature development, our Squad works through a structured 4-step process:
- **Discovery and Ballpark:** Reviewing your business requirements and defining functional scope.
- **Detailed Architecture and Mockups:** Mapping user journeys and database schemas so you know the full plan before code is written.
- **Milestone-Based Build:** Iterative development with regular demos and milestone deliverables.
- **Deployment and Ongoing Mission Support:** Full production rollout and long-term upgrade compatibility.
## Launch Your Custom AuctionWorx Mission
Customizing AuctionWorx with the right architectural approach gives you an enterprise-grade auction platform tailored to your exact industry, without the multi-hundred-thousand-dollar risk of building from scratch.
Whether you are modernizing an existing installation, building custom bidding models, or integrating native mobile apps, our Superhero Squad is ready to partner with you from concept to launch.
[Connect for Mission Launch **](https://outlook.office.com/bookwithme/user/231015685f21467da5ef6e3eb8b50240@systenics.com/meetingtype/hbYq2z1Hj0C2e7DuwBqdnw2?anonymous&ep=mcard)
## Related pages on Systenics
- [AuctionWorx platform overview](https://www.systenics.com/auctionworx/)
- [AuctionWorx mobile apps](https://www.systenics.com/auctionworx/mobile-apps/)
- [AuctionWorx development and customization](https://www.systenics.com/auctionworx/development-and-customization/)
## Need help implementing this for your business?
Our team helps plan, build, and scale marketplace and auction workflows. Explore [industry solutions](https://www.systenics.com/solutions/), [platform products](https://www.systenics.com/products/), and [custom development services](https://www.systenics.com/auctionworx/development-and-customization/) tailored to your goals.
[Book a quick consultation](https://outlook.office.com/bookwithme/user/231015685f21467da5ef6e3eb8b50240@systenics.com/meetingtype/hbYq2z1Hj0C2e7DuwBqdnw2?anonymous&ep=mcard).
---
## Page: Auction Warehouse Operations: How to Automate Lot Intake, Bin Tracking, and Buyer Pickup Scheduling
URL: https://www.systenics.com/blogs/auction-warehouse-management-lot-intake-pickup-scheduling/
Description: Discover how auction houses and liquidators eliminate post-sale fulfillment bottlenecks with mobile lotting, QR bin mapping, and self-service buyer pickup scheduling using WHMSPro.
# Auction Warehouse Operations: How to Automate Lot Intake, Bin Tracking, and Buyer Pickup Scheduling
**by:** Saurabh Nandu **in:** [General](https://www.systenics.com/blogs/category/general/) **tags:**[*AuctionWorx*](https://www.systenics.com/blogs/tag/auctionworx/), [*Warehouse Management*](https://www.systenics.com/blogs/tag/warehouse-management/), [*Logistics*](https://www.systenics.com/blogs/tag/logistics/), [*Operations*](https://www.systenics.com/blogs/tag/operations/)
In the online auction and liquidation business, most operators focus 90% of their energy on attracting bidders and driving up hammer prices. But ask any warehouse manager or auctioneer who runs weekly events where the true headaches live, and they will tell you the same thing:
**The real battle starts the moment the auction ends.**
Five hundred winning bidders suddenly show up at your loading dock on a Saturday morning expecting immediate pickup. Consignors drop off hundreds of un-manifested items on mixed pallets that need to be photographed, cataloged, and staged in 48 hours. Staff members wander through rows of shelving searching for Lot #412 while frustrated customers wait in lines that stretch out the door.
This operational friction is not just stressful; it directly erodes your profit margins. Here is how high-volume auction houses and liquidators transform post-sale chaos into a streamlined, high-throughput fulfillment workflow.
## Why Generic ERPs and Standard WMS Systems Fail at Auctions
Many auction companies attempt to solve operational bottlenecks by deploying standard warehouse management software (WMS) built for traditional retail e-commerce. They quickly discover that standard warehouse software fundamentally misunderstands how auctions operate:
- **Unique Lot Numbers vs. Standard SKUs:** Traditional e-commerce WMS assumes you hold 5,000 units of a single SKU in a fixed bin location. An auction warehouse holds thousands of unique, one-of-a-kind lots (often box-damaged goods, customer returns, antiques, or surplus items) that exist for only a single auction cycle.
- **The Post-Auction Pickup Surge:** In retail e-commerce, fulfillment is spread evenly throughout the week via parcel carriers. In auctions, 80% of buyers choose local warehouse pickup, creating extreme foot traffic concentrated into tight 48-hour pickup windows.
- **Consignor Intake Volatility:** Estate sales and overstock liquidations arrive without clean UPC barcodes or pre-printed packing slips. Intake teams must inspect, tag, and assign temporary storage in minutes.
## The Blueprint: 4 Pillars of a High-Velocity Auction Warehouse
Over years of building unified auction ecosystems like [WHMSPro](https://www.systenics.com/auctionworx/warehouse-management/) and integrating them directly with [AuctionWorx](https://www.systenics.com/auctionworx/), our Squad has refined the 4 essential workflows every modern auction warehouse needs:
### 1. Mobile Intake: Turn Any Smartphone into a Lotting Terminal
The traditional way of intaking consignments involves clipboards, desktop computers, and manual spreadsheet entry. It is slow, prone to clerical errors, and creates a massive delay between physical lot arrival and online publication.
With mobile-first intake, warehouse personnel walk the floor with a smartphone or tablet:
- Scan an incoming manufacturer barcode or instantly generate a unique Lot QR sticker on a mobile bluetooth label printer.
- Snap item photos directly with the camera, automatically attaching them to the lot record.
- Assign consigner attribution, condition grades, and reserve prices on the spot.
### 2. Dynamic Multi-Level Bin and Rack Mapping
When an item is cataloged, where does it physically go? Stashing items wherever there is empty floor space guarantees missing items on pickup day.
A dedicated auction WMS organizes physical facilities into clear hierarchical locations:
```
Warehouse → Zone (e.g., High-Value / Pallet Racks) → Aisle → Rack → Shelf → Bin
```
When intake staff scans a lot, they scan the shelf QR code to bind the item to that exact location. If an item needs to be moved to a holding area or staging zone before pickup, a quick scan of the lot followed by the new bin instantly updates the system in real time.
### 3. Eliminating Loading Dock Gridlock: Self-Service Buyer Pickup Scheduling
The worst customer experience in the auction industry is having 50 winning bidders arrive simultaneously, overwhelming warehouse staff and blocking parking lots.
The solution is automated, self-service appointment scheduling:
- When an invoice is paid, the winning bidder automatically receives a secure link to schedule their pickup appointment.
- The system caps appointment slots per 15-minute window based on warehouse staff capacity and loading bay availability.
- Warehouse teams receive advance picking lists organized by appointment time, allowing them to pre-pull and stage lots in staging bays *before* the buyer arrives.
- When the buyer pulls up, staff verifies the digital pickup QR code, hands over the pre-staged items, and marks the invoice fulfilled in seconds with zero paper receipts.
### 4. Multi-Carrier Shipping Automation
For non-local winning bidders who require shipping, packing and calculating freight cannot be an afterthought. Integrating direct API carrier connectivity (FedEx, UPS, USPS, DHL, and LTL freight brokers) allows warehouse staff to:
- Weigh and measure packed lots with integrated digital scales.
- Compare real-time negotiated shipping rates across carriers.
- Print shipping labels directly from the order screen and automatically push tracking numbers to the buyer's account and email notifications.
## Real-Time Inventory Synchronization with AuctionWorx
A warehouse management system should never be an isolated silo. By directly linking [WHMSPro](https://www.systenics.com/auctionworx/warehouse-management/) with your [AuctionWorx](https://www.systenics.com/auctionworx/) platform:
- Unsold lots can be immediately rolled over into the next scheduled auction or shifted into fixed-price buy-now inventory without re-cataloging.
- Consignor settlement reports calculate final hammer prices minus commissions and storage handling fees automatically.
- Real-time dashboard analytics give managers complete visibility into inventory aging, storage occupancy rates, and fulfillment velocity.
## Transform Your Auction Fulfillment Operations
Stop letting post-sale fulfillment chaos cap your auction marketplace growth. Whether you run weekly estate sales, commercial vehicle auctions, or liquidation surplus, our Superhero Squad can help you deploy an end-to-end warehouse and logistics workflow that scales with your ambition.
[Connect for Mission Launch **](https://outlook.office.com/bookwithme/user/231015685f21467da5ef6e3eb8b50240@systenics.com/meetingtype/hbYq2z1Hj0C2e7DuwBqdnw2?anonymous&ep=mcard)
## Related pages on Systenics
- [AuctionWorx platform overview](https://www.systenics.com/auctionworx/)
- [Warehouse management capabilities](https://www.systenics.com/auctionworx/warehouse-management/)
## Need help implementing this for your business?
Our team helps plan, build, and scale marketplace and auction workflows. Explore [industry solutions](https://www.systenics.com/solutions/), [platform products](https://www.systenics.com/products/), and [custom development services](https://www.systenics.com/auctionworx/development-and-customization/) tailored to your goals.
[Book a quick consultation](https://outlook.office.com/bookwithme/user/231015685f21467da5ef6e3eb8b50240@systenics.com/meetingtype/hbYq2z1Hj0C2e7DuwBqdnw2?anonymous&ep=mcard).
---
## Page: Adding Bootstrap based Responsive Carousel to Umbraco 7
URL: https://www.systenics.com/blogs/adding-bootstrap-based-responsive-carousel-to-umbraco-7/
Description: Image Sliders and Carousels are very popular elements for building any kind of modern websites. There are several JQuery based scripts available which provide a wide variety of features for building the carousel element. In this blog post I’ll illustrate how easy it is to implement bootstrap based carousel for your website. This blog post with build on my previous blog post Create a Responsive, Fluid HTML5/CSS3 based website on Umbraco 7 using Bootstrap 3.0 Framework where I have integrated bootstrap 3.0.1 with Umbraco 7. This example can be extended to use your own JQuery based slider script.
# Adding Bootstrap based Responsive Carousel to Umbraco 7
**by:** Saurabh Nandu **in:** [Programming](https://www.systenics.com/blogs/category/programming/) **tags:**[*ASP.NET MVC*](https://www.systenics.com/blogs/tag/aspnet-mvc/), [*Umbraco*](https://www.systenics.com/blogs/tag/umbraco/), [*Bootstrap*](https://www.systenics.com/blogs/tag/bootstrap/)
Image Sliders and Carousels are very popular elements for building any kind of modern websites. There are several JQuery based scripts available which provide a wide variety of features for building the carousel element. In this blog post I'll illustrate how easy it is to implement bootstrap based carousel for your website. This blog post will build on my previous blog post [Create a Responsive, Fluid HTML5/CSS3 based website on Umbraco 7 using Bootstrap 3.0 Framework](https://www.systenics.com/blogs/create-a-responsive-fluid-html5css3-based-website-on-umbraco-7-using-bootstrap-30-framework/) where I have integrated bootstrap 3.0.1 with Umbraco 7. This example can be extended to use your own JQuery based slider script.
## Adding Carousel Images Tab to Home document type
There are various ways to implement Carousel support in Umbraco. There are a few predefined packages which are also available which provide easy support for integrating Carousels into your website. The approach that I have taken is the simplest one that I have found from the end users (content editors) perspective, so that its intuitive for the content editors to swap images on their own without understanding Umbraco in detail. Although this means that only basic support for showing images in carousel is supported. If you want the ability for the user to be able to provide captions and text for each image then you would have to take a different approach.
I am assuming you have downloaded the sample from my [previous blog post](https://www.systenics.com/blogs/create-a-responsive-fluid-html5css3-based-website-on-umbraco-7-using-bootstrap-30-framework/) where I have integrated Bootstrap 3.0.1 with Umbraco 7. Load the project in Visual Studio and launch the site in your browser, which would show you the default Jumbotron homepage I built in the last blog post. Navigate to the Umbraco control panel by going to the URL [ [http://localhost:55679/umbraco](http://localhost:55679/umbraco) ] where the port number can change based on your IIS Express setting. Enter the credentials **root** and **@123test** and login to the Umbraco Control Panel.
The first thing that we need to do is edit the Home page document type to add a new Tab with ability to accept images. Click on **Settings** → expand **Document Types** → **[PageBase]** →**Home** to load the **Home** Document Type. Switch to the **Tabs** tab and add a **New Tab** called**Carousel**. Now switch to the **Generic Properties** tab and add a new Property with the following settings given below and save it.
Name: carouselImages
Alias: carouselImages
Type: Multiple Media Picker
Tab: Carousel
## Modify the Home template to include Carousel
Once the new Tab is added to the Document Type we need to update the template of the Home page to include code for the Carousel. Go to Settings → expand Templates → [PageBase] → Home to load the Home template in the Umbraco editor. Replace the template code with code listing 1 shown below. I have improvised the HTML which is provided as a Bootstrap sample and integrated it with Umbraco.
```
@inherits Umbraco.Web.Mvc.UmbracoTemplatePage
@{
Layout = "PageBase.cshtml";
}
@section jumbotron{
}
```
Listing 1: Home template
In the above listing 1 for the **Home** template, I have modified the template from the previous blog to include the code to build the carousel. The HTML for the carousel is directly used from the sample provided on Bootstrap website. Within the **content** section I have added the Razor syntax for showing the carousel if there are images added to the **Home** document. There are two loops provided one to build the navigation icons and another to build the images, pretty standard stuff. Click on the **Save** button to save the template. This completes our effort to add the carousel using bootstrap its pretty simple in Umbraco 7.
## Uploading Carousel Images
To get the carousel in action we need to upload images and publish them. Go to **Content** → **Home** → **Carousel** tab to open properties for the Home page as shown in figure 1 below.
Figure 1: Upload Carousel Images
Click on the + sign as shown in figure 1 above to bring the media slider. In the media slider you can either upload a new image or select from one of the existing images. The circled upload button needs to be clicked to upload new files, they get automatically added to the Umbraco media folder. Once you have uploaded your preferred images, select them and click the **Select** button on the Media picker to add it to our Carousel. In general the images should be 1170x500 in dimensions so that they show with maximum resolution, Bootstrap automatically scales down the image container for responsive viewing. Click **Save and publish** button on the Home page to save the images and publish the carousel. Figure 2 below shows the published carousel page.
Figure 2: Bootstrap based responsive Carousel
In this short blog post you have seen how easy it is to use the new Bootstrap with Umbraco 7 to build a responsive carousel.
## Download
[Click here](https://www.systenics.com/media/CarouselUmbraco7.zip) to download the project for this blog.
## Related pages on Systenics
- [AI-powered listing description generation](https://www.systenics.com/auctionworx/ai-enhanced-listings-description-generation/)
- [AuctionWorx development and customization](https://www.systenics.com/auctionworx/development-and-customization/)
- [AuctionWorx products](https://www.systenics.com/products/)
## Need help implementing this for your business?
Our team helps plan, build, and scale marketplace and auction workflows. Explore [industry solutions](https://www.systenics.com/solutions/), [platform products](https://www.systenics.com/products/), and [custom development services](https://www.systenics.com/auctionworx/development-and-customization/) tailored to your goals.
[Book a quick consultation](https://outlook.office.com/bookwithme/user/231015685f21467da5ef6e3eb8b50240@systenics.com/meetingtype/hbYq2z1Hj0C2e7DuwBqdnw2?anonymous&ep=mcard).
---
## Page: Add Images along with Text using Document Types and Partial View in Umbraco 7
URL: https://www.systenics.com/blogs/add-images-along-with-text-using-document-types-and-partial-view-in-umbraco-7/
Description: While creating an Umbraco site, I came across the need for displaying images along with additional text information which can be setup and managed using Umbraco CMS administration tool. In this blog post, I will explain how to create Document Types and Partial View for a Umbraco 7 website using MVC to display the details.
# Add Images along with Text using Document Types and Partial View in Umbraco 7
**by:** Juilie Bhoir **in:** [Programming](https://www.systenics.com/blogs/category/programming/) **tags:**[*Umbraco*](https://www.systenics.com/blogs/tag/umbraco/)
While creating an Umbraco site, I came across the need for displaying images along with additional text information which can be setup and managed using Umbraco CMS administration tool. In this blog post, I will explain how to create Document Types and Partial View for a Umbraco 7 website using MVC to display the details.
This article assumes that you already have knowledge about [installation of Umbraco 7](https://www.systenics.com/blogs/setting-up-umbraco-7-in-visual-studio-2013-for-mvc-4-development/) and have configured its rendering engine to use ASP.NET MVC for the pages.
## Create Document Type
In Umbraco CMS administration tool, click on **Settings** section and right-click on **Document Types** to create a new document named as **TeamMemberPage**. Let **Master Document Type** be set to **None** and **Create matching template** be checked (refer figure 1).
## Settings > Document Types > TeamMembersPage
Figure 1: Create new Document Type 'TeamMemberPage'
## Structure For TeamMemberPage
Now click on **TeamMemberPage** document type and switch to **Structure** tab and set the checkbox for **Allow at root** option (refer figure 2).
Figure 2: Create root element
## Creating 'MemberListing' Document Type under TeamMembersPage
Next step is to create document type for listing team members which will have the properties such as member photo, member name and member designation.
Right-click on **TeamMembersPage document type** to create a new document named as **MemberListing** (refer figure 3).
Figure 3: Create new Document Type 'MemberListing'
Switch to the Tabs section and add a new tab 'Content' then switch to the Generic properties and click on the **Click here to add a new property** link to add the 3 properties as listed below and **save** them (refer figure 4 – 7).
Figure 4: Create new Tab 'Content'
Name: MemberPhoto
Alias: memberPhoto
Type: Media Picker
Tab: Content
Figure 5: MemberPhoto property
Name: MemberName
Alias: memberName
Type: Textstring
Tab: Content
Figure 6: MemberName property
Name: MemberDesignation
Alias: memberDesignation
Type: Textstring
Tab: Content
Figure 7: MemberDesignation property
## Add another document type 'MemberList'
Next step is to create document type MemberList which will enable to add multiple member details for the page. Right-click on **TeamMembersPage document type** to create a new document named as **MemberList** (refer figure 8).
Figure 8: Create new document type 'MemberList'
## Structure for MemberList
Now click on **MemberList** document type and switch to **Structure** tab and set the checkbox for **Enable List View** option and also select 'MemberListing' document type as Allowed child nodetypes (refer figure 9).
Figure 9: Structure for 'MemberList'
## Make member list as child node for TeamMemberPage
Next step is to add MemberList as child nodetype for TeamMembersPage. For this step, click on Settings > TeamMembersPage
Switch to Structure tab and select MemberList as Allowed child nodetypes (refer figure 10).
Figure 10: Structure for 'TeamMembersPage'
After creating all necessary document types, the next step is to add content to the site.
## Add Content
Click on Content and select TeamMembersPage which is the root element of the site. Insert proper name for the content and click on Save and publish (refer figure 11 and 12).
Figure 11: Add content 'TeamMembersPage'
Figure 12: Save 'Team Member Page'
Next step is to create content under TeamMembersPage for inserting team member details.
Click on Content > Team Member Page then select MemberList, give a proper name to MemberList and click on Save and Publish (refer figure 13 and 14).
Figure 13: Add content 'MemberList'
Figure 14: Save content 'Team Members'
Next step is to insert details for the MemberList. Click on Content > Team Members, under Child Items tab click on Create and select MemberListing (refer figure 15).
Figure 15: Create 'MemberListing' elements
## Enter your Team details
After selecting MemberListing the following screen will be displayed with the properties like Member Photo, Member Name and Member Designation. Add required details in the appropriate fields and then click on Save and publish (refer figure 16).
Figure 16: Save Member Details
After the first record is created, the following screen is displayed which will list down all the records (refer figure 17).
Figure 17: List of records
Above steps are required to add the required content from Umbraco CMS administration tool and below is the code which will loop through the contents and display it on the site.
Right click **Partial Views** under **Settings** and select **Create** from the menu. In the **Create** dialog give the **Name** as **GenerateTeamMemberList** and set choose a snippet as Empty and click **Create** to create the Partial view and open its editor. Copy-paste the following code into the editor and click the **Save** button to save the partial view.
```
@inherits Umbraco.Web.Mvc.UmbracoViewPage
@using System.Collections;
@{
Layout = null;
var parent = Model.AncestorOrSelf(1);
List nodeIds = new List();
foreach (var page in parent.Children)
{
if (page.DocumentTypeAlias == "MemberList")
{
foreach (var child in page.Children)
{
nodeIds.Add(child.Id);
}
}
}
List slides = new List();
foreach (var nodeId in nodeIds)
{
if (nodeId != null)
{
var publishedContent = Umbraco.NiceUrl(Convert.ToInt32(nodeId));
if (!String.IsNullOrEmpty(publishedContent) && publishedContent != "#")
{
slides.Add(Umbraco.TypedContent(nodeId));
}
}
}
foreach (var slide in slides)
{
if (slide != null)
{
}
}
}
```
To use this partial view, include it in your TeamMembersPage using the following code.
```
@inherits Umbraco.Web.Mvc.UmbracoTemplatePage
@using ClientDependency.Core.Mvc;
@{
Layout = null;
}
```
## Published Team Members Page
Figure 18: Image displayed along with Text
You can use this approach to create a jQuery image carousel or a photo album.
## Related pages on Systenics
- [AI-powered listing description generation](https://www.systenics.com/auctionworx/ai-enhanced-listings-description-generation/)
## Need help implementing this for your business?
Our team helps plan, build, and scale marketplace and auction workflows. Explore [industry solutions](https://www.systenics.com/solutions/), [platform products](https://www.systenics.com/products/), and [custom development services](https://www.systenics.com/auctionworx/development-and-customization/) tailored to your goals.
[Book a quick consultation](https://outlook.office.com/bookwithme/user/231015685f21467da5ef6e3eb8b50240@systenics.com/meetingtype/hbYq2z1Hj0C2e7DuwBqdnw2?anonymous&ep=mcard).
---