Title: Customer Cloud Gallery – Google Drive &amp; Dropbox Image Gallery
Author: smartsteve
Published: <strong>Juny 6, 2026</strong>
Last modified: Setembre 24, 2026

---

Search plugins

![](https://ps.w.org/customer-cloud-gallery/assets/banner-772x250.png?rev=3563376)

![](https://ps.w.org/customer-cloud-gallery/assets/icon-256x256.gif?rev=3565077)

# Customer Cloud Gallery – Google Drive & Dropbox Image Gallery

 By [smartsteve](https://profiles.wordpress.org/smartsteve/)

[Download](https://downloads.wordpress.org/plugin/customer-cloud-gallery.1.16.1.zip)

 * [Details](https://bal.wordpress.org/plugins/customer-cloud-gallery/#description)
 * [Reviews](https://bal.wordpress.org/plugins/customer-cloud-gallery/#reviews)
 *  [Installation](https://bal.wordpress.org/plugins/customer-cloud-gallery/#installation)
 * [Development](https://bal.wordpress.org/plugins/customer-cloud-gallery/#developers)

 [Support](https://wordpress.org/support/plugin/customer-cloud-gallery/)

## Description

**Tired of subscribing to yet another photo service just to share galleries with
your clients?** Customer Cloud Gallery lets you deliver beautiful client photo galleries
straight from your own Google Drive or Dropbox — on your own WordPress site, with
no extra monthly fees.

Connect the Drive or Dropbox folder you already use, add the “Cloud Gallery” block(
or the Elementor widget, or a shortcode), and you get a fast, mobile-friendly gallery
with downloads, favorites and optional password protection. Your originals stay 
in the cloud; the plugin streams thumbnails and full-resolution files on demand —
so your site stays fast, your hosting disk stays empty, and there are no monthly
gallery-hosting fees and no per-gallery limits.

#### Who it’s for

 * **Photographers** delivering client work — wedding, portrait, family, event, 
   newborn, real-estate and product photography
 * **Studios & agencies** that want galleries on their _own_ domain and brand
 * **Schools, clubs & teams** sharing event photos with parents and members
 * **Anyone** who already keeps photos in Google Drive or Dropbox

#### What you get (Free)

 * **Google Drive _and_ Dropbox** — connect one or both; pick the folder per gallery
 * **Folder picker** — set your main folder once, then choose each gallery’s subfolder
   from a dropdown (no more copying folder URLs)
 * **Block editor & Elementor** — insert the “Cloud Gallery” block or Elementor 
   widget and pick your gallery from a list with a live preview; the shortcode still
   works in any other builder
 * **Fast lazy-loading grid** with full-screen lightbox, keyboard navigation and
   mobile swipe
 * **Client favorites** — visitors heart their picks and filter to just those
 * **Downloads done right** — single originals, a whole-gallery ZIP, or a visitor’s
   hand-picked selection as one streaming ZIP (multi-GB galleries work)
 * **Optional password protection** for client-only delivery — or keep it public
 * **GDPR-ready cookie control** — master on/off switch per gallery; visitors can
   clear their cookie
 * **Design options** — accent, hover and border colours
 * **Works with any theme and builder** — block, Elementor widget or shortcode, 
   no template editing

Your files never touch our servers — Drive/Dropbox are accessed with _your own_ 
OAuth credentials (see “External Services” below).

#### Earn money with Pro

**Don’t just save on fees — earn real money from your galleries.** The Pro print
shop lets your clients order professional prints right inside their gallery: you
set the formats, paper types, prices and shipping, and orders arrive by e-mail with
payment via PayPal or SEPA bank transfer. No marketplace commission, no card-processing
setup.

Pro also adds:

 * **Print shop** — clients order prints directly from each gallery, with full order
   management (New  Confirmed  Shipped)
 * **Title image** — a cover photo from the folder or your media library above the
   grid, with the gallery title and a subtitle on it, adjustable height, soft gradient
   and an edge-to-edge option
 * **Create galleries from the editor** — in the block or the Elementor widget, 
   pick a subfolder of your main folder and the gallery is created on the spot
 * **Automatic galleries (watch folder)** — new subfolders in your main folder become
   galleries automatically; a notice in the gallery list tells you what was created
 * **A page for every automatic gallery** — the watch folder clones a template page
   for each new gallery, with the block, Elementor widget or shortcode already pointed
   at it
 * **Chapters** — subfolders of the gallery folder become sections with headings
   and a jump navigation
 * **Layouts** — masonry, square grid or filmstrip besides the justified rows, plus
   spacing and corner radius per gallery
 * **Hover, captions & lightbox** — hover effect of your choice, file-name captions,
   light or dark lightbox with a thumbnail strip
 * **Watermark on previews** — your logo on every preview; downloads stay clean
 * **Visitor statistics dashboard** — page views, most-loved photos and top downloads,
   per gallery and per visitor
 * **CSV export** of client favourite selections — ideal for prepping an album or
   print run
 * **Priority support**

The Free plugin above is complete and fully functional on its own — Pro simply adds
the print shop, statistics and exports.

#### Get the most out of it

 1. Keep one Drive/Dropbox folder per client or event — the gallery mirrors it.
 2. Create a gallery, password-protect the page, and send your client the link.
 3. Switch on the Pro print shop to take print orders automatically.

#### Why cloud storage?

Uploading full-resolution galleries to your web server is slow, wastes disk quota,
and makes migration painful. With Customer Cloud Gallery the originals stay in Drive
or Dropbox — the plugin fetches thumbnails on first request, caches them locally,
and streams originals on demand. Server load is minimal even for 4K RAW previews.

#### Security

 * OAuth tokens are stored AES-256-CBC encrypted using WordPress’s AUTH_KEY
 * Per-gallery nonces prevent cross-gallery file access (IDOR protection)
 * All file-serving endpoints verify that the requested file actually belongs to
   the requested gallery
 * Download nonces expire after 24 hours
 * Cache directory blocks PHP execution and directory listing via `.htaccess`
 * Visitor cookies are `httponly` + `SameSite=Lax`

### External Services

This plugin connects to third-party services to deliver its core functionality. 
The connections are listed here so you can include them in your site’s privacy policy.

#### Google Drive API

Used only when the site administrator connects a Google Drive account in the plugin
settings. The plugin uses OAuth 2.0 credentials that you generate yourself in your
own Google Cloud Console — your data never passes through any server operated by
the plugin author.

What is sent: OAuth tokens, folder IDs and file IDs that you choose to display. 
No visitor data is transmitted.
 When: each time an admin browses folders in the
plugin, and on a scheduled cron to refresh thumbnail caches.

 * Service URL: https://www.googleapis.com/drive/v3/
 * Terms of Service: https://policies.google.com/terms
 * Privacy Policy: https://policies.google.com/privacy

#### Dropbox API

Used only when the site administrator connects a Dropbox account in the plugin settings.
Uses an OAuth app you register in your own Dropbox developer account.

What is sent: OAuth tokens, folder paths and file IDs that you choose to display.
No visitor data is transmitted.
 When: each time an admin browses folders, and on
a scheduled cron to refresh thumbnail caches.

 * Service URL: https://api.dropboxapi.com/
 * Terms of Service: https://www.dropbox.com/terms
 * Privacy Policy: https://www.dropbox.com/privacy

#### Freemius

The plugin uses the Freemius SDK to deliver license management for the optional 
Pro upgrade. Freemius is contacted only after the site administrator explicitly 
opts in during plugin activation. If you skip the opt-in, no data is sent to Freemius
and the Free version remains fully functional.

What is sent (only after opt-in): site URL, WordPress version, PHP version, plugin
version, an anonymized site identifier and — if a Pro license is activated — the
license key for validation.

 * Service URL: https://api.freemius.com/
 * Terms of Service: https://freemius.com/terms/
 * Privacy Policy: https://freemius.com/privacy/

### Privacy Policy

Customer Cloud Gallery stores the following data in your WordPress database:

**Visitor cookie (all visitors)**
 A random visitor ID is generated server-side 
on the first gallery visit and stored in a browser cookie. The cookie name is `wpg_visitor`(
the legacy name is kept since 1.12.1 so existing visitor favourites remain attached
to the correct cookie after the prefix-rename migration; everything else uses the
new `ccgal_` prefix). The cookie is valid for 365 days. Its value is a random hexadecimal
identifier with no relationship to any real-world identity, and is stored as-is 
in the database — there is no name, e-mail address, or plain-text IP address recorded
against it.

**Favourites**
 When a visitor hearts an image, the random visitor ID, the gallery
ID, and the cloud file ID are stored in the `wp_ccgal_favorites` table. No personal
data is included.

**Download tracking** _(Pro, if the statistics module is enabled per gallery)_
 
When the Pro statistics module is loaded and enabled per gallery, downloads are 
recorded in `wp_ccgal_downloads`: random visitor ID, gallery ID, file ID, download
type, and a salted SHA-256 hash of the visitor’s IP address. The original IP address
is never persisted — only the one-way hash, salted with the site’s `AUTH_SALT`. 
The Free plugin never writes to this table.

**Page-view tracking** _(Pro, if the statistics module is enabled per gallery)_

When the Pro statistics module is loaded and the per-gallery statistics sub-switch
is on, page and image views are recorded in `wp_ccgal_views`: random visitor ID,
gallery ID, file ID, salted IP-hash and timestamp. The Free plugin never writes 
to this table.

**Print orders** _(Pro, if the print shop is enabled)_
 Stores the customer’s name,
shipping address, e-mail address, optional phone number, optional message and the
ordered items in `wp_ccgal_orders` and `wp_ccgal_order_items`. This data is necessary
to fulfil the order and is retained until the site administrator deletes the order.

**Personal data export & erasure (WP Privacy Tool)**
 The plugin integrates with
the standard **Tools  Export Personal Data** and **Tools  Erase Personal Data** 
workflows. Print orders (Pro) are returned/erased by customer e-mail. Anonymous 
gallery favorites are, by design, not linkable to an e-mail address; the response
message will note this explicitly so the requester knows their cookie-based records
cannot be associated with their identity.

**Data deletion**
 In addition to the WP Privacy Tool above, site administrators
with the Pro statistics module can delete all tracking data for a specific visitor
from the Statistics dashboard. Removing the plugin via **Plugins  Delete** erases
all options, custom tables, gallery posts, and the thumbnail cache.

**Suggested privacy policy text**
 The plugin contributes a ready-made privacy policy
paragraph to **Tools  Privacy  Privacy Policy editor** that you can copy into your
public privacy page.

**No third-party transmission**
 No visitor data is sent to external servers by 
this plugin. Thumbnails are fetched from Google or Dropbox APIs using the _site 
administrator’s_ OAuth credentials — visitor sessions are never used for cloud API
calls.

**Photographer’s responsibility**
 If you use this plugin on your site you are the
data controller for your visitors’ data. You should inform your visitors about the
visitor cookie in your site’s privacy policy and, where required, obtain consent
before enabling statistics tracking (Pro module only).

## Screenshots

[⌊Frontend gallery grid — clients browse their photos with hover controls for favorites
and download⌉⌊Frontend gallery grid — clients browse their photos with hover controls
for favorites and download⌉[

Frontend gallery grid — clients browse their photos with hover controls for favorites
and download

[⌊Lightbox view — full-screen photo with keyboard navigation, mobile swipe and one-
click favoriting⌉⌊Lightbox view — full-screen photo with keyboard navigation, mobile
swipe and one-click favoriting⌉[

Lightbox view — full-screen photo with keyboard navigation, mobile swipe and one-
click favoriting

[⌊Print-order shop — clients pick formats and paper, place orders directly from 
the gallery (Pro)⌉⌊Print-order shop — clients pick formats and paper, place orders
directly from the gallery (Pro)⌉[

Print-order shop — clients pick formats and paper, place orders directly from the
gallery (Pro)

[⌊Gallery editor — pick a Google Drive or Dropbox folder, set password, get the 
shortcode⌉⌊Gallery editor — pick a Google Drive or Dropbox folder, set password,
get the shortcode⌉[

Gallery editor — pick a Google Drive or Dropbox folder, set password, get the shortcode

[⌊Visitor statistics dashboard — page views, top favorites, top downloads per gallery(
Pro)⌉⌊Visitor statistics dashboard — page views, top favorites, top downloads per
gallery (Pro)⌉[

Visitor statistics dashboard — page views, top favorites, top downloads per gallery(
Pro)

[⌊Print settings — configure formats, paper types, prices, shipping and payment 
options (Pro)⌉⌊Print settings — configure formats, paper types, prices, shipping
and payment options (Pro)⌉[

Print settings — configure formats, paper types, prices, shipping and payment options(
Pro)

## Blocks

This plugin provides 1 block.

 *   Cloud Gallery A photo gallery served from a Google Drive or Dropbox folder —
   with lightbox, favorites and downloads.

## Installation

 1. Upload the `customer-cloud-gallery` folder to `/wp-content/plugins/` or install
    via **Plugins  Add New  Upload Plugin**.
 2. Activate the plugin.
 3. Go to **Customer Cloud Gallery  Settings** and connect Google Drive or Dropbox (
    step-by-step OAuth wizard included).
 4. Create your first gallery under **Customer Cloud Gallery  Add New**.
 5. Copy the shortcode from the gallery editor (e.g. `[ccgal_gallery id="42"]`) and
    paste it into any page.
 6. Set a page password under **Page  Visibility  Password protected** to restrict 
    access.

#### Minimum Requirements

 * WordPress 6.2 or higher
 * PHP 7.4 or higher (8.1+ recommended)
 * PHP extensions: `openssl`, `gd` or `imagick`
 * Google Drive API credentials **or** a Dropbox app (free developer accounts work)

## FAQ

### Do my photos get uploaded to your servers?

No. Photos stay in your Google Drive or Dropbox account. The plugin only fetches
thumbnails (cached locally for performance) and streams originals on demand. No 
image data is sent to any third-party or plugin-developer server.

### Do I need a Google account or a Dropbox account?

Yes — at least one. You create a free OAuth app in Google Cloud Console or Dropbox
App Console (both free) and paste the credentials into the plugin settings. A step-
by-step guide is included.

### Can I use both Google Drive and Dropbox at the same time?

Yes. Connect both and choose the storage provider per gallery.

### Does it work with any WordPress theme?

Yes. The gallery is rendered in a self-contained shortcode block and does not depend
on theme templates or scripts.

### What happens if a visitor’s session lasts more than 24 hours?

Download nonces expire after 24 hours. The visitor needs to reload the page to get
a fresh nonce — the gallery itself remains accessible as long as the page session(
password cookie) is valid.

### Can I import existing Drive or Dropbox folders?

Yes — just paste the folder URL or folder ID when creating a gallery. The plugin
reads the folder contents via the cloud API.

### Does the print-order shop handle payment processing?

No direct card processing. Orders are sent by e-mail; payment is collected via PayPal.
me link or SEPA bank transfer details that you configure. This keeps the plugin 
PCI-DSS-free.

### Is this plugin GDPR compliant?

The Free plugin stores only a random visitor cookie ID, used to remember a visitor’s
favourites between page loads. No e-mail address, no IP address in plain text, no
third-party transmission. A cookie-control switch per gallery lets visitors opt 
out entirely. See the **Privacy Policy** section below for details.

## Reviews

![](https://secure.gravatar.com/avatar/4642a7243810c192568796f915e304b299c631fa54c690fbac849e10191a8bd7?
s=60&d=retro&r=g)

### 󠀁[A fantastic little pluging](https://wordpress.org/support/topic/a-fantastic-little-pluging/)󠁿

 [madmatt20002](https://profiles.wordpress.org/madmatt20002/) Juliol 16, 2026

We were looking for a plugin that would let us use images in dropbox folders as 
client galleries on our websites. A quick google found this plugin and it just worked!
The images load quickly and it has the appearance of a native gallery – but without
the storage overhead.The support is prompt and detailed – and they are open to listening
to feature requests and other suggestions.Looking forward to seeing how this plugin
grows!

 [ Read all 1 review ](https://wordpress.org/support/plugin/customer-cloud-gallery/reviews/)

## Contributors & Developers

“Customer Cloud Gallery – Google Drive & Dropbox Image Gallery” is open source software.
The following people have contributed to this plugin.

Contributors

 *   [ smartsteve ](https://profiles.wordpress.org/smartsteve/)
 *   [ Freemius ](https://profiles.wordpress.org/freemius/)

[Translate “Customer Cloud Gallery – Google Drive & Dropbox Image Gallery” into your language.](https://translate.wordpress.org/projects/wp-plugins/customer-cloud-gallery)

### Interested in development?

[Browse the code](https://plugins.trac.wordpress.org/browser/customer-cloud-gallery/),
check out the [SVN repository](https://plugins.svn.wordpress.org/customer-cloud-gallery/),
or subscribe to the [development log](https://plugins.trac.wordpress.org/log/customer-cloud-gallery/)
by [RSS](https://plugins.trac.wordpress.org/log/customer-cloud-gallery/?limit=100&mode=stop_on_copy&format=rss).

## Changelog

#### 1.16.1

 * Fixed: the “Pay now via PayPal” button in the order confirmation email now works
   when a PayPal email address is set in the print shop settings (not only a PayPal.
   Me name), and it passes the shop currency.
 * Fixed: toolbar buttons that should be hidden (“Load more”, “Download favorites”,“
   Download selection”, “Clear selection”) stayed visible without any function.
 * Fixed: a gallery inside a tab or accordion that is closed when the page loads(
   Elementor and other page builders) now lays out as soon as it is opened.
 * Fixed: clicking “Show favorites only” while images were still loading no longer
   leaves the view incomplete.
 * Fixed: umlauts and other non-ASCII characters in the gallery title are kept in
   the ZIP file name.
 * Fixed: in folders with more than 20,000 images, the images beyond that could 
   not be opened or downloaded.
 * Improved: the lightbox opens with the keyboard (Enter or Space on an image). 
   Focus stays inside the lightbox and returns to the image when it closes.

#### 1.16.0

 * New (Pro): layouts. Besides the justified rows, a gallery can now use a masonry
   grid, a square grid or a filmstrip that scrolls sideways — plus spacing between
   the images (0 px for a seamless mosaic) and a corner radius, all per gallery 
   in the editor.
 * New (Pro): hover effect (zoom, darken or none), file-name captions on hover or
   always, and a light or dark lightbox with an optional thumbnail strip for quick
   navigation — per gallery in the editor.
 * New (Pro): watermark. Put your logo on every preview — grid and lightbox — with
   position, size and opacity of your choice. Downloads stay clean: they stream 
   the original file, never the watermarked preview.
 * New (Pro): chapters. Turn it on in the gallery editor and every subfolder of 
   the gallery folder becomes its own section with a heading — “Getting ready”, “
   Ceremony”, “Party” — with a jump navigation above the grid. Photos in the folder
   itself come first; a leading number in a folder name (“01 …”) sets the order 
   and is not shown. Favorites, the lightbox and downloads work across all chapters,
   and “Download all” keeps the chapters as folders inside the ZIP.
 * New (Pro): the watch folder can now create a page for every new gallery as well—
   a copy of a template page of your choice, with its Cloud Gallery block, Elementor
   widget or shortcode pointed at the new gallery. Title and status follow the gallery(
   draft or published). The template’s password is deliberately not copied, so each
   client gets their own.
 * Fixed: single-image downloads pause while a ZIP download is running, with a short
   note — instead of silently breaking the running archive.
 * Fixed: no more “textdomain loaded too early” notice in the debug log after activating
   the plugin. The folder-watch cron schedule is now registered on init, and the
   print-order page is created on the first request after activation instead of 
   inside the activation hook.
 * Fixed: after activation, the welcome redirect landed on the gallery list instead
   of the settings page (HTML-escaped redirect URL).

#### 1.15.2

 * The box in the gallery sidebar is now called “Add to a page” and lists all three
   ways to show a gallery: the block, the Elementor widget and the shortcode. It
   used to be called “Shortcode”, which hid the block from exactly the people looking
   for a way around shortcodes.
 * New: a one-time pointer in the gallery list and in the gallery editor points 
   at that box, so the block and the Elementor widget also reach people who dismissed
   the update notice.
 * Fixed: in the title image settings, a label could stay at the end of one line
   while its dropdown moved to the next.

#### 1.15.1

 * Fixed: an “&”, an apostrophe or quotation marks in a gallery title were shown
   as HTML code — “Anna & Tom” appeared as “Anna & Tom”. This affected the preview
   card in the block editor, the title image above a gallery, the gallery pickers
   in the block and in the Elementor widget, the gallery list, the statistics dashboard,
   print-order emails and the order CSV export.
 * Fixed: the folder inside a bulk-download ZIP carried the same HTML code in its
   name.

#### 1.15.0

 * New (Free): “Cloud Gallery” block for the block editor. Pick a gallery from a
   list; the editor shows a preview card with the first images, the page shows the
   full gallery. Wide and full alignment supported.
 * New (Free): Elementor widget “Cloud Gallery” with loading-mode and image-size
   overrides. Galleries initialise inside the Elementor editor preview.
 * New (Pro): create galleries from the editor. In the block and in the Elementor
   widget, choose a subfolder of your main folder and the gallery is created on 
   the spot (title taken from the folder name, editable). An existing gallery for
   that folder is reused.
 * New (Pro): title image. Each gallery can show a cover photo above the grid — 
   from the gallery folder or the media library — with the gallery title and a subtitle
   on it, adjustable height and image focus, a soft gradient or darkened overlay,
   at content width or edge to edge.
 * New: after the update, a one-time “What’s new” note on the plugin’s own admin
   pages lists the new features with a link to the documentation.
 * The gallery editor’s shortcode box now also points to the block and the Elementor
   widget.
 * New (Free): folder picker. Set a main folder once under Settings  “Main folder”,
   then choose each gallery’s cloud folder from a dropdown in the gallery editor—
   no more copying folder URLs or typing paths. Works for Google Drive and Dropbox.
 * New (Pro): automatic galleries (“watch folder”). The plugin watches your main
   folder and creates a gallery for every new subfolder — title taken from the folder
   name, settings copied from a template gallery of your choice, created as draft(
   or published directly); a notice in the gallery list tells you what was created.
   Existing folders are only registered when you enable the feature, so nothing 
   is created retroactively. Includes a “Scan now” button; opening the gallery list
   also triggers a check.
 * The new subfolder listing endpoint requires the manage-options capability (like
   the existing folder check), keeping private cloud folder names restricted to 
   administrators.
 * New (Free): “Test connection” button on the settings page for each connected 
   provider. It checks the whole chain step by step — access token, folder listing,
   a real image download and the thumbnail cache folder — and gives a plain-language
   hint for anything that fails (e.g. a Dropbox app missing the files.content.read
   permission, or “App folder” access instead of “Full Dropbox”).
 * New: Pro features are now shown greyed out with a “PRO” badge where they would
   live (print orders and visitor statistics in the gallery editor, automatic galleries
   in the settings), so it is clear what the upgrade adds. The free plugin is unchanged.
 * New: after two weeks of use with at least one published gallery, a small, dismissible
   note on the plugin’s own admin pages asks for a WordPress.org review — with “
   Maybe later” (30-day snooze) and “Don’t ask again”, remembered per user.
 * Freemius SDK updated to 2.13.4 (configurable API timeout, PHP deprecation fixes).
 * Fixed: ZIP download filenames no longer contain HTML entities when the gallery
   title has an apostrophe or special characters (e.g. “It’s_a_Madhouse.zip” is 
   now “It’s_a_Madhouse.zip”).

#### 1.13.5

 * Fixed: ZIP downloads finally open correctly in macOS Archive Utility. Root cause
   found by analysing an affected customer’s actual ZIP file: the archive’s end-
   of-file record declared the table of contents as 0 bytes long, so macOS found“
   no readable items” while more tolerant tools opened the same file fine. The size
   was read from a memory buffer after it had already been handed off to the download
   stream. Affected every streaming bulk download since 1.13.2, regardless of gallery
   size. Huge thanks to Chris Tess for the persistent testing that made this diagnosis
   possible.
 * Fixed: the server-side ZIP fallback (used for very large galleries when the browser
   download path is unavailable) now also writes each entry’s size and checksum 
   before the data, making its archives readable by strict sequential extractors,
   and no longer declares ZIP64 for ordinary entries. Failed files are skipped cleanly
   instead of leaving a broken entry in the archive.

#### 1.13.4

 * Fixed: ZIP downloads still could not be opened with the built-in Archive Utility
   on macOS (“the archive is empty or contains no readable items”), even after the
   fix in 1.13.3 — there were two separate causes and only the first one was addressed.
   Entries were marked as coming from a Unix system but carried no file type and
   no permissions, so macOS did not recognise anything readable inside. Every entry
   is now stored as a regular file with normal read permissions. Applies to all 
   bulk downloads (all images, selection, favorites).

#### 1.13.3

 * Fixed: ZIP downloads could not be opened with the built-in Archive Utility on
   macOS, which reported the archive as empty, while other tools (e.g. The Unarchiver)
   opened the same file correctly. Each entry’s size and checksum are now written
   directly into its local header instead of being appended after the data, so extractors
   that read the archive sequentially can open it. Affects all bulk downloads (all
   images, selection, favorites). Thanks to Chris Tess for the detailed report.

#### 1.13.2

 * Bulk download: downloading a whole gallery (or a selection) now saves a regular
   ZIP file straight to your Downloads folder in every modern browser — no more 
   folder-permission prompt in Chrome/Edge. The streaming download path (no memory
   limit, works for multi-GB galleries) was previously disabled by an overly strict
   internal check and never actually ran; Firefox and Safari were silently limited
   to in-memory ZIPs (max ~1.8 GB, iOS 500 MB) or the slow server fallback. The 
   folder-picker mode remains available as an automatic fallback.

#### 1.13.1

 * Bulk download (all / selection / favorites): a ZIP is no longer presented as “
   done” when files failed to download. If nothing could be retrieved the download
   is cancelled with a clear error instead of saving an empty ZIP, and partial results
   now report exactly how many of how many files are missing.
 * Bulk download: permanent errors (e.g. an expired security token) no longer cause
   three slow retries per file, so a broken download fails fast instead of slowly
   producing an empty archive. Added flow-control to the streaming-ZIP service worker
   to keep memory bounded on very large (multi-GB) downloads.
 * Security: the admin image/video preview endpoints and the folder-validation endpoint
   now require the “manage options” capability (previously “edit posts”), so lower-
   privileged users cannot probe the connected Drive/Dropbox account. Raw storage-
   provider error messages are no longer echoed to the browser (they are logged 
   when WP_DEBUG is enabled).
 * Drive/Dropbox: a single visitor can no longer trigger repeated full folder re-
   listings by probing random file IDs (folder refresh is now rate-limited), protecting
   your cloud API quota; and a temporary API error no longer hides a real image 
   for several minutes.
 * ZIP archives now carry the UTF-8 filename flag, so names with umlauts or accents(
   e.g. “Müller_001.jpg”) extract correctly in Windows Explorer.
 * Privacy / GDPR: personal-data export and erasure for print orders now depend 
   on whether order data exists, not on the Pro licence state, so a downgraded site
   still fulfils data requests. The uninstaller now also removes the Pro statistics
   tables.
 * Performance (Pro): the statistics tables are no longer re-checked with dbDelta
   on every request, and a new composite index speeds up view de-duplication.
 * Frontend fixes: marking a favorite no longer flips the heart on a failed request;
   the lightbox no longer re-opens after being closed mid-load; the “show all favorites”
   view no longer retries endlessly on a network error; the images-per-batch setting
   is clamped to a sane range; the “Clear cache” button now also clears the cached
   folder listings.
 * Pro admin fixes: the inline statistics toggle no longer shows a green “saved”
   tick when the server rejected the change (e.g. with cookies disabled); the order-
   status dropdown reverts and warns if saving fails; paper-price-list rows no longer
   overwrite each other after a row is deleted; renaming a price-list key no longer
   silently detaches it from the formats that use it.
 * Additional stability fixes: stable visitor-table ordering, defensive guards on
   Dropbox API responses, and folder validation no longer overwriting text while
   you are still typing.
 * Image cache: thumbnails and previews are now downloaded to a temporary file first
   and moved into the cache atomically (both the direct-thumbnail and the resize
   fallback path). Previously a PHP process killed mid-download (timeout, traffic
   spike) could leave an empty or truncated image behind that was then served forever;
   such stale entries now heal themselves on the next request, and transfers that
   deliver fewer bytes than announced are detected and discarded.
 * Statistics (Pro): top-list entries whose file no longer exists in the connected
   cloud folder are labelled “No longer in the cloud folder” instead of opening 
   an empty tab.

#### 1.13.0

 * Security hardening: unpublished galleries (draft, private, pending, trashed) 
   can no longer leak original files. The publish-status guard now covers the single-
   file, ZIP and manifest download endpoints as well as the batch, favorite, order
   and print-format REST routes. Logged-in editors with access to the gallery are
   unaffected.
 * Performance: per-gallery statistics are now memoized per request, cutting redundant
   database queries on the gallery list and detail pages; the cloud folder listing
   is cached in a short-lived transient so concurrent visitors and infinite-scroll
   requests collapse to a single Drive/Dropbox API call per page instead of one 
   call per view.
 * Dropbox galleries now honour the gallery’s sort order and “images per page” setting:
   the Dropbox folder listing is sorted (natural name, name, or date — ascending/
   descending) and paginated consistently, so the grid order and the ZIP order match.
   This brings Dropbox in line with the existing Google Drive behaviour.
 * The bundled German (de_DE) translation loads again on self-hosted and Pro installations(
   the textdomain loader was restored on the init hook). Sites served a translation
   through WordPress.org language packs are unaffected; the language pack still 
   takes precedence when present.
 * Fixes: Dropbox statistics detail-page thumbnails and full-size links now resolve
   correctly; the statistics fetch limit was raised from 30 to 50 with an honest
   item-count badge.
 * Pro statistics detail page UX refactor: the per-gallery statistics page is now
   collapsible and scales cleanly to galleries with thousands of images. Each of
   the four top-lists (Top Favorites, Top Viewed, Top Downloaded — single, Top Downloaded—
   selection) is wrapped in a native HTML5 `<details>` element with the item count
   visible in the header even when collapsed. Each section has a per-section limit
   dropdown (5/10/25/50/All, default 10). The visitor activity table now uses true
   pagination (25 per page default) so that galleries with hundreds of visitors 
   no longer produce a 10,000-pixel-long scroll page.
 * Pro inline toggles in the gallery list (WP-Admin  Customer Cloud Gallery  All
   galleries): two new checkbox columns let you flip a gallery’s Statistics-tracking
   and Print-shop on or off without entering the gallery editor. Each checkbox saves
   via its own per-gallery-scoped AJAX endpoint with nonce + capability check; optimistic
   UI feedback, server-authoritative state correction, screen-reader friendly (each
   checkbox has an aria-label naming the gallery; the disabled-reason for Stats 
   when cookies are off is reachable by keyboard). The Stats toggle correctly mirrors
   the existing master-cookies dependency — when cookies are off for a gallery, 
   the Stats sub-switch is locked off too.
 * Pro stats “unique_visitors” consistency fix carried over from the 1.12.2 hotfix:
   the top-card counter now counts distinct cookies across all activity tables (
   views ∪ favorites ∪ downloads), matching the “Besucheraktivität” table below.
 * Pro stats deletion fix carried over from the 1.12.2 hotfix: “Reset tracking data”
   and per-visitor “Daten löschen” now also clear favorites in addition to views
   and downloads.

#### 1.12.2

 * wp.org Plugin Directory review compliance (round 3):
 * cURL  WordPress HTTP API: the four remaining cURL call sites in `includes/class-
   dropbox-adapter.php` (`download_to_file`, `stream_to_output`, `download_thumbnail`)
   and `includes/class-google-drive-adapter.php` (`stream_to_output`) have been 
   fully ported to `wp_remote_request()` / `wp_remote_get()` with `stream => true`.
   File downloads write directly to disk via the WordPress HTTP API (no PHP memory
   buffering); the streaming-to-browser cases stream the response body to a WordPress
   temp file via `wp_tempnam()` and then echo it back in 64 KB chunks, with HTTP
   206 Range support preserved by forwarding the `Range` header. The Dropbox content-
   type issue is solved by sending `Content-Type: application/octet-stream`, which
   Dropbox accepts on `/files/download` and `/files/get_thumbnail_v2`. The plugin
   no longer contains a single `curl_*()` or `CURLOPT_*` reference in its own code;
   only the Freemius licensing SDK in `vendor/` still uses cURL, which the Plugin
   Review Team’s guidelines explicitly permit for third-party vendor libraries.
 * Plugin Assets handbook compliance: verified that no `banner-*.{png,jpg}`, `icon-*.{
   png,jpg,svg}`, `screenshot-*.{png,jpg}`, `blueprints/` or `header.png` files 
   exist in the plugin ZIP, and that all plugin-resource references use the dynamic
   functions `plugins_url()` / `plugin_dir_path()` / `plugin_dir_url()` (via the`
   CCGAL_URL` / `CCGAL_DIR` constants) rather than hardcoded `/wp-content/plugins/...`
   paths. Listing assets (banner, icon, screenshots) are prepared in the source 
   repository under `.wordpress-org/` for deployment to the SVN `/assets/` root 
   after approval — they are deliberately excluded from the plugin ZIP per the Plugin
   Assets handbook.
 * Video files in cloud folders are temporarily excluded from gallery listings (
   image files only). The in-browser video player and the related streaming endpoint
   are not exercised by visitors in 1.12.2. Video support will be re-introduced 
   in a later release; existing video files in connected Drive/Dropbox folders are
   not touched, only hidden from the gallery output.
 * Pro statistics tracking improvements:
    - The JS-level `state.viewedInLightbox` Set in `assets/js/gallery.js` is now
      cleared when the lightbox closes, so a visitor who closes the lightbox and
      reopens the same image is counted as a new engagement (the server-side 10-
      minute dedup window still applies on top of this — see below).
    - `$wpdb->insert()` calls in `record_view`, `record_image_view` and `record_download`
      now log to `error_log()` if the insert fails (gated on `WP_DEBUG`), so future
      silent-skip failures are observable instead of being swallowed by a 200 OK
      response.
    - Server-side dedup windows are unchanged: 1 hour per (gallery, visitor) for
      page-loads, 10 minutes per (gallery, file, visitor) for lightbox image-opens.
      These are appropriate for both client-delivery galleries and public-page galleries(
      suppresses bot crawl + reload-spam without losing legitimate re-engagement).
 * Pro stats deletion fix (`includes/class-dashboard__premium_only.php`): the “Reset
   tracking data” button on the gallery detail page AND the per-visitor “Daten löschen”
   button now correctly delete favorites in addition to views and downloads. Previously
   the favorites table was untouched, so the UI promise (“Deletes all favorites,
   downloads and views”) was not honoured and the per-visitor delete looked like
   a no-op when the visitor had only favorited images and no other activity.
 * Pro stats “Eindeutige Besucher” consistency fix (`includes/class-tracking__premium_only.
   php::get_gallery_stats`): the top-card counter now counts distinct cookies across
   ALL activity tables (views ∪ favorites ∪ downloads), not just page-load views.
   Previously the counter only saw visitors who had a `file_id IS NULL` row, so 
   visitors whose page-load was suppressed by the 1-hour dedup window or who arrived
   via a full-page cache (no PHP execution) — and only triggered AJAX-based image-
   views or downloads — were invisible to the top counter even though they correctly
   appeared in the “Besucheraktivität” table below. Both numbers now agree.

#### 1.12.1

 * wp.org Plugin Directory review compliance (round 2):
 * Statistics module fully extracted from the Free build. The tracking class, stats
   tables, the stats sub-switch UI, the views/downloads admin columns, the view/
   image-view REST endpoints and all download-recording call sites have been removed
   from the Free codebase and consolidated into a single Pro-only file (`class-tracking__premium_only.
   php`). Free has zero stats footprint on disk; Pro hooks into the Free build via
   generic action/filter names (e.g. `ccgal_download_completed`, `ccgal_gallery_deleted`,`
   ccgal_uninstall_tables`) so the Free code stays decoupled.
 * Frontend JS Stats-Reste removed: the previous `recordView()`/`recordImageView()`
   functions and the `trackBulkComplete()` beacon are gone. The Free `gallery.js`
   now only dispatches generic `ccgal:gallery-opened` / `ccgal:image-opened` CustomEvents;
   the bulk-download helper calls a renamed `notifyBulkCompleted` ping to a `ccgal_notify_bulk_complete`
   AJAX endpoint. None of those reach a database table in Free.
 * Prefix refactor: every declared name (constants, classes, functions, hook names,
   option keys, post-meta keys, table names, AJAX/admin-post action slugs, CSS classes,
   custom properties, JS globals, script/style handles, REST namespace, custom HTTP
   header, cache directory and the gallery post-type slug) has been renamed to the
   5-character `ccgal_`/`CCGAL_`/`ccgal-` prefix to comply with the wp.org “prefix
   must be over 4 characters” rule. The browser visitor cookie keeps its legacy 
   name `wpg_visitor` so existing visitor favourites remain attached after the migration—
   the only intentional exception.
 * Database migration: an idempotent activation-time routine renames all WP options,
   post-meta keys, the gallery post type, the custom tables (favorites, orders, 
   order_items + Pro: views, downloads), the leading-underscore `_system_page` meta
   marker, the daily cron event and the thumbnail cache directory. The routine excludes
   its own version-marker option from the bulk rename (so the guard can still be
   read on a re-activation if anything below crashes), extends `set_time_limit(300)`
   for large postmeta tables, and writes a transient admin notice if a `RENAME TABLE`
   fails (e.g. missing ALTER permission on shared hosting). Shortcodes in existing
   post_content are rewritten in place (`[ccg_gallery]`, `[hochzeitsgalerie]`, `[
   customer_cloud_gallery]`  `[ccgal_gallery]`; same for the print variant). The
   migration guards against re-runs via the legacy/new db-version markers.
 * Security: the public AJAX endpoints `ccgal_serve_image` and `ccgal_stream_video`
   now require a gallery-scoped nonce (`ccgal_gallery_<id>`) issued by the gallery
   renderer, in addition to the existing file-in-folder check. Draft / private /
   trashed galleries are rejected on the public branch unless the caller has `edit_post`
   capability. `$_SERVER['HTTP_RANGE']` is now unslashed and length-capped before
   the strict `preg_match` validator. `$_COOKIE['wpg_visitor']` is now sanitized
   through a hex-only whitelist matching the generator. `$_REQUEST['gallery']`, `
   $_REQUEST['count']` and the array-branch of `$_REQUEST['files']` are now consistently`
   wp_unslash()`-ed before further sanitization. `json_decode()` of the `_REQUEST['
   files']` payload runs with `depth=4` so a JSON bomb cannot DoS the file-IDs parser.
 * The `Plugin URI` header has been removed from the main plugin file because the
   SSL certificate for the linked domain is not yet provisioned. The Author URI 
   is unaffected.

#### 1.12.0

 * Faster bulk-download for the “Download all images” button. The button now picks
   the best path automatically: (1) in browsers with the File System Access API (
   Chrome/Edge/Opera) the visitor picks a target folder and the photos are written
   there directly, fetched in parallel (6 connections); (2) on Firefox/Safari/HTTPS
   sites a service-worker-backed streaming ZIP is built in the browser — no RAM 
   limit, multi-GB galleries work without buffering; (3) small galleries can fall
   back to a single in-memory ZIP blob; (4) the existing server-streaming ZIP remains
   as the last-resort fallback. Across realistic gallery sizes this typically reduces
   wait time by 4–6× on the parallel paths because the server is no longer the single-
   threaded bottleneck. The hard listing limit per gallery raised from 5,000 to 
   25,000 files. New endpoint `ccgal_download_manifest` exposes the gallery’s file
   list (JSON: id/name/size) under the same gallery-scoped nonce; a separate completion
   endpoint (renamed to `ccgal_notify_bulk_complete` in 1.12.1) fires a single `
   ccgal_download_completed` action when the client-side ZIP is finished, so extension
   modules can react without per-file inserts. New `assets/js/sw-zip.js` service
   worker is registered on demand from the gallery scope and only activated when
   the bulk-download button is used. Manifests are cached as 60-second transients
   per gallery to protect Drive/Dropbox API quota against repeated clicks. The legacy`
   ccgal_download_zip` endpoint is unchanged.
 * Selection ZIP download moved from Pro back to Free — visitors of any gallery 
   can now pick specific images and download them as a single ZIP without a Pro 
   licence.
 * Code structure: Pro-only PHP files renamed with the `__premium_only.php` suffix
   so the Free build no longer ships any Pro implementation code. Inline `<script
   >` blocks moved out of PHP into proper enqueued asset files for better caching
   and CSP compatibility.
 * Shortcode refactor for wp.org review compliance: the deprecated `customer_cloud_gallery`
   and `customer_cloud_gallery_print` shortcodes have been removed. The new prefixed
   shortcodes `[ccgal_gallery]` and `[ccgal_print]` are now the only supported names.
   Existing pages are automatically migrated on plugin update — the post content
   is rewritten in place once, so no user action is required.

#### 1.11.8

 * Phases 1 + 2 of Plugin Check sweep for wp.org compliance: replaced `unlink()`
   with `wp_delete_file()` in cache, adapters and uninstaller; switched DOS-timestamp
   generation in the ZIP streamer from `date()` to `gmdate()` to avoid runtime-timezone
   side effects; added missing `translators:` comments on plural and placeholder
   strings in dashboard and orders admin; reordered placeholder example text to 
   use positional `%1$s/%2$s` syntax; rewrote `printf( esc_html__( "…#%d" ), $id)`
   patterns in email templates and admin notices as `echo esc_html( sprintf( __("…"),
   $id ) )` so the placeholder substitution is itself escaped.
 * Phase 3 of the Plugin Check sweep: annotated three SQL false-positives where 
   the static analyzer cannot follow `$wpdb->prepare()` results across an assignment(
   visitor-stats aggregation in `class-tracking.php` and the orders CSV-export query
   in `class-orders.php`). The CSV-export ternary was also split into a clean `if/
   else` so each branch can carry its own technical justification; behaviour is 
   unchanged.
 * Phase 4 (filesystem operations): annotated `php://output` streams in CSV export
   handlers (`class-orders.php`, `class-dashboard.php`) and best-effort cache hygiene
   calls (`@touch`, `@rename` in `class-cache.php`). The Dropbox adapter’s paired`
   fopen`/`fclose` around cURL `CURLOPT_FILE` are documented inline since cURL requires
   a real PHP file pointer. Uninstaller `rmdir()` calls were already annotated in
   1.11.6.
 * Phase 5 (cURL  WP HTTP API): migrated `class-google-drive-adapter.php::get_media_download_url`
   to `wp_remote_head()` (HEAD with `redirection => 0` to read the Location header).
   All remaining cURL calls — Drive `stream_to_output`, Dropbox `download_to_file`/`
   stream_to_output` / `download_thumbnail` — are kept and annotated with technical
   reasons: WP HTTP API has no streaming-write callback (CURLOPT_WRITEFUNCTION) 
   and Dropbox content endpoints require an empty Content-Type header that `wp_remote_post()`
   cannot send. Migrating these to WP HTTP API would have forced double I/O via 
   temp files for every gallery download.
 * Phase 6 (Plugin Check warnings): added file-level `phpcs:disable` blocks with
   technical justifications across `class-tracking.php`, `class-orders.php`, `class-
   print-settings.php`, `class-rest-api.php`, `class-admin.php`, `class-downloads.
   php`, `class-print-page.php`, `class-google-oauth.php`, `class-dropbox-oauth.
   php`. Direct database queries on plugin-owned custom tables (wp_ccgal_orders,
   wp_ccgal_order_items, wp_ccgal_views, wp_ccgal_favorites, wp_ccgal_downloads)
   are by design — they are not cached because they are written and read inside 
   the same request lifecycle. Nonce-verification suppressions on read-only listing/
   sort/filter parameters are paired with concrete justifications. OAuth callbacks
   use the OAuth `state` parameter instead of WordPress nonces (a session-bound 
   nonce cannot survive a redirect through Google/Dropbox). Outbound `wp_redirect()`
   calls (OAuth auth endpoint, signed Drive media URLs) are kept because `wp_safe_redirect()`
   would block external hosts. Added missing `wp_unslash()` calls on `$_COOKIE['
   ccgal_visitor']` and `$_SERVER['REMOTE_ADDR']` in `class-tracking.php` and `class-
   print-rest.php`.
 * Code review follow-ups (small but real fixes surfaced while preparing the wp.
   org submission):
    - Visitor-IP hashing (`class-tracking.php::ip_hash`, `class-print-rest.php::
      get_visitor_id`) now uses `filter_var( …, FILTER_VALIDATE_IP )` instead of`
      sanitize_text_field` — `sanitize_text_field` strips `%xx` sequences and would
      mangle IPv6 zone-id syntax (e.g. `fe80::1%eth0`).
    - `class-google-drive-adapter.php::get_media_download_url` now handles the case
      where `wp_remote_retrieve_header()` returns an array of duplicate Location
      headers (rare but possible behind some CDN layers); previously the array would
      be cast to the literal string “Array” and the call would falsely return `ccgal_bad_location`.
    - REST media-cache redirects in `class-rest-api.php::serve_image` now use `wp_safe_redirect()`
      instead of `wp_redirect()` — the targets are same-origin cache URLs, so the
      safer redirect is appropriate.
 * PayPal checkout improvements (surfaced during pre-submission smoke testing):
    - PayPal.Me URL now appends the configured currency code (e.g. `paypal.me/USERNAME/
      25.00EUR`). Previously the link omitted the currency, so PayPal would default
      to the receiver’s account currency (often USD for new accounts), forcing customers
      to pay in the wrong currency.
    - Order-confirmation screen now shows a PayPal-specific memo hint instead of
      the generic SEPA “Verwendungszweck” string: “Important: PayPal does not transfer
      order numbers automatically. On the PayPal page, please enter #1234 in the
      note/memo field so we can match your payment to your order.” PayPal.Me cannot
      pass an order reference programmatically, so the manual hint is the correct
      workaround for the free-tier shop.
    - The PayPal payment-method radio button label changed from “PayPal (paypal.
      me)” to simply “PayPal” since the field now also supports email-based PayPal
      Standard payments (not just paypal.me). Existing text-overrides for the old“
      PayPal (paypal.me)” string become orphaned and need to be re-set against the
      new “PayPal” msgid if a custom label was configured.
    - PayPal payment target field now accepts BOTH a PayPal.Me username AND a PayPal
      email address. The form auto-detects which mode applies on submit: an “@” 
      in the value switches to PayPal Standard “Buy Now” (_xclick), which works 
      with any PayPal account and additionally passes the order number to PayPal
      as the item description — the seller sees “Order #1234” directly in the PayPal
      payment record, no manual memo required. Without “@” the form continues to
      use PayPal.Me as before. The previous email warning has been replaced by a
      green “Email mode active” notice in Settings.
    - Removed the redundant “PayPal label in form” and “Bank-transfer label in form”
      custom-text settings. They duplicated functionality provided by the dedicated
      Text Overrides system (Settings  Text overrides) and could be misconfigured
      by accidentally entering an email address as the button label, which would
      then appear as the visible payment-method label in the checkout (e.g. “tes@
      er.com” instead of “PayPal”). The two payment buttons now always render with
      the standard, translatable defaults (“PayPal (paypal.me)” / “Bank transfer(
      advance payment)”); existing stored values are ignored, and the existing Text
      Overrides UI can still customize the labels via the i18n string-replacement
      path.
 * Fix: text-override fields could not be cleared once a value had been entered.
   Previously the JS auto-filled the default text whenever the field became empty,
   which created an infinite loop — every Backspace immediately re-inserted the 
   default. The placeholder attribute already shows the default visually, so the
   auto-fill is unnecessary and has been removed; clearing a field now simply clears
   the override on save.
 * UX: Drive and Dropbox step-by-step setup guides (the collapsed accordions on 
   the first-run welcome panel) are now also available directly in the Settings 
   page provider sections, so a returning user who connects a …

## Meta

 *  Version **1.16.1**
 *  Last updated **16 hores ago**
 *  Active installations **60+**
 *  WordPress version ** 6.2 or higher **
 *  Tested up to **7.1.2**
 *  PHP version ** 7.4 or higher **
 *  Language
 * [English (US)](https://wordpress.org/plugins/customer-cloud-gallery/)
 * Tags
 * [Dropbox](https://bal.wordpress.org/plugins/tags/dropbox/)[gallery](https://bal.wordpress.org/plugins/tags/gallery/)
   [google drive](https://bal.wordpress.org/plugins/tags/google-drive/)[photo gallery](https://bal.wordpress.org/plugins/tags/photo-gallery/)
   [photography](https://bal.wordpress.org/plugins/tags/photography/)
 *  [Advanced View](https://bal.wordpress.org/plugins/customer-cloud-gallery/advanced/)

## Ratings

 5 out of 5 stars.

 *  [  1 5-star review     ](https://wordpress.org/support/plugin/customer-cloud-gallery/reviews/?filter=5)
 *  [  0 4-star reviews     ](https://wordpress.org/support/plugin/customer-cloud-gallery/reviews/?filter=4)
 *  [  0 3-star reviews     ](https://wordpress.org/support/plugin/customer-cloud-gallery/reviews/?filter=3)
 *  [  0 2-star reviews     ](https://wordpress.org/support/plugin/customer-cloud-gallery/reviews/?filter=2)
 *  [  0 1-star reviews     ](https://wordpress.org/support/plugin/customer-cloud-gallery/reviews/?filter=1)

[Your review](https://wordpress.org/support/plugin/customer-cloud-gallery/reviews/#new-post)

[See all reviews](https://wordpress.org/support/plugin/customer-cloud-gallery/reviews/)

## Contributors

 *   [ smartsteve ](https://profiles.wordpress.org/smartsteve/)
 *   [ Freemius ](https://profiles.wordpress.org/freemius/)

## Support

Got something to say? Need help?

 [View support forum](https://wordpress.org/support/plugin/customer-cloud-gallery/)